Минимально фазовый HDL фильтр FIRT

Этот пример иллюстрирует, как сгенерировать HDL-код для минимального фильтра фазы FIRT с 10-битными входными данными. Это - полосовой фильтр с частотой дискретизации 96 кГц и полосой пропускания приблизительно от 19 кГц до 29 кГц. Этот тип фильтра обычно используется в обратной связи, где линейная фаза не является достаточной и минимальной фазой или настолько близко, как достижимо, требуется.

Настройте Коэффициенты

Разработайте фильтр с помощью firgr, который использует обобщенный метод разработки Remez. Использование 'minphase' аргумента к firgr обеспечивает минимальный проект фильтра фазы. Затем используйте fvtool, чтобы визуализировать ответ фильтра.

Fs  = 96000;
Fn  = Fs/2;
f   = [0 17000 20000 28000 31000 Fn]/Fn;
a   = [0     0     1     1     0  0];
w   = [5 1 5];
b   = firgr(44, f, a, w, 'minphase');
hfvt = fvtool(b,'Fs', Fs,...
              'MagnitudeDisplay', 'Magnitude (dB)',...
              'legend','on');
legend(hfvt,'Min Phase');

Исследуйте фазовый отклик

Проверяйте фазовый отклик фильтра.

hfvt = fvtool(b,'Fs', Fs,...
              'Analysis', 'phase',...
              'legend','on');
legend(hfvt, 'Min Phase');

Создайте квантованный фильтр фиксированной точки FIRT

Проверяя минимальный проект фильтра фазы, создайте КИХ-Системный объект фильтра с 'Прямой формой, транспонированной' структура. Установите содействующий размер слова на 15 и используйте полную точность для других настроек фильтра.

b_fixed = fi(b,1,15); % use best precision fraction length
T_coeff = numerictype(b_fixed);
minPhaseFilter = dsp.FIRFilter('Structure','Direct form transposed');
minPhaseFilter.Numerator = double(b_fixed);
minPhaseFilter.FullPrecisionOverride = false;
minPhaseFilter.CoefficientsDataType = 'Custom';
minPhaseFilter.CustomCoefficientsDataType = T_coeff;
minPhaseFilter.ProductDataType = 'Full precision';
minPhaseFilter.AccumulatorDataType = 'Full precision';
minPhaseFilter.OutputDataType = 'Same as accumulator';

Проверяйте фильтр фиксированной точки относительно исходного проекта

Проверяйте квантованный фильтр относительно исходного проекта. Ответ значения правилен, но фазовый отклик больше не является фазой min, из-за квантования.

hfvt = fvtool(minPhaseFilter, 'Fs', Fs, ...
              'Analysis', 'freq', ...
              'legend', 'on', ...
              'Arithmetic', 'fixed');
legend(hfvt, 'Min Phase');

Проверяйте импульсный ответ

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

hfvt = fvtool(minPhaseFilter, 'Fs', Fs, ...
              'Analysis', 'Impulse', ...
              'legend', 'on', ...
              'Arithmetic', 'fixed');
legend(hfvt, 'Min Phase');

Сгенерируйте HDL-код и испытательный стенд от квантованного фильтра

При запуске с квантованного фильтра сгенерируйте VHDL или Verilog.

Создайте временный рабочий каталог. После генерации HDL-кода (Verilog в этом случае), откройте сгенерированный файл в редакторе.

Сгенерируйте испытательный стенд Verilog, чтобы проверить, что результаты совпадают с результатами в MATLAB. Используйте предопределенный входной стимул щебета.

Чтобы сгенерировать код VHDL и испытательный стенд VHDL вместо этого, измените значение для свойства 'TargetLanguage' от 'Verilog' до 'VHDL'.

Примите вход 10-битного размера слова с 9-битными дробными битами.

workingdir = tempname;
generatehdl(minPhaseFilter,'Name', 'hdlminphasefilt', ...
               'TargetLanguage', 'Verilog', ...
               'GenerateHDLTestbench','on', ...
               'TestBenchStimulus', 'chirp', ...
               'TargetDirectory', workingdir, ...
               'InputDataType', numerictype(1,10,9));
### Starting Verilog code generation process for filter: hdlminphasefilt
### Starting Verilog code generation process for filter: hdlminphasefilt
### Generating: /tmp/BR2019ad_1062519_57051/mlx_to_docbook1/tp0f97fa52_e608_4f20_8aff_1eb3e6e20d42/hdlminphasefilt.v
### Starting generation of hdlminphasefilt Verilog module
### Starting generation of hdlminphasefilt Verilog module body
### Successful completion of Verilog code generation process for filter: hdlminphasefilt
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1069 samples.
### Generating Test bench: /tmp/BR2019ad_1062519_57051/mlx_to_docbook1/tp0f97fa52_e608_4f20_8aff_1eb3e6e20d42/hdlminphasefilt_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.
edit(fullfile(workingdir, 'hdlminphasefilt.v'));

Постройте стимул испытательного стенда и ответ фильтра

Постройте входной стимул фильтра и выведите ответ на отдельных графиках.

x = generatetbstimulus(minPhaseFilter,'TestBenchStimulus','chirp','InputDataType', numerictype(1,10,9));
xrange = (0:length(x) - 1).*( Fn / (length(x) - 1))/1e3;
y = minPhaseFilter(x.');
subplot(2,1,1); plot(xrange, x); ylim(ylim.*1.1);
axis([0,50,-1.2,1.2]);
title('HDL Min Phase Filter Chirp Stimulus.');
xlabel('Frequency in kHz');
subplot(2,1,2); plot(xrange, y); ylim(ylim.*1.1);
axis([0,50,-1.2,1.2]);
title('HDL Min Phase Filter Response.');
xlabel('Frequency in kHz');

Заключение

Вы разработали минимальный фильтр фазы и затем преобразовали его в КИХ-Системный объект фильтра с транспонированной структурой. Вы затем сгенерировали код Verilog для проекта фильтра и испытательного стенда Verilog, чтобы функционально проверить результаты.

Можно использовать средство моделирования Verilog, такое как ModelSim®, чтобы проверить эти результаты.