Преобразование частоты дискретизации HDL Используя неоплодотворенные фильтры

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

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

Полный фильтр просто получен путем создания каскада этапов интерполяции и неоплодотворенного фильтра.

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')

Сгенерируйте 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/BR2019ad_1062519_57051/mlx_to_docbook1/tp50f006b0_eb60_4066_b03f_ed20eb13794b/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/BR2019ad_1062519_57051/mlx_to_docbook1/tp50f006b0_eb60_4066_b03f_ed20eb13794b/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/BR2019ad_1062519_57051/mlx_to_docbook1/tp50f006b0_eb60_4066_b03f_ed20eb13794b/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/BR2019ad_1062519_57051/mlx_to_docbook1/tp50f006b0_eb60_4066_b03f_ed20eb13794b/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/BR2019ad_1062519_57051/mlx_to_docbook1/tp50f006b0_eb60_4066_b03f_ed20eb13794b/casfilt_tb.vhd
### Creating stimulus vectors ...
### Done generating VHDL Test Bench.

ModelSim® Simulation Results

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

Заключение

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