exponenta event banner

Проектирование фильтра с фиксированной точкой в MATLAB

В этом примере показано, как проектировать фильтры для использования с вводом с фиксированной точкой. В примере анализируется влияние квантования коэффициентов на конструкцию фильтра. Для выполнения этого примера необходимо иметь software™ Fixed-Point Designer.

Введение

Фильтры с фиксированной точкой обычно используются в процессорах цифровых сигналов, где хранение данных и потребление энергии являются ключевыми ограничивающими факторами. С помощью указанных ограничений программное обеспечение DSP System Toolbox позволяет проектировать эффективные фильтры с фиксированной точкой. Фильтром для этого примера является низкочастотный эквиптный КИХ-фильтр. Сначала создайте фильтр для ввода с плавающей запятой для получения базовой линии. Эту базовую линию можно использовать для сравнения с фильтром с фиксированной точкой.

Конструкция фильтра FIR

Фильтр FIR нижних частот имеет следующие характеристики:

  • Частота дискретизации: 2000 Гц

  • Центральная частота: 450 Гц

  • Ширина перехода: 100 Гц

  • Конструкция Equiripple

  • Максимум 1 дБ пульсации в полосе пропускания

  • Минимум 80 дБ затухания в полосе останова

samplingFrequency = 2000;
centerFrequency = 450;
transitionWidth = 100;
passbandRipple = 1;
stopbandAttenuation = 80;

designSpec = fdesign.lowpass('Fp,Fst,Ap,Ast',...
    centerFrequency-transitionWidth/2, ...
    centerFrequency+transitionWidth/2, ...
    passbandRipple,stopbandAttenuation, ...
    samplingFrequency);
LPF = design(designSpec,'equiripple','SystemObject',true)
LPF = 
  dsp.FIRFilter with properties:

            Structure: 'Direct form'
      NumeratorSource: 'Property'
            Numerator: [1x52 double]
    InitialConditions: 0

  Show all properties

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

fvtool(LPF)

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains 2 objects of type line.

Операция с фиксированной точкой полной точности

Свойства фильтра с фиксированной точкой содержатся в Fixed-point properties в отображении объекта. По умолчанию фильтр использует арифметику полной точности для обработки входных данных с фиксированной точкой. При арифметике с полной точностью фильтр использует столько битов для произведения, накопителя и выходного сигнала, сколько необходимо для предотвращения переполнения или округления. Если не требуется использовать арифметику полной точности, можно задать FullPrecisionOverride свойство для false а затем независимо устанавливать типы данных продукта, накопителя и выходных данных.

rng default
inputWordLength = 16;
fixedPointInput = fi(randn(100,1),true,inputWordLength);
floatingPointInput = double(fixedPointInput);
floatingPointOutput = LPF(floatingPointInput);

release(LPF)
fullPrecisionOutput = LPF(fixedPointInput);
norm(floatingPointOutput-double(fullPrecisionOutput),'inf')
ans = 6.8994e-05

Результат фильтрации с полной точностью с фиксированной точкой очень близок к плавающей точке, но результаты не точны. Причиной этого является квантование коэффициентов. В фильтре с фиксированной точкой CoefficientsDataType свойство имеет одинаковую длину слова (16) для коэффициентов и входных данных. Частотная характеристика фильтра в режиме полной точности показывает это более ясно. measure функция показывает, что минимальное затухание полосы останова этого фильтра с квантованными коэффициентами равно 76,6913 дБ, что меньше 80 дБ, заданного для фильтра с плавающей запятой.

LPF.CoefficientsDataType
ans = 
'Same word length as input'
fvtool(LPF)

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains 3 objects of type line. These objects represent Filter #1: Quantized, Filter #1: Reference.

measure(LPF)
ans = 
Sample Rate      : 2 kHz      
Passband Edge    : 400 Hz     
3-dB Point       : 416.2891 Hz
6-dB Point       : 428.1081 Hz
Stopband Edge    : 500 Hz     
Passband Ripple  : 0.96325 dB 
Stopband Atten.  : 76.6913 dB 
Transition Width : 100 Hz     
 

Фильтр в последний раз использовался со входом с фиксированной точкой и все еще находится в заблокированном состоянии. По этой причине fvtool отображает частотную характеристику с фиксированной точкой. Отклик тире-точки является откликом эталонного фильтра с плавающей запятой, а сплошной график является откликом фильтра, который использовался при вводе с фиксированной запятой. Требуемый частотный отклик не может быть согласован, поскольку длина слова коэффициента ограничена 16 битами. Это объясняет разницу между конструкциями с плавающей и фиксированной точками. Увеличение числа битов, разрешенных для длины слова коэффициента, делает ошибку квантования меньшей и позволяет соответствовать проектным требованиям для 80 дБ затухания полосы останова. Используйте коэффициент длины слова 24 бита для достижения ослабления 80,1275 дБ.

