Реализуйте децимирующий фильтр CIC для HDL

В этом примере показано, как использовать блок CIC Decimation HDL Optimized, чтобы отфильтровать и проредить данные. Можно сгенерировать HDL-код от подсистемы в модели Simulink(R).

  1. Сгенерируйте системы координат случайных входных выборок.

  2. Сгенерируйте ссылочные выходные данные от dsp.CICDecimation Система object™.

  3. Запустите модель Simulink, которая содержит блок CIC Decimation HDL Optimized.

  4. Сравните выходные данные блока 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 

Смотрите также

Блоки