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