dsp.HDLCICDecimation

Десятикратно уменьшите сигнал с помощью каскадного интегрально-гребенчатого фильтра — оптимизированный для генерации HDL-кода

Описание

dsp.HDLCICDecimation Система object™ десятикратно уменьшает входной сигнал при помощи децимирующего фильтра каскадной расчески интегратора (CIC). CIC-фильтры являются классом КИХ-фильтров линейной фазы, состоящих из части расчески и части интегратора. Структура децимирующего фильтра CIC состоит из разделов N каскадных интеграторов, фактора изменения уровня R, и затем разделов N каскадных гребенчатых фильтров. Для получения дополнительной информации о децимирующих фильтрах CIC, см. Алгоритмы.

Поддержки Системного объекта фиксируемые и переменные ставки децимации для скалярных входных параметров и только зафиксированной децимации для векторных входных параметров. Для обоих типов входных параметров Системный объект обеспечивает скалярный выход. Системный объект обеспечивает архитектуру, подходящую для аппаратного развертывания и генерации HDL-кода.

Системный объект поддерживает действительные и комплексные входные параметры фиксированной точки.

Отфильтровать входные данные с оптимизированным HDL децимирующим фильтром CIC:

  1. Создайте dsp.HDLCICDecimation объект и набор его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты?.

Создание

Описание

cicDecFilt = dsp.HDLCICDecimation создает оптимизированный HDL Системный объект децимирующего фильтра CIC, cicDecFilt, со свойствами по умолчанию.

пример

cicDecFilt = dsp.HDLCICDecimation(Name,Value) создает фильтр с набором свойств с помощью одной или нескольких пар "имя-значение". Заключите каждое имя свойства в одинарные кавычки.

Свойства

развернуть все

Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и release функция разблокировала их.

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты.

Установите это свойство на true(1 ) управлять Системным объектом с переменным уровнем децимации, заданным decimFactor входной параметр. Установите это свойство на false(0) управлять объектом с фиксируемой ставкой децимации, заданной DecimationFactor свойство.

Для векторных входных параметров объект не поддерживает переменный уровень децимации.

Задайте фактор децимации как целое число от 2 до 2 048. Это значение представляет уровень, с которым вы хотите десятикратно уменьшить вход.

Когда вы устанавливаете VariableDownsample свойство к true, это наборы свойств верхняя граница области значений допустимых значений для decimFactor аргумент.

Задайте дифференциальную задержку части расчески фильтра как любой 1 или 2 циклы.

Задайте количество разделов или в интеграторе или в части расчески фильтра как целое число от 1 до 6.

Выберите тип данных отфильтрованных выходных данных.

  • 'Full precision' — Тип выходных данных перебрасывается парой слов длина, равная входному размеру слова плюс биты усиления.

  • 'Same word length as input' — Тип выходных данных перебрасывается парой слов длина, равная входному размеру слова.

  • 'Minimum section word lengths' — Тип выходных данных использует размер слова, который вы задаете в свойстве OutputWordLength. Когда вы выбираете эту опцию, Системный объект применяет алгоритм Сокращения внутренне. Для получения дополнительной информации о Сокращении, смотрите Тип Выходных данных. Эта опция не поддерживается когда VariableDownsample true.

Размер слова выхода в виде целого числа от 2 до 104.

Примечание

Когда это значение меньше 7 значения выходных данных могут переполниться.

Зависимости

Чтобы включить это свойство, установите OutputDataType свойство к 'Minimum section word lengths'.

Установите это свойство на true компенсировать выходное усиление фильтра.

В зависимости от типа децимации вы задаете и значение этого свойства, задержка объектных изменений. Здесь, N означает количество разделов, и vecLen означает длину вектора.

Для скалярного входа с фиксированной децимацией (VariableDownsample false):

  • С коррекцией усиления прочь, задержка объекта равняется 3 + такты N.

  • С коррекцией усиления на задержка объекта равняется 3 + N + 9 тактов.

