[an error occurred while processing this directive]
Задачка для разминания мозгов... Про биквады...
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено homekvn 17 января 2006 г. 17:13

Вот сижу и думаю. Надо сделать биквад с называемой возможностью фэйдинга. Объясню по-русски.

Бывает так, что в ходе обрабоки аудио (и не только аудио) сигнала необходимо изменить коэффициенты биквада (ну, например, был у нас НЧ-фильтр с частотой среза 300 Гц, а надо переключить его в некоторый момент времени на частоту 1000 Гц). Если сразу переключить, будет слышен щелчок (так называемый "плоп"). Поэтому надо менять по-тихоньку (скажем в продолжение одной секунды).

Но вот проблемка. Если изменять коэффицинеты линейно (или по какому-нибудь другому закону), то возможно следующее: если коэффициенты знаменателя передаточной функции (в области z) биквада в процессе перехода станут такими, что один или оба корня знаменателя станут по модулю больше единицы, то такой фэйдинг сделает только хуже, ибо фильтр на короткое время потеряет устойчивость, что станет сразу же заметно на слух.

Если же попытаться во время перехода изменять плавно частоту(-ы) среза(т.е. более обще, плавно изменяя начальные параметры фильтра, по которым этот фильтр был рассчитан), то пересчитывать фильтр на каждом шаге перехода будет слишком накладно, ибо в реал-тайме может работать одновременно слишком много биквадов, и изменения могут потребовать почти все и сразу. - Процессор захлебнется.

Для себя я нашел пока только два способа решить эту проблему: один - непроверенный, взятый с потолка, моим колегой; второй - мой.

Первый способ заключается в проверке (привожу фрагмент кода)

if ((coefs[0] + coefs[2]) > 0.9999999)
{
coefs[2] = 0.9999999 - coefs[0];
}

if ((coefs[0] + coefs[2]) > -0.9999999)
{
coefs[2] = -0.9999999 - coefs[0];
}

Нет никаких обоснований, что будет всегда корректно работать. А главное, что во время перехода звук будет всегда приемлемый.

Идея второго способа, который я для себя нашел, но который пока еще не настроил заключается в том, чтобы рассчитать полюсы в начальном и в конечном (целевом) состоянии биквада. А дальше двигать полюсы, от одного состояния к другому (при этом мы всегда будем находиться внутри единичной окружности, а, следовательно, делать проверку устойчивости не нужно). Имея полюсы во время каждого перехода, мы можем легко перейти к коэффициентам фильтра. Но здесь еще нужно немало поработать, поскольку надо решить,как корректно выбрать траектории движения полюсов (и нулей - с ними мы тоже самое делать будем), чтобы звук был нормальным (т.е. чтобы коэффициент передачи фильтра не задирался слишком и не понижался до предельно малых значений и проч.).

Вобщем, может, кто знает, изящное решение этой задачи?

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru