Оптимизированные конечная импульсная характеристика с фиксированной точкой

Этот пример показывает, как оптимизировать конечная импульсная характеристика с фиксированной точкой. Оптимизация может относиться к характеристикам фильтра, таким как затухание в полосе задерживания или количество бит, требуемых для достижения конкретной спецификации. Эта функциональность особенно полезна для пользователей, нацеленных на оборудование, которые имеют ряд конфигурируемых коэффициентов определенной длины слова и/или в случаях, обычно обнаруженных на ASIC и FPGA, где существует большое пространство для проекта. Дизайнер оборудования обычно может компромиссировать больше коэффициентов для меньших бит или наоборот, чтобы оптимизировать для различных ASIC или FPGA.

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

  • минимизируйте словосочетание коэффициентов,

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

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

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

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

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

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

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

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

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

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

17-битная длина слова недоступна для многих аппаратных целей. В определенных ситуациях мы можем пойти на компромисс, используя только 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' false, мы больше не пытаемся соответствовать порядку фильтра (для проектов минимального порядка) или ширине перехода фильтра (для проектов фиксированного порядка) Hd. Разрешение перепроектирования промежуточного фильтра с плавающей точкой приводит к фильтру с фиксированной точкой, который удовлетворяет спецификациям с 93 13-битными коэффициентами. По сравнению с ссылкой проектами с фиксированной точкой мы сэкономили 4 бита, но в итоге получили 2 дополнительных (1 не нуля) коэффициента.

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

Лучшим решением еще является использование формирования шума для максимального затухания в полосе задерживания квантованного фильтра. Процедура формирования шума является стохастической. Можно хотеть экспериментировать с опцией 'NTrials' и/или инициализировать RAND в порядок, чтобы воспроизвести результаты ниже. Поскольку 'MatchRefFilter' по умолчанию является false, а 'NoiseShaping' - true, мы можем их опустить. Оптимизированный фильтр с фиксированной точкой соответствует спецификациям с 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 () на 'false'. Теперь мы покажем, как мы можем дополнительно контролировать этот компромисс в случае проекта минимального порядка, взяв пример многоступенчатого (3 этапа) дециматора 8:1:

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);

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

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

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

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

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

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

При разработке механизмов фильтрации полок (ASSP), которые имеют ряд конфигурируемых коэффициентов определенной длины слова, желательно максимизировать затухание в полосе задерживания фильтра с заданным порядком и ограниченной длиной слова. В следующем примере мы хотим получить 69 дБ затухания в полосе задерживания с дециматором 70-го порядка с полуполосой при использовании 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 коэффициентов однокаскадного или многоступенчатого фильтра конечной импульсной характеристики фиксированной точкой или как его можно использовать, чтобы максимизировать затухание в полосе задерживания вместо этого. Мы также видели, как биты могут торговаться для больших коэффициентов в случае проектов минимального порядка или для большей ширины перехода в случае проектов с фиксированным порядком.

Ссылки

Йенс Йорген Нильсен, Проект линейно-фазовых прямых конечных импульсных характеристик цифровых фильтров с квантованными коэффициентами с использованием методов формирования спектра ошибок, транзакций IEEE ® по акустике, речи и обработке сигналов, том 37, № 7, июль 1989, стр. 10

Alan V. Oppenheim and Ronald W. Schafer, Discrete-Time Signal Processing, 2-е издание, Prentice Hall, 1999, ISBN 0-13-754920-2.