КИХ-децимация для FPGA

В этом примере показано, как десятикратно уменьшить выборки потоковой передачи с помощью благоприятного для оборудования многофазного КИХ-фильтра. Это также показывает различия между dsp.FIRDecimator возразите и благоприятный для оборудования интерфейс потоковой передачи блока FIR Decimation HDL Optimized.

Сгенерируйте входную синусоиду в MATLAB®. Модель в качестве примера импортирует этот сигнал из рабочего пространства MATLAB. Выберите фактор децимации и размер входного вектора для оптимизированного HDL блока.

T = 512;
waveGen = dsp.SineWave(0.9,100,0,'SamplesPerFrame',T);
dataIn = fi(waveGen()+0.05,1,16,14);

inputVecSize=4;
decimFactor=8;

Модель в качестве примера импортирует входной сигнал из рабочего пространства MATLAB и применяет его как векторы с блоком FIR Decimation HDL Optimized. Модель возвращает выходной параметр от блока до рабочего пространства MATLAB для сравнения.

Блок FIR Decimation HDL Optimized применяет выборки к фильтру в различной фазе, чем dsp.FIRDecimator object. Чтобы совпадать с числовым поведением, примените decimFactor - 1 нуль с блоком FIR Decimation HDL Optimized перед запуском выборок данных.

dataInHDL = [zeros(decimFactor-1,1);dataIn];

modelName = 'FIRDecimHDL';
open_system(modelName);
set_param(modelName,'SimulationCommand','Update');

Блок FIR Decimation HDL Optimized принимает вектор из inputVecSize- 1 выборка и возвращает скалярный выходной параметр. Блок выполняет односкоростную обработку и указывает на допустимые выборки в выходном сигнале путем установки выхода допустимый сигнал на 1. Шагом расчета Simulink является inputVecSize для целой модели. Блок устанавливает выход допустимый сигнал на 1 каждый decimFactor/inputVecSize выборки.

out = sim('FIRDecimHDL');

Создайте dsp.FIRDecimator Система object™ и генерирует справочные данные, чтобы сравнить с моделью HDL выход. Этот пример использует коэффициенты фильтра по умолчанию, которые являются тем же самым для блока и объекта. Объект может принять любой размер входного вектора, который является кратным фактору децимации, таким образом, можно вычислить выход с одним вызовом объекта. Если вы изменяете фактор децимации в значение, которое не является фактором T, необходимо также настроить значение T (размер dataIn).

Блок и объект оба сконфигурированы, чтобы использовать полную точность внутренние типы данных. Объект вычисляет различный тип выходных данных в этом режиме. Это различие означает, что выход не может соответствовать, если внутренние значения насыщают типы данных.

decimRef = dsp.FIRDecimator(decimFactor);
refDataOut = decimRef(dataIn);

Для выхода блока FIR Decimation HDL Optimized выберите выборки данных, где выходом допустимый сигнал был 1, и сравните их с выборками, возвращенными в dsp.FIRDecimator объект.

hdlVec = out.dataOut(out.validOut);
refVec = refDataOut(1:size(hdlVec,1));
errVec = hdlVec - refVec;
maxErr = max(abs(errVec));
fprintf('\nFIR decimator versus reference: Maximum error out of %d values is %d\n',length(hdlVec),maxErr);
FIR decimator versus reference: Maximum error out of 54 values is 1

Смотрите также

Блоки