В этом примере показано, как вы можете оборудование разработки и реализации эффективные Конвертеры Частоты дискретизации для случайного фактора с помощью основанных на полиноме (Неоплодотворенных) структур. Преобразование частоты дискретизации (SRC) между случайными факторами полезно для многих приложений включая синхронизации символа в Цифровых приемниках, речевое кодирование, аудио выборку, и т.д. В целях этого примера мы покажем, как можно преобразовать частоту дискретизации звукового сигнала от 8 кГц до 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
. Это будет сделано Неоплодотворенным фильтром Конвертера Уровня, спроектированным кубическим Лагранжевым полиномом.
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;
Полный фильтр просто получен путем создания каскада этапов интерполяции и неоплодотворенного фильтра.
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/BR2020bd_1459859_105924/mlx_to_docbook1/tp3ceb7abd_7567_4f10_b086_26c7cc45bc3d/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/BR2020bd_1459859_105924/mlx_to_docbook1/tp3ceb7abd_7567_4f10_b086_26c7cc45bc3d/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/BR2020bd_1459859_105924/mlx_to_docbook1/tp3ceb7abd_7567_4f10_b086_26c7cc45bc3d/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/BR2020bd_1459859_105924/mlx_to_docbook1/tp3ceb7abd_7567_4f10_b086_26c7cc45bc3d/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/BR2020bd_1459859_105924/mlx_to_docbook1/tp3ceb7abd_7567_4f10_b086_26c7cc45bc3d/casfilt_tb.vhd ### Creating stimulus vectors ... ### Done generating VHDL Test Bench.
Следующее отображение показывает результаты симулятора HDL ModelSim® после выполнения испытательного стенда VHDL.
В этом примере мы показали, как можно спроектировать конвертер частоты дискретизации с помощью неоплодотворенной структуры. Мы также показали вам, как можно анализировать ответ, квантовать его и сгенерировать побитовый код VHDL и испытательный стенд.