Для скалярного входа с переменной децимацией (VariableDownsample true):

  • С коррекцией усиления прочь, задержка объекта равняется 4 + такты N.

  • С коррекцией усиления на задержка объекта равняется 4 + N + 9 тактов.

Для векторного входа с фиксированной децимацией (VariableDownsample false):

  • С коррекцией усиления прочь, задержкой объекта является floor((vecLen – 1) * (N/vecLen)) + 1 + N + (2 + (vecLen + 1) * такты N.

  • С коррекцией усиления на задержкой объекта является floor((vecLen – 1) * (N/vecLen)) + 1 + N + (2 + (vecLen + 1) * N) + 9 тактов.

Примечание

Для векторных входных параметров объект не поддерживает переменную децимацию.

Когда вы устанавливаете это свойство на true, Системный объект ожидает reset входной параметр.

Использование

Описание

[dataOut,validOut] = cicDecFilt(dataIn,validIn) фильтры и десятикратно уменьшают входные данные с помощью фиксированного фактора децимации только когда validIn true.

[dataOut,validOut] = cicDecFilt(dataIn,validIn,decimFactor) фильтрует входные данные с помощью заданного переменного фактора децимации, decimFactor. VariableDownsample свойство должно быть установлено в true.

[dataOut,validOut] = cicDecFilt(dataIn,validIn,reset) фильтрует входные данные когда reset false и очищает внутренние состояния фильтра когда reset true. Системный объект ожидает reset аргумент только, когда вы устанавливаете свойство ResetIn на true.

[dataOut,validOut] = cicDecFilt(dataIn,validIn,decimFactor,reset) фильтрует входные данные когда reset false и очищает внутренние состояния фильтра когда reset true. Системный объект ожидает reset аргумент только, когда вы устанавливаете свойство ResetIn на true. VariableDownsample свойство установлено в true.

Входные параметры

развернуть все

Задайте входные данные как скаляр или вектор-столбец длины 1 - 64. Входные данные должны быть целым числом со знаком или подписанной фиксированной точкой с размером слова, меньше чем или равным 32. DecimationFactor свойство должно быть целочисленным кратным размер входного кадра.

Типы данных: int8 | int16 | int32 | fi
Поддержка комплексного числа: Да

Управляющий сигнал, который указывает, допустимо ли входные данные.

Когда validIn 1 TRUE), Системный объект получает значение от dataIn входной параметр. Когда validIn 0 ложь), Системный объект игнорирует dataIn входное значение.

Типы данных: логический

Задает уровень децимации.

decimFactor значение должно иметь тип данных ufix12 тип данных и целое число в диапазоне от 2 до DecimationFactor значение свойства.

Зависимости

Чтобы включить этот аргумент, установите свойство VariableDownsample на true.

Типы данных: fi(0,12,0)

Очистите внутренние состояния в виде логического скаляра.

Когда этим значением является 1 TRUE), Системный объект останавливает текущее вычисление и очищает все внутренние состояния. Когда этим значением является 0 ложь) и validIn 1 TRUE), Системный объект запускает новую операцию фильтрации.

Зависимости

Чтобы включить этот аргумент, установите свойство ResetIn на true.

Типы данных: логический

Выходные аргументы

развернуть все

CIC десятикратно уменьшил выходные данные, возвращенные как скаляр.

Наборы свойств OutputDataType тип выходных данных этого аргумента. Смотрите OutputDataType.

Типы данных: int8 | int16 | int32 | fi
Поддержка комплексного числа: Да

Управляющий сигнал, который указывает если данные из dataOut выходной аргумент допустим. Когда этим значением является 1 TRUE), Системный объект возвращает допустимые данные из dataOut выходной аргумент. Когда этим значением является 0 ложь), значения dataOut выходной аргумент не допустим.

Типы данных: логический

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

