В этом примере показано, как использовать блок CIC Decimation HDL Optimized, чтобы отфильтровать и проредить данные. Можно сгенерировать HDL-код от подсистемы в модели Simulink(R).
Сгенерируйте системы координат случайных входных выборок.
Сгенерируйте ссылочные выходные данные от dsp.CICDecimation
Система object™.
Запустите модель Simulink, которая содержит блок CIC Decimation HDL Optimized.
Сравните выходные данные блока Simulink со справочными данными.
Настройте параметры входных данных. Модель использует эти переменные рабочей области, чтобы сконфигурировать блок CIC Decimation HDL Optimized. Блок поддерживает переменный фактор децимации, заданный во входном порту. Выберите область значений для входа decimFactor и установите параметр фактора Децимации блока к максимальному ожидаемому фактору децимации.
R = 8; % Decimation factor M = 1; % Differential delay N = 3; % Number of sections varRValue = [4,R]; numFrames = length(varRValue); dataSamples = cell(1,numFrames); varRtemp = cell(1,numFrames); cicFcnOutput = []; WL = 0; % Word length FL = 0; % Fraction length
Сгенерируйте системы координат случайных входных выборок. Чтобы сгенерировать ссылочные выходные данные для сравнения, примените выборки к dsp.CICDecimation
Системный объект. Этот объект не поддерживает переменный уровень децимации, таким образом, необходимо создать и выпустить объект для каждого изменения в факторе децимации.
for i = 1:numFrames framesize = varRValue(i)*randi([5 20],1,1); dataSamples{i} = fi(randn(framesize,1),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
) как введено к модели Simulink наряду с соответствующим допустимым сигналом (validIn
) и уровень децимации (varRIn
).
idlecyclesbetweensamples = 0; idlecyclesbetweenframes = 4+N; % The block has a latency of 3+N cycles for fixed decimation rate and 4+N % for variable decimation rates when Gain correction is Off. To flush % remaining data before changing the decimation rate, run the model by % inserting required number of idle cycles after each frame. sampleIn = []; validIn = []; varRIn = []; for ij = 1:numFrames dataInFrame = dataSamples{ij}; data = []; valid=[]; varR = []; for ii = 1:length(dataInFrame) data = [data dataInFrame(ii) ... zeros(1,idlecyclesbetweensamples)]; valid = [valid true(1,1) ... false(1,idlecyclesbetweensamples)]; varR = [varR varRtemp{ij}(ii) ... zeros(1,idlecyclesbetweensamples)]; end sampleIn = cast([sampleIn,data,zeros(1,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);
Запустите модель Simulink.
modelname = 'HDLCICDecimationModel';
open_system(modelname);
sim(modelname);
Получите выходные данные из модели Simulink и сравните ее с выходом от 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 differed between Simulink block output and MATLAB function output is: %d \n',sum(difference));
HDL CIC Decimation Total number of samples differed between Simulink block output and MATLAB function output is: 0