Оптимизированные КИХ-фильтры фиксированной точки

В этом примере показано, как оптимизировать КИХ-фильтры фиксированной точки. Оптимизация может относиться к характеристикам ответа фильтра, таким как затухание в полосе задерживания или количество битов, требуемых достигнуть конкретной спецификации. Эта функциональность особенно полезна для пользователей, предназначающихся для оборудования, которые имеют много конфигурируемых коэффициентов определенного wordlength и/или в случаях, обычно найденных на ASICs и FPGAs, где существует большой пробел проекта, чтобы исследовать. Аппаратный разработчик может обычно обменивать больше коэффициентов на меньшее количество битов или наоборот оптимизировать для различного ASICs или FPGAs.

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

  • минимизируйте коэффициенты wordlength,

  • ограничьте коэффициенты wordlength,

  • максимизируйте затухание в полосе задерживания.

Теоретический фон

Алгоритм формирования шума по существу перемещает шум квантования из полосы критической частоты (обычно полоса задерживания) КИХ-фильтра фиксированной точки за счет увеличения его в других полосах. Блок-схема ниже иллюстрирует процесс шумового формирования. По существу коэффициенты фильтра передаются через систему, которая напоминает цифровой фильтр, но с квантизатором в середине. Система вычисляет ошибку квантования для каждого коэффициента, затем передавая ошибку через простого БИХ highpass фильтр, заданный b1, b2 и b3 коэффициентов. 'Круглый' блок округляет вход до самого близкого квантованного значения. После этого квантованное значение вычтено из исходного значения с плавающей точкой. Значения начального состояния в каждом блоке задержки могут быть установлены к случайному шуму между - LSB и +LSB.

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

Минимизируйте коэффициенты Wordlength

Для начала мы хотим определить минимум wordlength КИХ-фильтр фиксированной точки, который выполняет одноступенчатой или многоступенчатой спецификации проекта. Мы берем пример полуленточного фильтра с нормированной шириной перехода.08 и затуханием в полосе задерживания 59 дБ. Проект окна Кайзера дает к 91 коэффициенту с плавающей точкой с двойной точностью, чтобы выполнить техническим требованиям.

TW = .08;   % Transition Width
Astop = 59; % Stopband Attenuation (dB)
f  = fdesign.halfband('TW,Ast',TW,Astop);
Hd = design(f,'kaiserwin');

Чтобы установить базовую линию, мы квантуем фильтр путем установки его свойства 'Arithmetic' на 'фиксированный' и путем итерации на wordlength коэффициентов до минимального значения, которое встречается, технические требования найден. В качестве альтернативы мы можем использовать minimizecoeffwl (), чтобы ускорить процесс. Базовый фильтр фиксированной точки содержит 91 17-битный коэффициент.

Hqbase = minimizecoeffwl(Hd,...
    'MatchRefFilter',true,'NoiseShaping',false, ...
    'Astoptol',0);       % 91 17-bit coefficients, Astop = 59.1 dB

17-битный wordlength непривлекателен для многих аппаратных целей. В определенных ситуациях мы можем смочь пойти на компромисс только при помощи 16-битных коэффициентов. Заметьте однако, что исходной спецификации строго больше не выполняют, поскольку максимальное затухание в полосе задерживания фильтра составляет только 58,8 дБ вместо желаемых 59 дБ.

Hq1 = copy(Hqbase);
Hq1.CoeffWordLength = 16; % 91 16-bit coefficients, Astop = 58.8 dB
m1 = measure(Hq1) %#ok
m1 = 

Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.46                      
3-dB Point       : 0.49074                   
6-dB Point       : 0.5                       
Stopband Edge    : 0.54                      
Passband Ripple  : 0.017157 dB               
Stopband Atten.  : 58.8741 dB                
Transition Width : 0.08                      
 

В качестве альтернативы мы можем установить погрешность, чтобы управлять ошибкой полосы задерживания, которая приемлема. Например, с допуском полосы задерживания.15 дБ мы можем сохранить 3 бита и получить фильтр с 91 14-битным коэффициентом.

Hq2 = minimizecoeffwl(Hd,...
    'MatchRefFilter',true,'NoiseShaping',false, ...
    'Astoptol',.15);      % 91 14-bit coefficients, Astop = 58.8 dB

