В этом примере показано, как спроектировать фильтры для использования с входом с фиксированной точкой. Пример анализирует эффект квантования коэффициентов на создание фильтра. Для запуска этого примера необходимо иметь software™ Fixed-Point Designer.
Фильтры с фиксированной точкой обычно используются в цифровых сигнальных процессорах, где хранение данных и потребление степени являются ключевыми ограничивающими факторами. С заданными ограничениями программное обеспечение DSP System Toolbox позволяет вам проектировать эффективные фильтры с фиксированной точкой. Фильтр для этого примера является lowpass equiripple конечная импульсная характеристика. Сначала спроектируйте фильтр для входа с плавающей точкой, чтобы получить базовую линию. Можно использовать эту базовую линию для сравнения с фильтром с фиксированной точкой.
Lowpass конечная импульсная характеристика фильтр имеет следующие спецификации:
Частота дискретизации: 2000 Гц
Центральная частота: 450 Гц
Ширина перехода: 100 Гц
Эквириппл- проект
Максимум 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) для коэффициентов и входов. Частотная характеристика фильтра в режиме полной точности показывает это более четко. The 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