exponenta event banner

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

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

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

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

  • ограничение коэффициента длины слова,

  • максимизация затухания полосы останова.

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

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

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

Минимизация длины слова коэффициентов

Для начала мы хотим определить минимальный фильтр FIR с фиксированной длиной слова, который соответствует одноступенчатой или многоступенчатой спецификации конструкции. Возьмем пример полуполосного фильтра с нормированной шириной перехода 0.08 и затуханием стоп-полосы 59 дБ. Конструкция окна Кайзера дает 91 коэффициент с двойной точностью с плавающей запятой для соответствия спецификациям.

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

Чтобы установить базовую линию, квантуем фильтр, установив для его свойства «Арифметика» значение «Фиксированная» и выполняя итерацию относительно длины слова коэффициентов до тех пор, пока не будет найдено минимальное значение, соответствующее спецификациям. В качестве альтернативы можно использовать минимизекоффл () для ускорения процесса. Фильтр с фиксированной точкой базовой линии содержит 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                      
 

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

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

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

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

Лучшим решением является использование формирования шума для максимизации ослабления полосы останова квантованного фильтра. Процедура формирования шума является стохастической. Вы можете поэкспериментировать с опцией «NTrials» и/или инициализировать RAND, чтобы воспроизвести результаты ниже. Поскольку «MatchRefFilter» по умолчанию имеет значение false, а «NoureShaping» - 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])

Ограничение коэффициента длины слова

Ранее мы видели, как мы можем отбросить больше коэффициентов (или большую ширину перехода для конструкций с фиксированным порядком фильтра) для меньшей длины слова коэффициентов, установив для параметра «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);

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

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

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

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

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

Для лучшего контроля конечных длин слов можно использовать метод constraincoeffwl (). Для многоступенчатых конструкций длина слова для каждой ступени может быть ограничена по отдельности. Например, мы ограничиваем каждый этап использованием 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)

Резюме

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

Ссылки

Йенс Йорген Нильсен (Jens Jorgen Nielsen), разработка линейных однофазных цифровых КИХ-фильтров с квантованными коэффициентами с использованием методов формирования спектра ошибок, транзакции IEEE ® по акустике, обработке речи и сигналов, том 37, № 7, июль 1989 г., стр. 1020-1026.

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