Сохранение в коэффициентах wordlength происходит в цену проекта фиксированной точки больше соблюдение технических требований. Допуски могут варьироваться от одного приложения до другого, но эта стратегия, возможно, ограничила обращение во многих ситуациях. Мы можем использовать другую степень свободы путем ослабления ограничения 'MatchRefFilter'. Путем установки свойства 'MatchRefFilter' на ложь мы больше не пытаемся совпадать с порядком фильтра (для проектов минимального порядка) или ширина перехода фильтра (для фиксированных проектов порядка) HD. Разрешение модернизации промежуточного фильтра с плавающей точкой приводит к фильтру фиксированной точки, который выполняет техническим требованиям с 93 13-битными коэффициентами. По сравнению со ссылочными проектами фиксированной точки, мы сохраненные 4 бита, но закончился с 2 дополнительными (1 не нуль) коэффициенты.

Hq3 = minimizecoeffwl(Hd,...
    'MatchRefFilter',false,'NoiseShaping',false); % 93 13-bit coefficients

Лучшее решение все же состоит в том, чтобы использовать формирование шума, чтобы максимизировать затухание в полосе задерживания квантованного фильтра. Процедура формирования шума является стохастической. Можно хотеть экспериментировать с опцией 'NTrials' и/или инициализировать RAND для того, чтобы воспроизвести результаты ниже. Поскольку 'MatchRefFilter' является ложным по умолчанию, и 'NoiseShaping' верен, мы можем не использовать их. Оптимизированный фильтр фиксированной точки выполняет техническим требованиям с 91 13-битным коэффициентом. Это представляет сохранение 4 битов по ссылочному проекту фиксированной точки с тем же количеством коэффициентов.

Hq4 = minimizecoeffwl(Hd,'Ntrials',10);  % 91 13-bit coefficients
hfvt = fvtool(Hqbase,Hq4,'ShowReference','off','Color','white');
legend(hfvt,'17-bit Reference Filter','13-bit Noise-Shaped Filter');

Как компромисс шума, сформированного из полосы задерживания, неравномерность в полосе пропускания фильтра шумовой формы увеличивается немного, который обычно является не проблемой. Также обратите внимание, что нет никакого простого отношения неравномерности в полосе пропускания к частоте после того, как формирование шума применяется.

axis([0 0.5060 -0.0109 0.0109])

Ограничьте коэффициенты Wordlength

Мы видели ранее, как мы можем компромисс больше коэффициентов (или большая ширина перехода для проектов с фиксированным порядком фильтра) для меньшие коэффициенты wordlength путем устанавливания параметра 'MatchRefFilter' minimizecoeffwl () метод ко 'лжи'. Мы теперь показываем, как мы можем далее управлять этим компромиссом в случае проекта минимального порядка путем взятия примера многоступенчатого (3 этапа) 8:1 decimator:

fm = fdesign.decimator(8,'lowpass','Fp,Fst,Ap,Ast',0.1,0.12,1,70);
Hm  = design(fm,'multistage','nstages',3);

Примечание: следующие команды в вычислительном отношении интенсивны и могут занять несколько минут, чтобы запуститься.

Мы сначала совпадаем с порядком проекта с плавающей точкой и получаем фильтр фиксированной точки шумовой формы, который выполняет техническим требованиям с:

  • 7 15-битных коэффициентов для первой стадии,

  • 10 13-битных коэффициентов для второго этапа,

  • 65 17-битных коэффициентов для третьей стадии.

Hmref = minimizecoeffwl(Hm,'MatchRefFilter',true);

Позволяя порядку фильтра увеличиться, мы можем уменьшать коэффициенты wordlengths до:

  • 9 9-битных коэффициентов для первой стадии,

  • 10 12-битных коэффициентов для второго этапа,

  • 65 15-битных коэффициентов для третьей стадии.

Hq5 = minimizecoeffwl(Hm,'MatchRefFilter',false);

Для лучшего управления финала wordlengths, мы можем использовать constraincoeffwl () метод. Для многоступенчатых проектов wordlength для каждого этапа может быть ограничен индивидуально. Например, мы ограничиваем каждый этап использовать 10, 12, и 14 битов соответственно. Ограниченный проект выполняет техническим требованиям с:

  • 8 10-битных коэффициентов для первой стадии,

  • 12 12-битных коэффициентов для второго этапа,

  • 68 14-битных коэффициентов для третьей стадии.

WL = [10 12 14];
Hqc = constraincoeffwl(Hm,WL);

Максимизируйте затухание в полосе задерживания

