Расчет коэффициентов компенсационного FIR фильтра в GNU Octave.

cic fir filters

Во многих примерах проектов SDR радиоприемников для ПЛИС, которые я рассматривал, используется связка из двух фильтров. Идут последовательно CIC фильтр и потом FIR фильтр. Свой SDR приемник, мы сделали так же используя два фильтра последовательно.

CIC фильтр — это интегрально гребенчатый фильтр (cascaded integral-comb filter).

FIR фильтр – фильтр с конечной импульсной характеристикой (finite impulse response filter).

Говорят, что CIC фильтр хорош в реализации, для него требуется не много вычислительных ресурсов и он хорош для использования в задачах передискретизации. Проще говоря, CIC фильтры используются для снижения частоты дискретизации в десятки и сотни раз. Однако, у CIC фильтра есть недостаток — пологая АЧХ. А хотелось бы, чтобы перед ресамплером стоял фильтр с более прямоугольной Амплитудно Частотной Характеристикой.

Поэтому после CIC фильтра ставят второй фильтр, который должен как-то компенсировать пологость АЧХ CIC фильтра. Как его рассчитать?

В среде проектирования Altera Quartus II есть мегафункции для CIC и FIR фильтров. Каждая из мегафункций имеет очень много разных параметров.

Разработчик сперва запускает Quartus II Megafunction Wizard для создания модуля CIC фильтра. Нужно задать требуемые параметры CIC фильтра и Wizard сам создаст несколько дизайн файлов, модели для симуляции, и прочее. Среди созданных файлов будет файл с расширением *.m – это программа для MATLAB, которая должна помочь расчитать коэффициенты компенсационного FIR фильтра. Потом запускаем Megafunction Wizard для FIR фильтра и вносим туда полученные ранее коэффициенты.

Теперь собственно вопрос: «А где взять Matlab?». Опустим риторический ответ на этот вопрос и попытаемся найти альтернативу.

Если вы не часто рассчитываете коэффициенты FIR фильтра, то может быть получится просто взять пробную версию MATLAB с сайта производителя и установить программу, воспользоваться ей один раз и потом удалить после пробного периода.

Ну не знаю — у меня это не получилось:

mathlab trial

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

Тогда можно использовать план «Б». Возьмите GNU Octave.

GNU Octave — свободная система для математических вычислений, использующая совместимый с MATLAB язык высокого уровня.

Я скачал GNU Octave вот отсюда: ftp://ftp.gnu.org/gnu/octave/windows/octave-4.0.1-installer.exe
Установите эту программу. Замечательно, что интерфейс программы — русскоязычный. Многим это важно.

Открываю «Командное окно»:

octave cmd wnd

Дополнительно потребуется пакет signal. Я взял его вот здесь: http://jaist.dl.sourceforge.net/project/octave/Octave%20Forge%20Packages/Individual%20Package%20Releases/signal-1.3.2.tar.gz

Затем нужно установить этот пакет Signal. В командном окне нужно выполнить "pkg install":

octave pkg sign install

Установили пакет Signal? Загрузите его командой "pkg load":

octave pkg sign load

Теперь уже все готово и можно запустить скрипт для рассчета FIR фильтра, который был создан в среде Altera Quartus II с помощью CIC Filter Megafunction Wizard.

octave pkg sign run

 

В файловом менеджере  Octave выбираем скрипт mcic_fir_comp_coeff.m, созданный квартусом и открывается редактор скрипта. Запуск скрипта по клавише F5, или из меню, как на рисунке выше. Скрипт работает в командном окне, так, что в него нужно будет переключиться.

 

octave enter params

Скрипт спрашивает разные параметры, необходимые, для рассчета коэффициентов компенсирующего FIR фильтра. На рисунке выше видно какие параметры задавал я.

Число коэффициентов фильтра 21 (больше не получается - не хватает умножителей в Cyclone III). Исходная частота дискретизации до CIC фильтра 20МГц. Частота отсечки (cutoff frequency) 25кГц. Хочу нарисовать графики: Да. Целочисленные коэффициенты: Да. Разрядность коэффициентов: 16. Отвечаем на эти вопросы - в конце скрипт сообщает, что коэффициенты фильтра будут записаны в текстовый файл mcic_fir_comp_coeff.txt

И вот появляется окно с графиками:

 octave plot

Синий график - это АЧХ CIC фильтра. Зеленый график - АЧХ компенсационного FIR фильтра. Итоговая АЧХ получается в результрате перемножения двух графиков, так как фильтры стоят последовательно. Вообще-то цель этого действия - сделать итоговую АЧХ желательно прямоугольной. У меня итоговая частотная характеристика получилась не очень прямоугольной из-за того, что мало коэффициентов в FIR фильтре. Чем длиннее FIR фильтр, тем лучшего результата по фильтрации можно получить.

На самом деле, конечно, тут я немного поленился. Я сделал свой SDR приемник "в лоб", используя готовые решения, фильтры созданные визардами Altera Quartus II. Поэтому при таком подходе у меня не хватило умножителей на FIR фильтры, хотя бы длиной 31, а получилось всего 21.

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

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

Полученный текстовый файл с коэффициентами для FIR фильтра используется в визарде FIR II Compiler в среде Altera Quartus II.

fir1

Тут в визарде есть кнопка Browse для выбора текстового файла с коэффициентами фильтра. Выбираете получившийся файл, потом кнопка Apply. Визард загружает коэффициенты, и рисует график. Сразу скажу - визард почему-то отказывается загружать файл и мне пришлось между коэффициентами... поставить запятые: -180,749,533,-2366,-1915,5805,5496,-10629,-13977,13055,32767,13055,-13977,-10629,5496,5805,-1915,-2366,533,749,-180
С запятыми файл загружается в визард успешно. Вот такая история.

В любом случае, обратите внимание на GNU Octave, как альтернативу Matlab. Возможно, вы встретите некоторые странности с Octave, но с ними вполне можно мириться, если учесть, что это свободный инструмент.

 

Добавить комментарий