主要内容

MATLAB中的定点滤波器设计

这个例子展示了如何设计用于定点输入的过滤器。算例分析了系数量化对滤波器设计的影响。要运行此示例,必须使用定点设计器软件™。

介绍

定点滤波器通常用于数字信号处理器,其中数据存储和功耗是关键的限制因素。在您指定的约束条件下,DSP系统工具箱软件允许您设计有效的定点滤波器。这个例子中的滤波器是一个低通等纹波FIR滤波器。设计滤波器首先为浮点输入,以获得基线。您可以使用此基线与定点筛选器进行比较。

数字滤波器设计

低通FIR滤波器有以下规格:

  • 采样频率:2000hz

  • 中心频率:450hz

  • 过渡宽度:100hz

  • Equiripple设计

  • 通频带的最大纹波为1db

  • 在阻带中衰减最小为80分贝

samplingFrequency = 2000;centerFrequency = 450;transitionWidth = 100;passbandRipple = 1;stopbandAttenuation = 80;designSpec = fdesign.lowpass (“Fp,置,美联社,Ast”...centerFrequency-transitionWidth / 2,...centerFrequency + transitionWidth / 2,...passbandRipple stopbandAttenuation,...samplingFrequency);LPF =设计(designSpec,“equiripple”...“SystemObject”,真正的)
LPF = dsp。FIRFilter with properties: Structure: 'Direct form' NumeratorSource: 'Property' Numerator:[-0.0013 -0.0055 -0.0112 -0.0125 -0.0048 0.0062…InitialConditions: 0显示所有属性

查看基线频率响应。红色虚线显示用于创建过滤器的设计规范。

fvtool (LPF)

图形过滤器可视化工具-幅度响应(dB)包含一个轴对象和其他类型的uitoolbar, uimenu对象。标题为“大小响应(dB)”的轴对象包含2个类型为line的对象。

软件不能定点操作

属性中包含过滤器的定点属性定点属性部分显示在对象中。默认情况下,过滤器使用全精度算法来处理定点输入。使用全精度算法,过滤器根据需要为乘积、累加器和输出使用尽可能多的位,以防止任何溢出或舍入。如果不想使用全精度算术,可以设置FullPrecisionOverride财产然后分别设置乘积、累加器和输出数据类型。

rng默认的inputWordLength = 16;fixedPointInput = fi (randn(100 1),真的,inputWordLength);floatingPointInput =双(fixedPointInput);floatingPointOutput = LPF (floatingPointInput);释放(LPF) fullPrecisionOutput = LPF(fixedpointtinput);规范(floatingPointOutput-double (fullPrecisionOutput),“正”
ans = 6.8994 e-05

全精度定点滤波的结果非常接近浮点数,但结果并不精确。原因是系数量化。在定点滤波器中CoefficientsDataType属性对系数和输入具有相同的字长(16)。全精度模式下的滤波器的频率响应更清楚地显示了这一点。的测量函数表明,量化系数滤波器的最小阻带衰减为76.6913 dB,小于浮点滤波器规定的80 dB。

通滤波器。CoefficientsDataType
ans = '与input相同的单词长度'
fvtool (LPF)

图形过滤器可视化工具-幅度响应(dB)包含一个轴对象和其他类型的uitoolbar, uimenu对象。标题为“大小响应(dB)”的轴对象包含3个类型为line的对象。这些对象代表过滤器1:量化,过滤器1:引用。

测量(LPF)
ans =采样率:2khz通频带边缘:400hz 3-dB点:416.2891 Hz 6-dB点:428.1081 Hz阻频带边缘:500hz通频带纹波:0.96325 dB阻频带Atten转换宽度:100 Hz

滤波器上次使用定点输入时仍然处于锁定状态。出于这个原因,fvtool显示定点频率响应。虚线点响应是参考浮点滤波器的响应,实线图是在定点输入时使用的滤波器的响应。期望的频率响应无法匹配,因为系数字长被限制为16位。这就是浮点和定点设计之间的区别。增加系数字长所允许的比特数可以使量化误差更小,并使您能够匹配80 dB的阻带衰减的设计要求。使用24位的系数字长来达到80.1275 dB的衰减。

LPF24bitCoeff =设计(designSpec,“equiripple”...“SystemObject”,真正的);LPF24bitCoeff。CoefficientsDataType =“自定义”;coeffNumerictype = numerictype (fi (LPF24bitCoeff.Numerator,真的,24));LPF24bitCoeff。CustomCoefficientsDataType = numerictype(真的,...coeffNumerictype.WordLength coeffNumerictype.FractionLength);fullPrecisionOutput32bitCoeff = LPF24bitCoeff (fixedPointInput);规范(floatingPointOutput-double (fullPrecisionOutput32bitCoeff),“正”
ans = 4.1077 e-07
fvtool (LPF24bitCoeff)

图形过滤器可视化工具-幅度响应(dB)包含一个轴对象和其他类型的uitoolbar, uimenu对象。标题为“大小响应(dB)”的轴对象包含3个类型为line的对象。这些对象代表过滤器1:量化,过滤器1:引用。

测量(LPF24bitCoeff)
ans =采样率:2khz通频带边缘:400hz 3-dB点:416.2901 Hz 6-dB点:428.1091 Hz阻频带边缘:500hz通频带纹波:0.96329 dB阻频带Atten转换宽度:100 Hz

设计参数和系数量化

在许多定点设计应用中,系数字长是不灵活的。例如,假设您被限制使用14位。在这种情况下,无法达到所要求的最小阻带衰减80db。14位系数量化滤波器的最小衰减仅为67.2987 dB。

LPF14bitCoeff =设计(designSpec,“equiripple”...“SystemObject”,真正的);coeffNumerictype = numerictype (fi (LPF14bitCoeff.Numerator,真的,14));LPF14bitCoeff。CoefficientsDataType =“自定义”;LPF14bitCoeff。CustomCoefficientsDataType = numerictype(真的,...coeffNumerictype.WordLength coeffNumerictype.FractionLength);测量(LPF14bitCoeff“算术”“固定”
ans =采样率:2khz通频带边缘:400hz 3-dB点:416.2939 Hz 6-dB点:428.1081 Hz阻频带边缘:500hz通频带纹波:0.96405 dB阻频带Atten: 67.2987 dB过渡宽度:100 Hz

对于一般的FIR滤波器,每个系数字长比特提供大约5 dB的阻带衰减。因此,如果您的滤波器系数总是量化到14位,您可以预期最小阻带衰减仅为70 dB左右。在这种情况下,设计阻带衰减小于70 dB的滤波器更为实用。放宽这一要求会导致较低阶的设计。

designSpec。Astop = 60;LPF60dBStopband =设计(designSpec,“equiripple”...“SystemObject”,真正的);LPF60dBStopband。CoefficientsDataType =“自定义”;coeffNumerictype = numerictype (fi (LPF60dBStopband.Numerator,真的,14));LPF60dBStopband。CustomCoefficientsDataType = numerictype(真的,...coeffNumerictype.WordLength coeffNumerictype.FractionLength);测量(LPF60dBStopband“算术”“固定”
ans =采样率:2 kHz通频带边缘:400 Hz 3-dB点:419.3391 Hz 6-dB点:432.9718 Hz阻带边缘:500 Hz通频带纹波:0.92801 dB阻带Atten转换宽度:100 Hz
订单(LPF14bitCoeff)
ans = 51
订单(LPF60dBStopband)
ans = 42

滤波器的排序从51下降到42,这意味着实现新的FIR滤波器需要更少的抽头。如果你仍然想要一个高的最小阻带衰减而不牺牲系数的比特数,你必须放松另一个滤波器设计约束:过渡宽度。增加过渡宽度可以使你得到更高的衰减与相同的系数字长。然而,即使放宽了过渡宽度,也几乎不可能达到每位系数字长超过5分贝。

designSpec。Astop = 80;transitionWidth = 200;designSpec。成就= centerFrequency-transitionWidth / 2;designSpec。Fstop = centerFrequency + transitionWidth / 2;LPF300TransitionWidth =设计(designSpec,“equiripple”...“SystemObject”,真正的);LPF300TransitionWidth。CoefficientsDataType =“自定义”;coeffNumerictype = numerictype (fi (LPF300TransitionWidth。分子,...真的,14));LPF300TransitionWidth。CustomCoefficientsDataType = numerictype(真的,...coeffNumerictype.WordLength coeffNumerictype.FractionLength);测量(LPF300TransitionWidth“算术”“固定”
ans =采样率:2khz通带边缘:350hz 3-dB点:385.4095 Hz 6-dB点:408.6465 Hz阻带边缘:550hz通带纹波:0.74045 dB阻带Atten转换宽度:200 Hz

正如你所看到的,将过渡宽度增加到200hz可以在14位系数下实现74.439 dB的阻带衰减,而当过渡宽度设置为100hz时可以达到67.2987 dB。增加过渡宽度的另一个好处是,过滤器的顺序也减少了,在本例中从51到27。

订单(LPF300TransitionWidth)
ans = 27