getLatencyЗадержка децимирующего фильтра CIC
stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

свернуть все

В этом примере показано, как использовать dsp.HDLCICDecimation Система object™, чтобы отфильтровать и проредить данные. Этот скаляр поддержки объектов и векторные входные параметры. В этом примере две функции обеспечиваются, чтобы работать со скалярными и векторными входными данными отдельно. Можно сгенерировать HDL-код от этих функций.

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

Настройте эти переменные рабочей области для объекта использовать. Поддержка объектов фиксируемые и переменные ставки децимации для скалярных входных параметров и только фиксируемая ставка децимации для векторных входных параметров. Пример запускает HDLCIC_maxR8 функционируйте, когда вы установите скалярную переменную на true и запускает HDLCIC_vec функционируйте, когда вы установите скалярную переменную на 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 = [2, 4, 5, 6, 7, 8];
    vecSize = 1;
else
    varRValue = R;
    fac = (factor(R));
    vecSize = fac(randi(length(fac),1,1));
end

numFrames = length(varRValue);
dataSamples = cell(1,numFrames);
varRtemp = cell(1,numFrames);
framesize = zeros(1,numFrames);
refOutput = [];
WL = 0; % Word length
FL = 0; % Fraction length

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

Сгенерируйте системы координат случайных входных выборок и примените выборки к dsp.CICDecimation Системный объект. Выход, сгенерированный от этого Системного объекта, используется в качестве справочных данных для сравнения. Системный объект не поддерживает переменный уровень децимации, таким образом, необходимо создать и выпустить объект для каждого изменения в значении фактора децимации.

