|
Реализация полосового фильтра на VHDL, Поделитесь опытом пожалуйста) |
|
|
|
Dec 23 2010, 06:17
|
Группа: Участник
Сообщений: 11
Регистрация: 22-12-10
Пользователь №: 61 792
|
День добрый!
Собственно начал изучать недавно Quartus II с VHDL. Вопрос состоит в том, как лучше реализовать низко добротный полосовой фильтр с помощью VHDL? Имеется его реализация на плате и рассчитанная для него передаточная функция в MatLab. Где лучше почитать или посмотреть об этом? В целом очень нужен совет с чего лучше начать)
В заранее спасибо!
|
|
|
|
|
Dec 23 2010, 07:43
|
Местный
Группа: Свой
Сообщений: 202
Регистрация: 2-10-06
Из: Петербург
Пользователь №: 20 881
|
ИМХО исходник, который генерит Матлаб - абсолютное зло для человека, который только начал разбираться в VHDL . Не знаю, как для обычного FIR фильтра, но когда я увидел исходник для полифазного, то немного подофигел. Может быть топикстартеру имеет смысл поискать в сети книгу Uwe Meyer-Baese "Digital Signal Processing with Field Programmable Gate Arrays". Не помню были там примеры на VHDL или Verilog, Но это не суть важно. Важнее определиться как будет ложиться структура фильтра на структуру FPGA. Здесь наверное пригодится часть из Stratix Device Hadbook, посвященная DSP: http://www.altera.com/literature/hb/stx/st...ion_4_vol_2.pdf.
|
|
|
|
|
Dec 24 2010, 07:25
|
Группа: Участник
Сообщений: 11
Регистрация: 22-12-10
Пользователь №: 61 792
|
За книгу отдельное спасибо, попробую изучить) На счет генерирования в матлабе исходник на VHDL, вопрос наверно глупый но чем генерировать? Слышал про программу альтеры dsp builder, но работать она отказалась требуя лицензию, а собственно откуда у студента деньги на лицензию) Иль там каким другим способом можно код получить?
|
|
|
|
|
Dec 26 2010, 06:49
|
Местный
Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102
|
Цитата ИМХО исходник, который генерит Матлаб - абсолютное зло для человека, который только начал разбираться в VHDL Абсолютно с Вами согласен. xponuk, Вы определитесь пожалуйста какой Вы фильтр хотите получить БИХ или КИХ.
|
|
|
|
|
Dec 27 2010, 06:28
|
Местный
Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102
|
Короче, прилагаю свои реализации БИХ и КИХ фильтров. Там два файла Matlab/ В каждом из них сначала задаются параметры фильтра, потом вычисляются коэффициенты, далее генерируется VHDL-код. Выходной файл имеет название Filter.vhdl Откроете его и посмотрите как все реализовано. Замечание: БИХ-фильтр реализован в виде секций 2-ого порядка. Еще одно важное замечание, фильтры не полосовые, а ФНЧ! Чтобы получить полосовой фильтр, нужно изменить Matlab'овский файл, а именно его начало на: Код clear all clc
Fs = 500*1000; % Частота дискретизации
data_size = 16; % Разрядность данных coef_size = 16; % Разрядность коэффициентов
Fstop1 = 5*10; % Начало полосы задерживания Fpass1 = 1*1000; % Начало полосы пропускания Fpass2 = 50*1000; % Конец полосы пропускания Fstop2 = 51*1000; % Конец полосы задерживания Astop1 = 60; % Ослабление в полосе задерживания (дБ) Apass = 1; % Уровень пульсаций в полосе пропускания (дБ) Astop2 = 60; % Ослабление в полосе задерживания (дБ) match = 'both'; % Оптимизация по уровню пульсаций (Оптимизировать в полосе пропускания и в полосе задерживания)
% Синтез Фильтра: h = fdesign.bandpass(Fstop1, Fpass1, Fpass2, Fstop2, Astop1, Apass, Astop2, Fs); Hd = design(h, 'ellip', 'MatchExactly', match);
% Преобразование в секции второго порядка: Hd = convert(Hd, 'df1sos');
% Установка свойств арифметики с фиксированной запятой
set(Hd, 'Arithmetic', 'fixed', ... 'CoeffWordLength', coef_size, ... 'CoeffAutoScale', true, ... 'ProductMode', 'Fullprecision', ... 'AccumMode', 'KeepMSB', ... 'AccumWordLength', 40, ... 'NumStateWordLength', data_size, ... 'DenStateWordLength', data_size, ... 'NumStateFracLength', data_size - 1, ... 'DenStateFracLength', data_size - 1, ... 'InputWordLength', data_size, ... 'inputFracLength', data_size - 1, ... 'OutputWordLength', data_size, ... 'OutputMode', 'AvoidOverflow', ... 'signed', true, ... 'RoundMode', 'convergent', ... 'OverflowMode', 'Saturate', ... 'CastBeforeSum', false); denormalize(Hd);
%% АЧХ фильтра [b_sos, a_sos] = sos2tf(Hd.sosMatrix, Hd.ScaleValues); % Преобразование секций второго порядка в коэффициенты числителя и знаменателя [h_sos, f_sos] = freqz(b_sos, a_sos, 2048); % Построение АЧХ фильтра по коффициентам числителя и знаменателя Важно! Мои примеры не претендуют на роль единственно верных. Просто мне особо никто не бодсказывал и до всего этого я дошел сам, ковыряясь с примерами от Simulink'a. В итоге получилось это. Надо сказать, что моя реализация работает быстрее, чем реализация от Simulink. Если кто-то сделал лучше, пусть не только заявит об этом, но и приведет пример своей реализации. Надеюсь Вам будет полезна моя работа, успехов!
|
|
|
|
|
Jan 11 2011, 09:48
|
Группа: Участник
Сообщений: 11
Регистрация: 22-12-10
Пользователь №: 61 792
|
Собственно говоря хочу получить код Vhdl для БИХ фильтра ( фильтр полосовой ), низко добротного (добротность где то 2), с резонансной частотой 10 000 Гц в принципе больше требований нет принципиальных.
Уважаемый Zed, можно попросить Вас немного пояснить как собственно программы данные запускаются, честно не понял, попробовал через симулинк не вышло, какой блок ее вызывает?. И собственно vhdl код насколько я понимаю Вы получаете с помощью встроенного в матлаб кодера?
|
|
|
|
|
Jan 11 2011, 11:46
|
Профессионал
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082
|
Цитата(xponuk @ Jan 11 2011, 15:48) Собственно говоря хочу получить код Vhdl для БИХ фильтра ( фильтр полосовой ), низко добротного (добротность где то 2), с резонансной частотой 10 000 Гц в принципе больше требований нет принципиальных. Для Ваших требований - открывайте хелп и смотрите, какие полосовые фильтры есть и какие у них есть параметры. Все вот это Код clear all clc Fs = 500*1000; % Частота дискретизации data_size = 16; % Разрядность данных coef_size = 16; % Разрядность коэффициентов вводится прямо в окне матлаб (как Вам уже сказали все эти параметры для конкретного случая). В нем же можно ввести для данной реализации функцию generatehdl (все параметры, так же как и язык реализации подробно описаны в хелпе) созданного объекта Hd. В результате получите созданный объект на требуемом языке.
|
|
|
|
|
Jan 12 2011, 05:46
|
Местный
Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102
|
Цитата Уважаемый Zed, можно попросить Вас немного пояснить как собственно программы данные запускаются, честно не понял, попробовал через симулинк не вышло, какой блок ее вызывает? Ну во-первых это файлы с расширением *.m, значит они Matlab'овские. Т.е. открываеть его нужно в Matlab, а не Simulink. Далее нажимаете запуск ( Run) и на диске C у вас появится файл с названием filter.vhd. Цитата И собственно vhdl код насколько я понимаю Вы получаете с помощью встроенного в матлаб кодера? Нет с помощью Matlab'а я получаю коэффициенты фильтра с заданными характеристиками и перевожу их в дополнительный код. Также мой Matlab'овский файл содержит "скелет" VHDL-кода, написанного мной, куда просто подставляются коэффициенты. Далее этот код записывается в файл C:\filter.vhd. Когда откроете файл Вы все поймете, там достаточно комментариев. Если что-то не понятно, спрашивайте. Успехов! P.S. Также вы можете менять параметры фильтра: полосу пропускания, частоту дискретизации, неравномеерность в полосе пропускания и т.д. Затем Вы снова нажимаете Run и получаете новый файл filter.vhd уже с новыми параметрами (коэффициентами).
|
|
|
|
|
Jan 12 2011, 09:38
|
Группа: Участник
Сообщений: 11
Регистрация: 22-12-10
Пользователь №: 61 792
|
Возникла проблема с программой. Собственно поменял код, для полосового фильтра, получил его АЧХ в матлабе, но vhdl код не создается. Собственно с чем это может быть связано? Или я не так понял и корректировка параметров фильтра происходит в vhdl коде?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|