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

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® до блока CIC Decimation HDL Optimized в модели.

open_system(modelname);
sim(modelname);

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

Получите выход блока 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 

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

Блоки