主要内容

MATLAB中的定点滤波器设计

此示例演示如何设计用于定点输入的滤波器。此示例分析系数量化对滤波器设计的影响。您必须拥有定点设计器软件™ 运行此示例。

介绍

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

FIR滤波器设计

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

  • 采样率:2000赫兹

  • 中心频率:450赫兹

  • 过渡宽度:100赫兹

  • 等波纹设计

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

  • 阻带中的最小衰减为80 dB

samplingFrequency = 2000;centerFrequency = 450;transitionWidth = 100;passbandRipple = 1;stopbandAttenuation = 80;designSpec = fdesign.lowpass (‘Fp、Fst、Ap、Ast’,...中心频率转换宽度/2,...centerFrequency + transitionWidth / 2,...通带波纹、阻带衰减、,...采样频率);LPF=设计(设计规范,“等波纹”,...“系统对象”,对)
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的对象。

全精度定点运算

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

rng违约inputWordLength=16;fixedPointInput=fi(randn(100,1),true,inputWordLength);floatingPointInput=double(fixedPointInput);floatingPointOutput=LPF(floatingPointInput);release(LPF)fullPrecisionOutput=LPF(fixedPointInput);norm(floatingPointOutput double(fullPrecisionOutput),“正”)
ans=6.8994e-05

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

LPF.CoefficientsDataType
ans='与输入相同的字长'
fvtool(LPF)

图形过滤器可视化工具-幅度响应(dB)包含一个轴对象和其他类型的uitoolbar, uimenu对象。标题为“大小响应(dB)”的轴对象包含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过渡宽度:100 Hz

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

LPF24bitCoeff=设计(设计规范,“等波纹”,...“系统对象”,true);LPF24bitCoeff.CoefficientsDataType=“自定义”; coeffNumerictype=numerictype(fi(lpf24bitcoff.numeriator,true,24));LPF24bitCoeff.CustomCoefficientsDataType=numerictype(真,...coeffNumerictype.WordLength,coeffNumerictype.FractionLength);fullPrecisionOutput32bitCoeff=LPF24bitCoeff(fixedPointInput);Normal(浮点输出双精度(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=设计(设计规范,“等波纹”,...“系统对象”,真正的);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过渡宽度:100 Hz

通常,对于FIR滤波器,系数字长的每一位提供大约5 dB的阻带衰减。因此,如果滤波器的系数始终量化为14位,则可以预期最小阻带衰减仅为70 dB左右。在这种情况下,设计具有阻带衰减的滤波器更为实际小于70 dB。放宽此要求会导致低阶设计。

设计规范Astop=60;LPF60dBStopband=design(设计规范,“等波纹”,...“系统对象”,真正的);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过渡宽度:100 Hz
订单(LPF14bitCoeff)
ans=51
订单(LPF60dBStopband)
ans=42

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

designSpec.Astop=80;transitionWidth=200;designSpec.Fpass=centerFrequency transitionWidth/2;designSpec.Fstop=centerFrequency+transitionWidth/2;lpf300 transitionWidth=design(designSpec,“等波纹”,...“系统对象”,true);LPF300TransitionWidth.CoefficientsDataType=“自定义”;coeffNumerictype=numerictype(fi(LPF300 TransitionWidth.Numerator,...真的,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过渡宽度:200 Hz

如您所见,将过渡宽度增加到200 Hz可以使用14位系数实现74.439 dB的阻带衰减,而将过渡宽度设置为100 Hz时获得的阻带衰减为67.2987 dB。增加过渡宽度的另一个好处是,滤波器阶数也会降低,在这种情况下,从51降到27。

订单(LPF300转换宽度)
ans=27