Реализуйте децимирующий фильтр 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. Сравните это значение с выходом 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 

См. также

Блоки