Преобразование частоты дискретизации 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/BR2020ad_1302590_239645/mlx_to_docbook1/tp114a5176_504b_4797_979d_f0151c394783/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/BR2020ad_1302590_239645/mlx_to_docbook1/tp114a5176_504b_4797_979d_f0151c394783/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/BR2020ad_1302590_239645/mlx_to_docbook1/tp114a5176_504b_4797_979d_f0151c394783/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/BR2020ad_1302590_239645/mlx_to_docbook1/tp114a5176_504b_4797_979d_f0151c394783/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/BR2020ad_1302590_239645/mlx_to_docbook1/tp114a5176_504b_4797_979d_f0151c394783/casfilt_tb.vhd
### Creating stimulus vectors ...
### Done generating VHDL Test Bench.

ModelSim® Simulation Results

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

Заключение

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