exponenta event banner

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

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

Конструкция фильтра Farrow

Сигнал, выдаваемый вышеупомянутыми каскадами интерполяции, должен быть дополнительно интерполирован из 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;

Каскад полного 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.

Создание ЛПВП и испытательных стендов

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

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

Заключение

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