exponenta event banner

dsp. HDLCICDecimation

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

Описание

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

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

Объект System поддерживает вещественные и сложные вводы с фиксированной точкой.

Для фильтрации входных данных с помощью фильтра прореживания CIC, оптимизированного для HDL:

  1. Создать dsp.HDLCICDecimation и задайте его свойства.

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

Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.

Создание

Описание

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

пример

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

Свойства

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

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

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

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

Установить для этого свойства значение true (1) для работы с объектом System с переменной скоростью прореживания, указанной 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, объект System ожидает 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. Объект System ожидает reset аргумент только при установке для свойства ResetIn значения true.

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

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

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

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

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

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

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

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

Задает скорость прореживания.

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

Зависимости

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

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

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

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

Зависимости

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

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

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

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

CIC прореженные выходные данные, возвращенные в виде скаляра.

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

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

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

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

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

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

release(obj)

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

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

Примеры

свернуть все

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

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 Системный объект

Задайте свойства объекта System в соответствии с параметрами входных данных и выполните соответствующую функцию на основе типа ввода. Эти функции работают на потоке выборок данных, а не на кадре. Из этих функций можно создать код 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] Хогенауэр, Е. «Экономичный класс цифровых фильтров для децимации и интерполяции». Транзакции IEEE по акустике, речи и обработке сигналов 29, № 2 (апрель 1981): 155-62. https://doi.org/10.1109/TASSP.1981.1163535.

Представлен в R2019b