В этом примере показано, как использовать блок 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
Сгенерируйте поток выборок путем преобразования систем координат в выборки. Предоставьте эти выборки (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 ® в блок CIC Decimation HDL Optimized в модели.
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