В этом примере показано, как использовать блок CIC Decimation HDL Optimized, чтобы отфильтровать и проредить данные. Этот блок поддерживает скалярные и векторные входные параметры. В этом примере две модели Simulink® предоставлены, чтобы работать со скалярными и векторными входными параметрами отдельно. Можно сгенерировать HDL-код от подсистем в этих моделях Simulink.
Настройте эти переменные рабочей области для моделей, чтобы использовать. Эти переменные конфигурируют блок CIC Decimation HDL Optimized в них. Этот блок поддержки фиксируемые и переменные ставки децимации для скалярных входных параметров и только фиксируемая ставка децимации для векторных входных параметров. Пример запускает HDLCICDecimationModel.slx
модель, когда вы устанавливаете scalar
значение к true
и запускает HDLCICDecimationModelVectorSupport.slx
модель, когда вы устанавливаете scalar
значение к false
. Для скалярных входных параметров выберите область значений для входа varRValue
значения и установленный значение фактора децимации, R
, к максимальному ожидаемому фактору децимации. Для векторных входных параметров входные данные должны быть вектор-столбцом размера 1 - 64. R
должен быть целочисленный размер входного кадра кратного.
R = 8; % Decimation factor M = 1; % Differential delay N = 3; % Number of sections scalar = false; % true for scalar; false for vector if scalar varRValue = [4,R]; vecSize = 1; modelname = 'HDLCICDecimationModel'; else varRValue = R; fac = (factor(R)); vecSize = fac(randi(length(fac),1,1)); modelname = 'HDLCICDecimationModelVectorSupport'; end numFrames = length(varRValue); dataSamples = cell(1,numFrames); varRtemp = cell(1,numFrames); cicFcnOutput = []; WL = 0; % Word length FL = 0; % Fraction length
dsp.CICDecimation
Система Object™Сгенерируйте системы координат случайных входных выборок и предоставьте их, как введено dsp.CICDecimation
Системный объект. Выход, сгенерированный от этого Системного объекта, используется в качестве справочных данных для сравнения. Этот Системный объект не поддерживает переменный уровень децимации, таким образом, необходимо создать и выпустить этот объект для любого изменения в значении фактора децимации.
for i = 1:numFrames framesize = varRValue(i)*randi([5 20],1,1); dataSamples{i} = fi(randn(vecSize,framesize),1,16,8); varRtemp{i} = fi(varRValue(i)*ones(framesize,1),0,12,0); obj = dsp.CICDecimator('DifferentialDelay',M,'NumSections',N,'DecimationFactor',varRValue(i)); cicOut = step(obj,dataSamples{i}(:)).'; WL = max([WL,cicOut.WordLength]); FL = max([FL,cicOut.FractionLength]); cicFcnOutput = [fi(cicFcnOutput,1,WL,FL),cicOut]; release(obj); end
Сгенерируйте поток выборок путем преобразования систем координат в выборки. Обеспечьте те выборки (sampleIn
) и допустимый сигнал (validIn
) как вводит к модели Simulink. Задержка блока для скалярных и векторных входных параметров вычисляется на основе типа входа и количества разделов, N
. Для получения дополнительной информации о задержке, смотрите параметр коррекции Усиления. Чтобы сбросить остающиеся данные, запустите модель путем вставки необходимого количества неактивных циклов после каждой системы координат с помощью idlecyclesbetweenframes
значение.
idlecyclesbetweensamples = 0; idlecyclesbetweenframes = floor((vecSize-1)*(N/vecSize))+1 + N + (2+(vecSize+1)*N) + 9; sampleIn = []; validIn = []; varRIn = []; len = 0; for ij = 1:numFrames dataInFrame = dataSamples{ij}; if scalar len = length(dataInFrame); else len = size(dataInFrame,2); end data = []; valid=[]; varR = []; for ii = 1:len data = [data dataInFrame(:,ii) ... zeros(vecSize,idlecyclesbetweensamples)]; valid = [valid true(1,1) ... false(1,idlecyclesbetweensamples)]; varR = [varR varRtemp{ij}(ii) ... zeros(1,idlecyclesbetweensamples)]; end sampleIn = cast([sampleIn,data,zeros(vecSize,idlecyclesbetweenframes)],'like',dataInFrame); validIn = logical([validIn,valid,zeros(1,idlecyclesbetweenframes)]); varRIn = fi([varRIn,varR,zeros(1,idlecyclesbetweenframes)],0,12,0); end sampletime = 1; simTime = length(validIn);
Запустите модель. Выполнение модели импортирует переменные входного сигнала от рабочей области MATLAB® до блока CIC Decimation HDL Optimized в модели.
open_system(modelname); sim(modelname);
Получите выход блока Simulink. Сравните это ouput с выходом dsp.CICDecimation
Системный объект.
sampleOut = squeeze(sampleOut_ts.Data).'; validOut = squeeze(validOut_ts.Data); cicOutput = sampleOut(validOut); fprintf('\nHDL CIC Decimation\n'); difference = (abs(cicOutput-cicFcnOutput(1:length(cicOutput)))>0); fprintf('\nTotal number of samples that differed between Simulink block output and MATLAB System object output: %d \n',sum(difference));
HDL CIC Decimation Total number of samples that differed between Simulink block output and MATLAB System object output: 0