Во многих примерах проектов 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 с сайта производителя и установить программу, воспользоваться ей один раз и потом удалить после пробного периода.
Ну не знаю — у меня это не получилось:
Не знаю, чем я их обидел, но мне не получилось скачать даже пробную версию. Не могут они мне предложить скачать пробную версию.
Тогда можно использовать план «Б». Возьмите GNU Octave.
GNU Octave — свободная система для математических вычислений, использующая совместимый с MATLAB язык высокого уровня.
Я скачал GNU Octave вот отсюда: ftp://ftp.gnu.org/gnu/octave/windows/octave-4.0.1-installer.exe
Установите эту программу. Замечательно, что интерфейс программы — русскоязычный. Многим это важно.
Открываю «Командное окно»:
Дополнительно потребуется пакет signal. Я взял его вот здесь: http://jaist.dl.sourceforge.net/project/octave/Octave%20Forge%20Packages/Individual%20Package%20Releases/signal-1.3.2.tar.gz
Затем нужно установить этот пакет Signal. В командном окне нужно выполнить "pkg install":
Установили пакет Signal? Загрузите его командой "pkg load":
Теперь уже все готово и можно запустить скрипт для рассчета FIR фильтра, который был создан в среде Altera Quartus II с помощью CIC Filter Megafunction Wizard.
В файловом менеджере Octave выбираем скрипт mcic_fir_comp_coeff.m, созданный квартусом и открывается редактор скрипта. Запуск скрипта по клавише F5, или из меню, как на рисунке выше. Скрипт работает в командном окне, так, что в него нужно будет переключиться.
Скрипт спрашивает разные параметры, необходимые, для рассчета коэффициентов компенсирующего FIR фильтра. На рисунке выше видно какие параметры задавал я.
Число коэффициентов фильтра 21 (больше не получается - не хватает умножителей в Cyclone III). Исходная частота дискретизации до CIC фильтра 20МГц. Частота отсечки (cutoff frequency) 25кГц. Хочу нарисовать графики: Да. Целочисленные коэффициенты: Да. Разрядность коэффициентов: 16. Отвечаем на эти вопросы - в конце скрипт сообщает, что коэффициенты фильтра будут записаны в текстовый файл mcic_fir_comp_coeff.txt
И вот появляется окно с графиками:
Синий график - это АЧХ CIC фильтра. Зеленый график - АЧХ компенсационного FIR фильтра. Итоговая АЧХ получается в результрате перемножения двух графиков, так как фильтры стоят последовательно. Вообще-то цель этого действия - сделать итоговую АЧХ желательно прямоугольной. У меня итоговая частотная характеристика получилась не очень прямоугольной из-за того, что мало коэффициентов в FIR фильтре. Чем длиннее FIR фильтр, тем лучшего результата по фильтрации можно получить.
На самом деле, конечно, тут я немного поленился. Я сделал свой SDR приемник "в лоб", используя готовые решения, фильтры созданные визардами Altera Quartus II. Поэтому при таком подходе у меня не хватило умножителей на FIR фильтры, хотя бы длиной 31, а получилось всего 21.
При этом, на самом деле сделать длинный FIR фильтр должно быть не трудно - ведь рабочая частота на нем всего навсего 50кГц. Его можно попробовать сделать многоканальным или выполнять умножения не параллельно для всех коэффициентов, а последовательно. Методов реализации может быть много.
Возможно, я смогу довести до ума свой собственный FIR фильтр, который я когда-то делал, и вставить его в этот проект.
Полученный текстовый файл с коэффициентами для FIR фильтра используется в визарде FIR II Compiler в среде Altera Quartus II.
Тут в визарде есть кнопка 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, но с ними вполне можно мириться, если учесть, что это свободный инструмент.
Подробнее...