Минимально фазовый 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 object and other objects of type uitoolbar, uimenu. The axes object 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 object and other objects of type uitoolbar, uimenu. The axes object with title Phase Response contains an object of type line. This object represents 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');

Figure Filter Visualization Tool - Magnitude Response (dB) and Phase Response contains an axes object and other objects of type uitoolbar, uimenu. The axes object 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 object and other objects of type uitoolbar, uimenu. The axes object 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/BR2021bd_1751886_255755/mlx_to_docbook2/tpf52740e0_16ca_4382_94cc_5bb6c693a989/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/BR2021bd_1751886_255755/mlx_to_docbook2/tpf52740e0_16ca_4382_94cc_5bb6c693a989/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 objects. Axes object 1 with title HDL Min Phase Filter Chirp Stimulus. contains an object of type line. Axes object 2 with title HDL Min Phase Filter Response. contains an object of type line.

Заключение

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

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