Преобразование частоты выборки HDL с использованием фильтров Farrow

Этот пример показывает, как можно спроектировать и реализовать аппаратные эффективные преобразователи частоты дискретизации для произвольного фактора с использованием полиномиальных структур (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;

Каскад полного SRC и отклика величины

Полный фильтр просто получается путем создания каскада интерполяционных каскадов и фильтра 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')

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains an object of type line. This object represents Cascade of FIR and Farrow Rate Converter Response.

Сгенерируйте HDL & Testbench

Теперь можно сгенерировать код 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 ®

На следующем отображении показаны результаты моделирования ModelSim ® HDL после выполнения VHDL-теста.

Заключение

В этом примере мы показали, как можно спроектировать преобразователь частоты дискретизации с помощью структуры farrow. Мы также показали вам, как можно анализировать ответ, квантовать его и генерировать бит-точный VHDL код и тестбенч.