В этом примере показано, как использовать программируемые коэффициенты с оптимизированным HDL-блоком дискретной конечной импульсной характеристики и как оптимизировать аппаратные ресурсы для программируемых фильтров.
Оптимизированный блок дискретной конечной импульсной характеристики HDL оптимизирует использование ресурсов, когда коэффициенты фильтра симметричны или антисимметричны или имеют нулевое значение. Чтобы использовать эти оптимизации с программируемыми коэффициентами, все векторы входного коэффициента должны иметь одинаковую симметрию и нулевые положения коэффициентов. Установите параметр прототипа Коэффициентов в репрезентативный вектор коэффициентов. Блок использует прототип, чтобы оптимизировать фильтр путем совместного использования умножителей для симметричных или антисимметричных коэффициентов и удаления умножителей для нулевых коэффициентов.
Если ваши коэффициенты неизвестны или не должны разделять симметрию или нулевые местоположения, задайте для прототипа Коэффициентов []
. В этом случае блок не оптимизирует умножители.
В этом примере показано, как задать прототип и задать программируемые коэффициенты для симметричного фильтра и фильтра с нулевыми коэффициентами. Пример также объясняет, как блок уменьшает количество умножителей в фильтре в этих случаях.
Проектируйте две конечные импульсные характеристики, один с 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 включает в себя Оптимизированный блок Дискретной конечной импульсной характеристики HDL и два набора коэффициентов, заданных переменными рабочей области, созданными выше.
modelname = 'ProgFIRHDLOptim';
open_system(modelname);
Поскольку оба набора коэффициентов симметричны одинаково, можно использовать параметр прототипа Коэффициента Оптимизированного блока Дискретной конечной импульсной характеристики HDL, чтобы уменьшить количество умножителей в реализации фильтра. Установите прототип Коэффициента в любой из векторов коэффициентов. Пример модели устанавливает прототип таким образом hpNumerator
.
Когда вы используете прототип для симметричных коэффициентов, необходимо предоставить только уникальные коэффициенты для порта-коэффициента. В этом случае фильтр имеет 43 нечетных симметричных коэффициента, поэтому входа порт ожидает первую половину коэффициентов, то есть 22 значения.
open_system('ProgFIRHDLOptim/HDL Algorithm');
Модель переключает коэффициенты каждые 100 циклов. Отфильтрованные выходные данные показывают эффект низкого и высокого коэффициентов.
T = 512; sim(modelname);
Модель сконфигурирована, чтобы включить отчет ресурса от генерации HDL-кода. Эта функция позволяет вам увидеть количество умножителей в реализации фильтра. Поскольку блок разделяет множители для симметричных коэффициентов, реализация фильтра использует 22 умножителя, а не 43.
Разработайте две полуполосные конечные импульсные характеристики фильтра, один с lowpass ответом, а другой с комплементарной высокочастотной характеристикой. Оба фильтра имеют 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.