Этот пример показывает, как можно спроектировать и реализовать аппаратные эффективные преобразователи частоты дискретизации для произвольного фактора с использованием полиномиальных структур (Farrow). Преобразование частоты дискретизации (SRC) между произвольными факторами полезно для многих приложений, включая синхронизацию символов в цифровых приемниках, кодирование речи, дискретизацию звука и т.д. Для цели этого примера мы покажем, как можно преобразовать частоту дискретизации аудиосигнала с 8kHz до 44,1 кГц.
В порядок для повторной выборки входного сигнала от 8 kHz
на 44.1 kHz
нам придется по существу интерполировать на 441 и децимировать на 80. Этот SRC может быть реализован с использованием полифазных структур. Однако использование полифазных структур для любого произвольного фактора обычно приводит к большому количеству коэффициентов, приводящих к большим требованиям к памяти и площади. В этом примере мы покажем, как SRC может быть эффективно реализован с помощью смеси полифазы и более мелких структур фильтра.
Во-первых, мы интерполируем оригинал 8 kHz
сигнал в множителе 4
использование каскада конечной импульсной характеристики полупрозрачных фильтров. Это приведет к промежуточному сигналу 32 kHz
. Полифазные фильтры особенно хорошо адаптированы для интерполяции или десятикратного уменьшения целочисленным коэффициентом и для фракционных преобразований скорости, когда интерполяция и коэффициенты десятикратного уменьшения низки. Для спецификаций как ниже, давайте проектируем этапы интерполяции.
TW = .125; % Transition Width Astop = 50; % Minimum stopband attenuation cascadeSpec = fdesign.interpolator(4, 'Nyquist', 4, 'TW,Ast', TW, Astop); FIRCascade = design(cascadeSpec, 'multistage', ... 'HalfbandDesignMethod', 'equiripple', 'SystemObject', true);
Выходной сигнал из вышеупомянутых интерполяционных каскадов должен быть дополнительно интерполирован из 32 kHz
на 44.1 kHz
. Это будет сделано с помощью фильтра Farrow Rate Converter, разработанного с помощью кубического полинома Лагранжа.
FsInp = 32e3; % Input sample rate FsOut = 44.1e3; % Output sample rate TOL = 0; % Output rate tolerance NP = 3; % Polynomial order farrowFilter = dsp.FarrowRateConverter(FsInp, FsOut, TOL, NP);
Чтобы предотвратить рост datapath до очень больших размеров слова, квантуйте каскады фильтра так, чтобы входы для каждого каскада составляли 12 биты, а выходы - 12 биты.
cascadeOutNT = numerictype([],12,11); FIRCascade.Stage1.FullPrecisionOverride = false; FIRCascade.Stage1.OutputDataType = 'Custom'; FIRCascade.Stage1.CustomOutputDataType = cascadeOutNT; FIRCascade.Stage2.FullPrecisionOverride = false; FIRCascade.Stage2.OutputDataType = 'Custom'; FIRCascade.Stage2.CustomOutputDataType = cascadeOutNT; farrowOutNT = numerictype(1,12,11); farrowFilter.OutputDataType = farrowOutNT;
Полный фильтр просто получается путем создания каскада интерполяционных каскадов и фильтра farrow.
sampleRateConverter = cascade(FIRCascade.Stage1, FIRCascade.Stage2, farrowFilter);
Величина реакция каскадного фильтра SRC показывает, что он соответствует минимальной спецификации затухания в полосе задерживания 50 дБ.
Fs = 32e3*441; % The highest clock rate is 14.112 MHz W = linspace(0,44.1e3,2048); % Define the frequency range analysis fvt = fvtool(sampleRateConverter,'FrequencyRange','Specify freq. vector', ... 'FrequencyVector',W,'Fs',Fs, ... 'NormalizeMagnitudeto1','on', 'Color', 'white'); legend(fvt,'Cascade of FIR and Farrow Rate Converter Response',... 'Location','NorthEast')
Теперь можно сгенерировать код VHDL для каскадного SRC с помощью generatehdl
команда. Можно также сгенерировать тестбенч VHDL, передав свойства 'TestBenchUserStimulus' и 'GenerateHDLTestbench' в generatehdl
команда. Код VHDL может быть моделирован в любом симуляторе HDL, чтобы проверить результаты.
workingdir = tempname; inpFrameSz = 640; tVector = linspace(0.005, 7.5, inpFrameSz); srcTBStim = (chirp(tVector, 0, 1, 150))'; generatehdl(sampleRateConverter, ... 'TargetDirectory', workingdir, ... 'InputDataType', numerictype(1,12,11), ... 'OptimizeForHDL', 'on', ... 'GenerateHDLTestbench', 'on', ... 'TestBenchUserStimulus', srcTBStim, ... 'ErrorMargin', 2);
### Starting VHDL code generation process for filter: casfilt ### Cascade stage # 1 ### Starting VHDL code generation process for filter: casfilt_stage1 ### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp8ff2bb89_d5be_4c35_8dd2_9c0c1ed68156/casfilt_stage1.vhd ### Starting generation of casfilt_stage1 VHDL entity ### Starting generation of casfilt_stage1 VHDL architecture ### Successful completion of VHDL code generation process for filter: casfilt_stage1 ### Cascade stage # 2 ### Starting VHDL code generation process for filter: casfilt_stage2 ### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp8ff2bb89_d5be_4c35_8dd2_9c0c1ed68156/casfilt_stage2.vhd ### Starting generation of casfilt_stage2 VHDL entity ### Starting generation of casfilt_stage2 VHDL architecture ### Successful completion of VHDL code generation process for filter: casfilt_stage2 ### Cascade stage # 3 ### Starting VHDL code generation process for filter: casfilt_stage3 ### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp8ff2bb89_d5be_4c35_8dd2_9c0c1ed68156/casfilt_stage3.vhd ### Starting generation of casfilt_stage3 VHDL entity ### Starting generation of casfilt_stage3 VHDL architecture ### Successful completion of VHDL code generation process for filter: casfilt_stage3 ### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp8ff2bb89_d5be_4c35_8dd2_9c0c1ed68156/casfilt.vhd ### Starting generation of casfilt VHDL entity ### Starting generation of casfilt VHDL architecture ### Successful completion of VHDL code generation process for filter: casfilt ### HDL latency is 1325 samples ### Starting generation of VHDL Test Bench. ### Generating input stimulus ### Done generating input stimulus; length 640 samples.
Warning: HDL optimization may cause small numeric differences that will be flagged as errors when running this testbench.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp8ff2bb89_d5be_4c35_8dd2_9c0c1ed68156/casfilt_tb.vhd ### Creating stimulus vectors ... ### Done generating VHDL Test Bench.
На следующем отображении показаны результаты моделирования ModelSim ® HDL после выполнения VHDL-теста.
В этом примере мы показали, как можно спроектировать преобразователь частоты дискретизации с помощью структуры farrow. Мы также показали вам, как можно анализировать ответ, квантовать его и генерировать бит-точный VHDL код и тестбенч.