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

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

Введение

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

КИХ-создание фильтра

КИХ-фильтр lowpass имеет следующие технические требования:

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

  • Центральная частота: 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)

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

Свойства фиксированной точки фильтра содержатся в 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)

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)

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, подразумевая, что меньше касаний требуется, чтобы реализовать новый КИХ-фильтр. Если вы все еще хотите высокое минимальное затухание в полосе задерживания, не идя на компромисс на количестве битов для коэффициентов, необходимо ослабить другое ограничение создания фильтра: ширина перехода. Увеличение ширины перехода может позволить вам получить более высокое затухание с тем же содействующим размером слова. Однако почти невозможно достигнуть больше чем 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