exponenta event banner

Внедрение фильтра децимации CIC для HDL

В этом примере показано, как использовать блок 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

Преобразование входных данных в поток образцов и импорт их в модель Simulink ®

Создание потока выборок путем преобразования кадров в выборки. Предоставьте эти образцы (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);

Запустить модель Simulink

Запустите модель. При запуске модели входные сигнальные переменные импортируются из рабочей области MATLAB ® в блок оптимизации децимации HDL CIC в модели.

open_system(modelname);
sim(modelname);

Сравнение вывода блока Simulink с выводом системного объекта MATLAB

Зафиксируйте выходные данные блока 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 

См. также

Блоки