При разработке для механизмов фильтрации полки (ASSPs), которые имеют много конфигурируемых коэффициентов определенного wordlength, желательно максимизировать затухание в полосе задерживания фильтра с данным распоряжением и ограниченным wordlength. В следующем примере мы хотим получить 69 дБ затухания в полосе задерживания с 70-й полуполосой порядка decimator при использовании 14 битов, чтобы представлять коэффициенты.

fh = fdesign.decimator(2,'halfband','N,Ast',70,69);
Hb1 = design(fh,'equiripple');
Warning: This design generates an MFILT object which will be removed in a
future release. To generate an equivalent System object, set the 'SystemObject'
parameter to true.
Syntax: Hs = design(D,...,'SystemObject',true) 

Если мы просто квантуем фильтр с 14-битными коэффициентами, мы получаем только 62,7 дБ затухания.

Hb1.Arithmetic= 'fixed';
Hb1.CoeffWordLength = 14;
mb1 = measure(Hb1) %#ok
mb1 = 

Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.44518                   
3-dB Point       : 0.48816                   
6-dB Point       : 0.5                       
Stopband Edge    : 0.55482                   
Passband Ripple  : 0.010552 dB               
Stopband Atten.  : 62.7048 dB                
Transition Width : 0.10963                   
 

Путем формирования шума из полосы задерживания мы можем улучшить затухание почти на 1,5 дБ к 64,18 дБ, но мы все еще не можем выполнить техническим требованиям.

Hbq1 = maximizestopband(Hb1,14);
mq1 = measure(Hbq1) %#ok
mq1 = 

Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.44373                   
3-dB Point       : 0.48811                   
6-dB Point       : 0.5                       
Stopband Edge    : 0.55529                   
Passband Ripple  : 0.01064 dB                
Stopband Atten.  : 64.1876 dB                
Transition Width : 0.11156                   
 

Следующий шаг к по проекту фильтр с плавающей точкой с 80 дБ затухания. Мы платим цену увеличенного затухания в форме большей ширины перехода. Затухание 14-битного не фильтр шумовой формы, улучшенный от 62,7 дБ до 66,2 дБ, но, все еще не соответствие спецификации.

fh.Astop = 80;
Hb2 = design(fh,'equiripple');
Hb2.Arithmetic= 'fixed';
Hb2.CoeffWordLength = 14;
mb2 = measure(Hb2) %#ok
Warning: This design generates an MFILT object which will be removed in a
future release. To generate an equivalent System object, set the 'SystemObject'
parameter to true.
Syntax: Hs = design(D,...,'SystemObject',true) 

mb2 = 

Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.43464                   
3-dB Point       : 0.48704                   
6-dB Point       : 0.5                       
Stopband Edge    : 0.56536                   
Passband Ripple  : 0.0076847 dB              
Stopband Atten.  : 66.2266 dB                
Transition Width : 0.13073                   
 

Метод формирования шума дает нам фильтр, который наконец выполняет техническим требованиям путем улучшения затухания в полосе задерживания больше чем на 3 дБ с 66,2 дБ до 69,4 дБ.

Hbq2 = maximizestopband(Hb2,14);
mq2 = measure(Hbq2)  %#ok
mq2 = 

Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.43584                   
3-dB Point       : 0.4871                    
6-dB Point       : 0.5                       
Stopband Edge    : 0.56287                   
Passband Ripple  : 0.0053253 dB              
Stopband Atten.  : 69.4039 dB                
Transition Width : 0.12703                   
 

Ширина перехода фильтра фиксированной точки увеличена по сравнению с проектом с плавающей точкой. Это - цена, чтобы заплатить, чтобы получить 69 дБ затухания только с 14-битными коэффициентами, когда это взяло бы 24-битные коэффициенты, чтобы совпадать и с шириной перехода и с затуханием в полосе задерживания проекта с плавающей точкой.

close(hfvt);
hfvt = fvtool(reffilter(Hb1),Hbq2,'ShowReference','off','Color','white');
legend(hfvt,'Floating-Point Filter','14-bit Noise-Shaped Filter');

close(hfvt)

Сводные данные

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

Ссылки

Йенс Йорген Нильсен, Проект КИХ-Цифровых фильтров Linear-Phase Direct-Form с Квантованными Коэффициентами Используя Ошибочные Методы Формирования Спектра, IEEE® Transactions на Акустике, Речи, и Обработке сигналов, Издании 37, № 7, июль 1989, стр 1020 - 1026.

Алан В. Оппенхейм и Рональд В. Шафер, Обработка сигналов Дискретного времени, 2-й выпуск, Prentice Hall, 1999, ISBN 0-13-754920-2.