Этот пример иллюстрирует, как сгенерировать 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');
Проверяя минимальное создание фильтра фазы, создайте КИХ-Системный объект фильтра с 'Прямой формой, транспонированной' структура. Установите содействующий размер слова на 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');
При запуске с квантованного фильтра сгенерируйте 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/BR2020bd_1459859_105924/mlx_to_docbook2/tpad7e18f9_69f0_4490_9e72_f23c87c92a17/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/BR2020bd_1459859_105924/mlx_to_docbook2/tpad7e18f9_69f0_4490_9e72_f23c87c92a17/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®, чтобы проверить эти результаты.