totalsamples = 0;
for i = 1:numFrames
    framesize(i) = varRValue(i)*randi([5 20],1,1);
    dataSamples{i} = fi(randn(vecSize,framesize(i)),1,16,8);
    ref_cic = dsp.CICDecimator('DifferentialDelay',M,...
        'NumSections',N,...
        'DecimationFactor',varRValue(i));
    refOutput = [refOutput,ref_cic(dataSamples{i}(:)).'];
    release(ref_cic);
end

Запустите Функцию, которая содержит dsp.HDLCICDecimation Системный объект

Установите свойства Системного объекта совпадать с параметрами входных данных и запустить соответствующую функцию на основе входного типа. Эти функции работают с потоком выборок данных, а не системы координат. Можно сгенерировать HDL-код от этих функций.

Пример использует HDLCIC_maxR8 функция для скалярного входа.

function [dataOut,validOut] = HDLCIC_maxR8(dataIn,validIn,R)
%HDLCIC_maxR8
% Performs CIC decimation with an input decimation factor up to 8. 
% sampleIn is a scalar fixed-point value.
% validIn is a logical scalar value.
% You can generate HDL code from this function.

  persistent cic8;
  if isempty(cic8)
    cic8 = dsp.HDLCICDecimation('DecimationFactor',8,...
                                'VariableDownsample',true,...
                                'DifferentialDelay',1,...
                                'NumSections',3);
  end    
  [dataOut,validOut] = cic8(dataIn,validIn,R);
end

Пример использует HDLCIC_vec функция для векторного входа.

function [dataOut,validOut] = HDLCIC_vec(dataIn,validIn)
%HDLCIC_vec
% Performs CIC decimation with an input vector. 
% sampleIn is a fixed-point vector.
% validIn is a logical scalar value.
% You can generate HDL code from this function.

  persistent cicVec;
  if isempty(cicVec)
    cicVec = dsp.HDLCICDecimation('DecimationFactor',8,...
                                'VariableDownsample',false,...
                                'DifferentialDelay',1,...
                                'NumSections',3);
  end    
  [dataOut,validOut] = cicVec(dataIn,validIn);
end

Чтобы сбросить остающиеся данные, запустите объект путем вставки необходимого количества неактивных циклов после каждой системы координат через latency переменная. Для получения дополнительной информации смотрите свойство GainCorrection.

Инициализируйте выход к размеру, достаточно большому, чтобы вместить выходные данные. Итоговый размер, как ожидают, будет меньшим, чем totalsamples из-за децимации.

latency = floor((vecSize - 1)*(N/vecSize))+ 1+ N +(2+(vecSize + 1)*N)+ 9;
dataOut = zeros(1,totalsamples+numFrames*latency);
validOut = zeros(1,totalsamples+numFrames*latency);
idx=0;
for ij = 1:numFrames
    if scalar
        % scalar input with variable decimation
        for ii = 1:length(dataSamples{ij})
            idx = idx+1;
            [dataOut(idx),validOut(idx)] = HDLCIC_maxR8(...
                dataSamples{ij}(ii),...
                true,...
                fi(varRValue(ij),0,12,0));
        end
        for ii = 1:latency
            idx = idx+1;
            [dataOut(idx),validOut(idx)] = HDLCIC_maxR8(...
                fi(0,1,16,8),...
                false,...
                fi(varRValue(ij),0,12,0));
        end

    else
        % vector input with fixed decimation
        for ii = 1:size(dataSamples{ij},2)
            idx = idx+1;
            [dataOut(idx),validOut(idx)] = HDLCIC_vec(...
                dataSamples{ij}(:,ii),...
                true);
        end
        for ii = 1:latency
            idx = idx+1;
            [dataOut(idx),validOut(idx)] = HDLCIC_vec(...
                fi(zeros(vecSize,1),1,16,8),...
                false);
        end
    end
end

Сравните функциональный Выход со справочными данными

Сравните функциональные результаты с выходом от dsp.CICDecimation объект.

cicOutput = dataOut(validOut==1);

fprintf('\nHDL CIC Decimation\n');
difference = (abs(cicOutput-refOutput(1:length(cicOutput)))>0);
fprintf('\nTotal number of samples differed between Behavioral and HDL simulation: %d \n',sum(difference));
HDL CIC Decimation

Total number of samples differed between Behavioral and HDL simulation: 0 

Задержка dsp.HDLCICDecimation Система object™ варьируется в зависимости от того, сколько интегратора и разделы расчески ваш фильтр имеет, размер входного вектора, и разрешаете ли вы коррекцию усиления. Используйте getLatency функционируйте, чтобы найти задержку особой настройки фильтра. Задержка является количеством циклов между первым допустимым входом и первым допустимым выходом, принимая, что вход постоянно допустим.

Создайте dsp.HDLCICDecimation Система object™ и запрос задержка. Фильтр по умолчанию имеет два раздела, и коррекция усиления отключена.

hdlcic = dsp.HDLCICDecimation
hdlcic = 
  dsp.HDLCICDecimation with properties:

    VariableDownsample: false
      DecimationFactor: 2
     DifferentialDelay: 1
           NumSections: 2
        OutputDataType: 'Full precision'
        GainCorrection: false
               ResetIn: false

L_def = getLatency(hdlcic)
L_def = 5

Измените объект фильтра, чтобы иметь три интегратора и разделы расчески. Проверяйте получившееся изменение в задержку.

hdlcic.NumSections = 3;
L_3sec = getLatency(hdlcic)
L_3sec = 6

Включите коррекцию усиления на объекте фильтра с векторным входным размером 2. Проверяйте получившееся изменение в задержку.

hdlcic.GainCorrection = true;
vecSize = 2;
L_wgain = getLatency(hdlcic,vecSize)
L_wgain = 25

Алгоритмы

развернуть все

Ссылки

[1] Hogenauer, E. “Экономичный Класс Цифровых фильтров для Децимации и Интерполяции”. Транзакции IEEE на Акустике, Речи и Обработке сигналов 29, № 2 (апрель 1981): 155–62. https://doi.org/10.1109/TASSP.1981.1163535.

Введенный в R2019b