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