В этом примере показано, как можно проектировать и внедрять аппаратно эффективные преобразователи частоты дискретизации для произвольного коэффициента с использованием структур на основе полиномов (Farrow). Преобразование частоты дискретизации (SRC) между произвольными факторами полезно для многих приложений, включая синхронизацию символов в цифровых приемниках, кодирование речи, выборку звука и т.д. В данном примере показано, как можно преобразовать частоту дискретизации звукового сигнала из 8kHz в 44,1 кГц.
Для повторной выборки входящего сигнала из 8 kHz кому 44.1 kHzмы должны будем по существу интерполировать на 441 и прореживать на 80. Этот SRC может быть реализован с использованием многофазных структур. Однако использование многофазных структур для любого произвольного фактора обычно приводит к большому количеству коэффициентов, приводящих к большому количеству требований к памяти и площади. В этом примере мы покажем, как SRC может быть эффективно реализован с помощью комбинации многофазных и фурроу-фильтрующих структур.
Сначала интерполируем оригинал 8 kHz сигнал на коэффициент 4 с использованием каскада полубандовых фильтров FIR. Это приведет к промежуточному сигналу 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);
Чтобы предотвратить рост пути данных до очень больших длин слов, квантуйте каскады фильтра так, чтобы входы на каждый каскад составляли 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 testbench, передав свойства «StartBenchUserStimulus» и «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 с точностью до бита и средства тестирования.