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

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

Отправлено homekvn 23 ноября 2005 г. 15:30
В ответ на: Не понял про что Вы. Так же я не понял как с помощью iirgrpdelay синтезировать аллпасс с заданной ФЧХ. отправлено <font color=gray>R2D2</font> 23 ноября 2005 г. 14:42

Вначале "на пальцах".
1. ЖЕЛАЕМЫЕ АЧХ И ФЧХ
Вы на бумаге рисуете по точкам желаемую АЧХ (ну можете не рисовать, т.к. она у Вас, всюду будет равна единице). Далее, рисуете под АЧХ нужную Вам ФЧХ (разумеется, с тем же количеством точек; количество точек возьмите кратным 2^N, чтобы потом БПФ удобно было брать).

2. СИНТЕЗ КИХ-ФИЛЬТРА
Далее умножьте Вашу АЧХ на exp(j*ФЧХ) и Вы получите почти то, что Вам нужно, т.е. преобразованную по Фурье импульсную характеристику желаемого КИХ-фильтра. Обозначим ее буквой F. Только вот для того, чтобы между отсчетами у Вас все хорошо было надо бы еще это дело свернуть с БПФ от какого-нибудь хорошего окна. Но вообще, вначале сделайте без всякого окна прямо в матлабе и посмотрите, что получится. Есть подозрение, что без окна обойтись можно. Для проверки возьмите действительную часть от обратного БПФ от F и внимательно изучите ее, все ли в ней хорошо. Обозначим полученную импульсную характеристику буквой f. Для проверки либо интуиция нужна, либо подайте дельта-импульс на вход фильтра с имп. характеристикой f, и посмотрите на результат (обозначим его буквой f~): соответствует ли он желаемому, или нет. Здесь обязательно сделайте так, чтобы длина дельта-функции НЕ была кратна длине f. (Это требование необходимо выполнить для просмотра результатов между отсчетами после того, как Вы вновь возьмете БПФ от f~). Обозначим F~ = БПФ(f~). Возьмите теперь поочередно модуль и аргумент от F~ и посмотрите, все ли получается так, как Вы задумали, т.е. более-менее совпадает ли форма |F~| c формой |F| и форма arg(F~) c формой arg(F).

3. ПРОВЕРКА
Если в п.2 все хорошо получилось, то идем дальше. Если не совсем (т.е., например, |F~| имеет впадины или выбросы), то надо все-таки сворачивать с БПФ от окна (если здесь не понятно, о чем идет речь, спросите, напишу).

4. REAL-TIME-ОБРАБОТКА В ЧАСТОТНОЙ ОБЛАСТИ (ЧАСТЬ 1 - ОБЩИЙ ПРИНЦИП)
Теперь делаем обрабоку в реальном времени, причем ввиду большой длины фильтра делаем это прямо в частотной области. Принцип простой.
а) Берем от куска входного сигнала БПФ
б) Умножаем полученное БПФ куска на F (обозначим полученный кусок буквой Y)
в) Берем обратное БПФ от Y (обозначим результат буквой y).

Но тут есть проблемка. Так можно было бы делать (и делать очень эффективно! поскольку БПФ и обратный БПФ работают очень быстро), если бы БПФ была бы нециклическим преобразованием. Но, к сожалению, это не так. Но выход есть!

5. REAL-TIME-ОБРАБОТКА В ЧАСТОТНОЙ ОБЛАСТИ (ЧАСТЬ 2 - OVERLAP-SAVE-ПРИЕМ)
Идея заключается в следующем. Возьмем БПФ от полученной имп. характеристики фильтра f, но дополненной справа количеством нулей, равным длине самой f. Таким образом, мы получим новую пару сигналов g и G. Еще раз обращаю внимание, что g отличается от f только в два раза большей длиной. А вот G будет отличаться от F уже по-существенней. Теперь будем брать кусок сигнала длиной равной длине g. (Обозначим это число за 2N).
а) Начальный кусок входного сигнала надо обязательно взять так:
первые N отсчетов - нули, а оставшиеся N отсчетов - наш сигнал.
б) Возьмем БПФ от полученного в п. а) блока (его длина будет равна 2N). (Обозначим сам блок буквой x(i), а его БПФ буквой X(i), i = 0, 1, 2, 3,... - номера блоков)
в) Тепеь умножим БПФ сигнала - X(i) на БПФ фильтра G (обозначим результат буквой Z(i)).
г) Возьмем обратное БПФ от Z(i). (обозначим результат буквой z(i); здесь подчеркнем еще раз, что i - номер блока).
д) Возьмем только последние N отсчетов блока z(i).

Утверждение. Эти последние N отсчетов будут реальными отсчетами выхода Вашего фильтра. Почему? - Спрашивайте - ответим. Но вообще прочитайте еще и следующий ниже пункт е)
е) Сформируем блок x(i+1) следующим образом. В качестве первого куска возьмем последние N отсчетов блока x(i), а в качестве оставшихся незанятыми N отсчетов возьмем следующие N отсчетов сигнала.
ж) Будем повторять шаги а)-ж) до тех пор, пока не закончится входной сигнал, либо пока не надоест.

Вот и все!

В качестве примечания скажу, что существует альтернативный прием тому, что мы только что описали в разделе 5. Он называется OVERLAP-ADD. О его достоинствах и недостатках читайте в литературе.

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

Ответы


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

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

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

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

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


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

E-mail: info@telesys.ru