Оптимизируйте программируемые КИХ-ресурсы фильтра

В этом примере показано, как использовать программируемые коэффициенты с блоком Discrete FIR Filter HDL Optimized и как оптимизировать аппаратные ресурсы для программируемых фильтров.

Блок Discrete FIR Filter HDL Optimized оптимизирует использование ресурса, когда коэффициенты фильтра симметричны или антисимметричны или с нулевым знаком. Чтобы использовать эту оптимизацию с программируемыми коэффициентами, все входные векторы коэффициентов должны иметь ту же симметрию и содействующие местоположения с нулевым знаком. Установите Содействующий прототипный параметр на представительный вектор коэффициентов. Блок использует прототип, чтобы оптимизировать фильтр путем совместного использования множителей для симметричных или антисимметричных коэффициентов и удаления множителей для коэффициентов с нулевым знаком.

Если ваши коэффициенты неизвестны или не ожидаемые совместно использовать симметрию или местоположения с нулевым знаком, установите Содействующий прототип на []. В этом случае блок не оптимизирует множители.

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

Симметричные коэффициенты фильтра

Спроектируйте два КИХ-фильтра, один с ответом lowpass и другим с дополнительным highpass ответом. Оба фильтра нечетно-симметричны и имеют 43 касания.

Fpass = 0.45; % Passband frequency
Fstop = 0.55; % Stopband frequency
Apass = 1;    % Passband attenuation (dB)
Astop = 60;   % Stopband attenuation (dB)

f = fdesign.lowpass('Fp,Fst,Ap,Ast',Fpass,Fstop,Apass,Astop);
Hlp = design(f,'equiripple','FilterStructure','dffir'); % Lowpass
Hhp = firlp2hp(Hlp);                                    % Highpass

hpNumerator = Hlp.Numerator;  %#ok<NASGU>
lpNumerator = Hhp.Numerator;  %#ok<NASGU>

Модель в качестве примера показывает подсистему фильтра с управляющим сигналом переключиться между двумя наборами коэффициентов. Подсистема Алгоритма HDL включает блок Discrete FIR Filter HDL Optimized и два набора коэффициентов, заданных переменными рабочей области, созданными выше.

modelname = 'ProgFIRHDLOptim';
open_system(modelname);

Поскольку оба набора коэффициентов симметричны таким же образом, можно использовать Содействующий прототипный параметр блока Discrete FIR Filter HDL Optimized, чтобы сократить количество множителей в реализации фильтра. Установите Содействующий прототип на любой из векторов коэффициентов. Модель в качестве примера устанавливает прототип на hpNumerator.

Когда вы используете прототип для симметричных коэффициентов, необходимо предоставить только уникальные коэффициенты порту коэффициента. В этом случае фильтр имеет 43 нечетно-симметричных коэффициента, таким образом, входной порт ожидает первую половину коэффициентов, то есть, 22 значений.

open_system('ProgFIRHDLOptim/HDL Algorithm');

Модель переключает коэффициенты каждые 100 циклов. Отфильтрованные выходные данные показывают эффект низких и highpass коэффициентов.

T = 512;
sim(modelname);

Модель сконфигурирована, чтобы включить отчет ресурса из генерации HDL-кода. Это показывает, позволяет вам видеть количество множителей в реализации фильтра. Поскольку блок совместно использует множители для симметричных коэффициентов, реализация фильтра использует 22 множителя, а не 43.

Коэффициенты фильтра с нулевым знаком

Спроектируйте два фильтра полуполосы FIR, один с ответом lowpass и другим с дополнительным highpass ответом. Оба фильтра имеют 43 симметричных касания, где каждое второе касание является нулем. Установите Содействующий прототипный параметр на любой из векторов коэффициентов. Изменение значения рабочей области hpNumerator обновляет прототип в блоке.

Подобно предыдущему случаю задайте 22 coefs во входном порту. Несмотря на то, что никакие множители не существуют для коэффициентов с нулевым знаком для блока, чтобы обеспечить правильное выравнивание коэффициентов, необходимо задать коэффициенты с нулевым знаком в порте.

N = 42;
f = fdesign.halfband('N,Ast',N,Astop);
Hlp = design(f,'equiripple','FilterStructure','dffir'); % Lowpass
Hhp = firlp2hp(Hlp);                                    % Highpass

hpNumerator = Hlp.Numerator;
lpNumerator = Hhp.Numerator;

sim(modelname);

Модель сконфигурирована, чтобы включить отчет ресурса из генерации HDL-кода. Это показывает, позволяет вам видеть количество множителей в реализации фильтра. OIn этот случай, потому что фильтр оптимизирует для симметрии и коэффициентов с нулевым знаком, реализация, использует 12 множителей, а не 43.

Смотрите также

Блоки