Преобразование частоты дискретизации 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')

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® Simulation Results

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

Заключение

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