Этот пример иллюстрирует, как генерировать код 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');

Проверьте фазовый отклик фильтра.
hfvt = fvtool(b,'Fs', Fs,... 'Analysis', 'phase',... 'legend','on'); legend(hfvt, 'Min Phase');

Проверив минимальную конструкцию фазового фильтра, создайте объект 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');

Постройте график импульсной характеристики квантованного фильтра. Многие из коэффициентов были квантованы до нуля, и общий отклик по-прежнему соответствует спецификации, даже если нули сделали фазовый отклик не минимальным. Эти нули приводят к меньшей реализации, поскольку код HDL не генерируется для умножений на ноль.
hfvt = fvtool(minPhaseFilter, 'Fs', Fs, ... 'Analysis', 'Impulse', ... 'legend', 'on', ... 'Arithmetic', 'fixed'); legend(hfvt, 'Min Phase');

Начиная с квантованного фильтра, генерируйте 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');

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