Минимально фазовый 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');

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 с фиксированной точкой

Проверив минимальную фазу создания фильтра, создайте конечную импульсную характеристику фильтра с Системным объектом 'Direct form transposed'. Установите размер слова коэффициента равную 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.

Заключение

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

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