dsp.HDLCICDecimation

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

Описание

The 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 до 2048. Это значение представляет скорость, с которой вы хотите децимировать вход.

Когда вы устанавливаете 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. The 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. The VariableDownsample для свойства задано значение true.

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

расширить все

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

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

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

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

Типы данных: logical

Задает частоту десятикратного уменьшения.

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

Зависимости

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

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

Очистить внутренние состояния, заданные как логический скаляр.

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

Зависимости

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

Типы данных: logical

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

расширить все

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

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

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

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

Типы данных: logical

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

Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем 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

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

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

Алгоритмы

расширить все

Ссылки

[1] Hogenauer, E. «Economical Class of Цифровые Фильтры for Decimation and Interpolation». Транзакции IEEE по акустике, речи и обработке сигналов 29, № 2 (апрель 1981): 155-62. https://doi.org/10.1109/TASSP.1981.1163535.

Введенный в R2019b