Десятикратное уменьшение конечной импульсной характеристики для ПЛИС

В этом примере показано, как децимировать потоковые выборки с помощью аппаратно удобного полифазного конечная импульсная характеристика. Это также показывает различия между 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-by-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 0

См. также

Блоки