主要内容

MATLAB中的定点滤波器设计

设计用于定点输入的滤波器。算例分析了系数量化对滤波器设计的影响。必须使用定点设计器™软件才能运行此示例。

简介

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

数字滤波器设计

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

  • 采样率:2000赫兹

  • 中心频率:450hz

  • 过渡宽度:100hz

  • Equiripple设计

  • 通带中最大1 dB的波纹

  • 阻带的最小衰减为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。分子:[-0.0013 -0.0055 -0.0112 -0.0125 -0.0048 0.0062…显示所有属性

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

fvtool (LPF)

图1:量级响应(dB)包含一个坐标轴对象。标题为幅度响应(dB)的axis对象包含两个类型为line.

软件不能定点操作

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

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

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

通滤波器。CoefficientsDataType
ans = '与输入字长度相同'
fvtool (LPF)

图2:量级响应(dB)包含一个坐标轴对象。标题为幅度响应(dB)的axis对象包含3个类型为line的对象。这些对象表示筛选#1:量子化,筛选#1:引用。

测量(LPF)
ans =采样率:2 kHz通带边缘:400 Hz 3-dB点:416.2891 Hz 6-dB点:428.1081 Hz阻带边缘:500 Hz通带波纹:0.96325 dB阻带注意。: 76.6913 dB过渡宽度:100hz

该过滤器上一次使用时是定点输入,现在仍处于锁定状态。出于这个原因,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)

图3:量级响应(dB)包含一个坐标轴对象。标题为幅度响应(dB)的axis对象包含3个类型为line的对象。这些对象表示筛选#1:量子化,筛选#1:引用。

测量(LPF24bitCoeff)
ans =采样率:2 kHz通带边缘:400 Hz 3-dB点:416.2901 Hz 6-dB点:428.1091 Hz阻带边缘:500 Hz通带波纹:0.96329 dB阻带注意。: 80.1275 dB过渡宽度:100hz

设计参数和系数量化

在许多定点设计应用中,系数字长是不灵活的。例如,假设您只能使用14位。在这种情况下,无法达到所要求的最小阻带衰减80分贝。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 =采样率:2 kHz通带边缘:400 Hz 3-dB点:416.2939 Hz 6-dB点:428.1081 Hz阻带边缘:500 Hz通带波纹:0.96405 dB阻带注意。: 67.2987 dB过渡宽度:100hz

对于一般的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阻带注意。: 59.1829 dB过渡宽度:100hz
订单(LPF14bitCoeff)
ans = 51
订单(LPF60dBStopband)
ans = 42

滤波器的顺序从51下降到42,这意味着需要更少的水龙头来实现新的FIR滤波器。如果你仍然想要一个高的最小阻带衰减而不妥协的系数位数,你必须放松另一个滤波器设计约束:过渡宽度。增加过渡宽度可以使您在相同的字长系数下获得更高的衰减。然而,即使在放宽过渡宽度之后,也几乎不可能实现每比特系数字长超过5 dB。

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 =采样率:2 kHz通带边缘:350 Hz 3-dB点:385.4095 Hz 6-dB点:408.6465 Hz阻带边缘:550 Hz通带波纹:0.74045 dB阻带注意。: 74.439 dB过渡宽度:200hz

正如你所看到的,增加过渡宽度到200 Hz允许74.439 dB的阻带衰减14位系数,相比之下,当过渡宽度设置为100 Hz时获得67.2987 dB。增加过渡宽度的另一个好处是,过滤器的顺序也降低了,在这种情况下,从51到27。

订单(LPF300TransitionWidth)
ans = 27
Baidu
map