exponenta event banner

Оптимизация программируемых ресурсов фильтра FIR

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

Блок оптимизации HDL дискретного КИХ-фильтра оптимизирует использование ресурсов, когда коэффициенты фильтра являются симметричными или антисимметричными или имеют нулевое значение. Чтобы использовать эти оптимизации с программируемыми коэффициентами, все векторы входных коэффициентов должны иметь одинаковую симметрию и расположения нулевых коэффициентов. Задайте для параметра прототипа Коэффициенты представительный вектор коэффициентов. Блок использует прототип для оптимизации фильтра путем совместного использования множителей для симметричных или антисимметричных коэффициентов и удаления множителей для нулевых коэффициентов.

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

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

Коэффициенты симметричного фильтра

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

modelname = 'ProgFIRHDLOptim';
open_system(modelname);

Поскольку оба набора коэффициентов симметричны одним и тем же образом, можно использовать параметр прототипа коэффициента блока оптимизации HDL дискретного КИХ-фильтра для уменьшения числа умножителей в реализации фильтра. Установите прототип коэффициента в любой из векторов коэффициентов. Пример модели задает для прототипа значение hpNumerator.

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

open_system('ProgFIRHDLOptim/HDL Algorithm');

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

T = 512;
sim(modelname);

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

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

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

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

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. Эта функция позволяет просмотреть количество множителей в реализации фильтра. В этом случае, поскольку фильтр оптимизирует для коэффициентов симметрии и нулевых значений, реализация использует 12 умножителей, а не 43.

См. также

Блоки