exponenta event banner

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

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

Настройка коэффициентов

Спроектируйте фильтр с помощью firgr, который использует обобщенный метод конструкции Ремеза. Использование аргумента «minfase» для 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');

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains an object of type line. This object represents Min Phase.

Анализ реакции на фазу

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

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

Figure Filter Visualization Tool - Phase Response contains an axes and other objects of type uitoolbar, uimenu. The axes with title Phase Response contains an object of type line. This object represents Min Phase.

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

Проверив минимальную конструкцию фазового фильтра, создайте объект FIR-фильтра System со структурой «Прямая форма транспонирована». Установите длину слова коэффициента равной 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';

Проверка фильтра с фиксированной точкой относительно ссылочной конструкции

Проверьте квантованный фильтр относительно эталонной конструкции. Амплитудная характеристика является правильной, но фазовая характеристика больше не является минимальной фазой из-за квантования.

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

Figure Filter Visualization Tool - Magnitude Response (dB) and Phase Response contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) and Phase Response contains 2 objects of type line. These objects represent Min Phase: Quantized Magnitude, Min Phase: Reference Magnitude.

Проверка импульсной характеристики

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

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

Figure Filter Visualization Tool - Impulse Response contains an axes and other objects of type uitoolbar, uimenu. The axes with title Impulse Response contains 2 objects of type stem. These objects represent Min Phase: Quantized, Min Phase: Reference.

Создание кода 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/BR2021ad_1655202_180016/mlx_to_docbook2/tp5f88187b_093f_446c_a4be_8a4f6a132b15/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/BR2021ad_1655202_180016/mlx_to_docbook2/tp5f88187b_093f_446c_a4be_8a4f6a132b15/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');

Figure contains 2 axes. Axes 1 with title HDL Min Phase Filter Chirp Stimulus. contains an object of type line. Axes 2 with title HDL Min Phase Filter Response. contains an object of type line.

Заключение

Был разработан фильтр минимальной фазы, а затем преобразован в объект FIR filter System с транспонированной структурой. Затем был создан код Verilog для конструкции фильтра и стенд тестирования Verilog для функциональной проверки результатов.

Для проверки этих результатов можно использовать симулятор Verilog, например ModelSim ®.