LPF24bitCoeff = design(designSpec,'equiripple','SystemObject',true);
LPF24bitCoeff.CoefficientsDataType = 'Custom';
coeffNumerictype = numerictype(fi(LPF24bitCoeff.Numerator,true,24));
LPF24bitCoeff.CustomCoefficientsDataType = numerictype(true, ...
            coeffNumerictype.WordLength,coeffNumerictype.FractionLength);
fullPrecisionOutput32bitCoeff = LPF24bitCoeff(fixedPointInput);
norm(floatingPointOutput-double(fullPrecisionOutput32bitCoeff),'inf')
ans = 4.1077e-07
fvtool(LPF24bitCoeff)

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains 3 objects of type line. These objects represent Filter #1: Quantized, Filter #1: Reference.

measure(LPF24bitCoeff)
ans = 
Sample Rate      : 2 kHz      
Passband Edge    : 400 Hz     
3-dB Point       : 416.2901 Hz
6-dB Point       : 428.1091 Hz
Stopband Edge    : 500 Hz     
Passband Ripple  : 0.96329 dB 
Stopband Atten.  : 80.1275 dB 
Transition Width : 100 Hz     
 

Расчетные параметры и квантование коэффициентов

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

LPF14bitCoeff = design(designSpec,'equiripple','SystemObject',true);
coeffNumerictype = numerictype(fi(LPF14bitCoeff.Numerator,true,14));
LPF14bitCoeff.CoefficientsDataType = 'Custom';
LPF14bitCoeff.CustomCoefficientsDataType = numerictype(true, ...
            coeffNumerictype.WordLength,coeffNumerictype.FractionLength);
measure(LPF14bitCoeff,'Arithmetic','fixed')
ans = 
Sample Rate      : 2 kHz      
Passband Edge    : 400 Hz     
3-dB Point       : 416.2939 Hz
6-dB Point       : 428.1081 Hz
Stopband Edge    : 500 Hz     
Passband Ripple  : 0.96405 dB 
Stopband Atten.  : 67.2987 dB 
Transition Width : 100 Hz     
 

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

designSpec.Astop = 60;   
LPF60dBStopband = design(designSpec,'equiripple','SystemObject',true);
LPF60dBStopband.CoefficientsDataType = 'Custom';
coeffNumerictype = numerictype(fi(LPF60dBStopband.Numerator,true,14));
LPF60dBStopband.CustomCoefficientsDataType = numerictype(true, ...
            coeffNumerictype.WordLength,coeffNumerictype.FractionLength);
measure(LPF60dBStopband,'Arithmetic','fixed')
ans = 
Sample Rate      : 2 kHz      
Passband Edge    : 400 Hz     
3-dB Point       : 419.3391 Hz
6-dB Point       : 432.9718 Hz
Stopband Edge    : 500 Hz     
Passband Ripple  : 0.92801 dB 
Stopband Atten.  : 59.1829 dB 
Transition Width : 100 Hz     
 
order(LPF14bitCoeff)
ans = 51
order(LPF60dBStopband)
ans = 42

Порядок фильтров уменьшается с 51 до 42, подразумевая, что для реализации нового фильтра FIR требуется меньше отводов. Если по-прежнему требуется высокое минимальное затухание полосы останова без ущерба для количества битов для коэффициентов, необходимо ослабить другое ограничение конструкции фильтра: ширину перехода. Увеличение ширины перехода может позволить получить более высокое затухание при одинаковой длине слова коэффициента. Однако практически невозможно достичь более 5 дБ на бит длины слова коэффициента даже после ослабления ширины перехода.

designSpec.Astop = 80;    
transitionWidth = 200;
designSpec.Fpass = centerFrequency-transitionWidth/2;
designSpec.Fstop = centerFrequency+transitionWidth/2;
LPF300TransitionWidth = design(designSpec,'equiripple', ...
                               'SystemObject',true);
LPF300TransitionWidth.CoefficientsDataType = 'Custom';
coeffNumerictype = numerictype(fi(LPF300TransitionWidth.Numerator, ...
                                  true, 14));
LPF300TransitionWidth.CustomCoefficientsDataType = numerictype(true, ...
            coeffNumerictype.WordLength,coeffNumerictype.FractionLength);
measure(LPF300TransitionWidth,'Arithmetic','fixed')
ans = 
Sample Rate      : 2 kHz      
Passband Edge    : 350 Hz     
3-dB Point       : 385.4095 Hz
6-dB Point       : 408.6465 Hz
Stopband Edge    : 550 Hz     
Passband Ripple  : 0.74045 dB 
Stopband Atten.  : 74.439 dB  
Transition Width : 200 Hz     
 

Как вы видите, увеличение ширины перехода до 200 Гц позволяет 74,439 дБ затухания полосы останова с 14-битными коэффициентами, по сравнению с 67,2987 дБ, достигнутыми, когда ширина перехода была установлена на 100 Гц. Дополнительным преимуществом увеличения ширины перехода является то, что порядок фильтрации также уменьшается, в данном случае с 51 до 27.

order(LPF300TransitionWidth)
ans = 27