主要内容

优化定点FIR滤波器

这个例子展示了如何优化定点FIR滤波器。优化可以参考滤波器响应的特性,如阻带衰减或实现特定规格所需的比特数。该功能对于具有多个特定字长可配置系数的硬件和/或通常在asic和fpga上存在较大设计空间的用户特别有用。硬件设计人员通常可以用更多的系数换取更少的比特,反之亦然,以优化不同的asic或fpga。

本例说明了基于噪声整形过程的各种技术,这些技术可以产生优化的定点FIR滤波器系数。这个例子展示了如何:

  • 最小化系数字长,

  • 约束系数字长,

  • 最大化阻带衰减。

理论背景

噪声整形算法本质上是将量化噪声移出定点FIR滤波器的临界频带(通常是阻带),代价是增加其他频带的量化噪声。下面的方框图说明了噪声整形的过程。从本质上讲,滤波器系数通过一个类似数字滤波器的系统,但中间有一个量化器。系统计算每个系数的量化误差,然后将误差通过由b1、b2和b3系数定义的简单IIR高通滤波器传递。“舍入”块将输入舍入到最近的量化值。在此之后,从原始浮点值中减去量化值。每个延迟块的初始状态值可以设置为-LSB和+LSB之间的随机噪声。

系统的输出是新的、量化的、噪声形状的滤波器系数。通过在延迟块中使用不同的随机初始状态多次重复此过程,可以产生不同的滤波器。

最小化系数

首先,我们要确定满足单级或多级设计规范的最小字长定点FIR滤波器。我们以一个归一化过渡宽度为0.08,阻带衰减为59 dB的半带滤波器为例。Kaiser窗口设计产生91个双精度浮点系数以满足规范要求。

Tw = .08;%过渡宽度stop = 59;阻带衰减% (dB)F = fdesign.halfband(“TW, Ast”, TW,停止);Hd =设计(f,“kaiserwin”);

为了建立一个基线,我们通过设置它的'来量化过滤器算术属性为“固定”,并通过迭代系数的字长,直到找到符合规范的最小值。或者,我们可以使用minimizecoeffwl()加快这一进程。基线定点滤波器包含91个17位系数。

Hqbase = minimizecoeffwl(Hd,...MatchRefFilter = true, NoiseShaping = false,...Astoptol = 0);% 91 17位系数,停止= 59.1 dB

17位字长对于许多硬件目标来说没有吸引力。在某些情况下,我们可以通过只使用16位系数来妥协。但是请注意,原来的规格不再严格满足,因为滤波器的最大阻带衰减只有58.8 dB,而不是所需的59 dB。

Hq1 = copy(Hqbase);Hq1。CoeffWordLength = 16;% 91 16位系数,停止= 58.8 dBm1 = measure(h1)
m1 =采样率:N/A(归一化频率)通带边缘:0.46 3 dB点:0.49074 6 dB点:0.5止带边缘:0.54通带纹波:0.017157 dB止带注意。: 58.8741 dB过渡宽度:0.08

或者,我们可以设置一个容差来控制可接受的止带误差。例如,阻带公差为.15 dB,我们可以节省3位,并获得一个具有91个14位系数的滤波器。

Hq2 = minimizecoeffwl(Hd,...MatchRefFilter = true, NoiseShaping = false,...Astoptol =酒精含量);% 91 14位系数,停止= 58.8 dB

系数字长节省的代价是定点设计不再符合规格。不同应用的公差可能不同,但这种策略在许多情况下可能具有有限的吸引力。我们可以通过放松'MatchRefFilter'约束来使用另一个自由度。通过设置'MatchRefFilter属性为false时,我们不再尝试匹配Hd的过滤器顺序(对于最小顺序设计)或过滤器过渡宽度(对于固定顺序设计)。允许重新设计中间浮点滤波器,从而得到满足93个13位系数规范的定点滤波器。与参考定点设计相比,我们节省了4位,但最终增加了2个额外的(1个非零)系数。

Hq3 = minimizecoeffwl(Hd,...MatchRefFilter = false, NoiseShaping = false);% 93 13位系数

更好的解决方案是使用噪声整形来最大化量化滤波器的阻带衰减。噪声整形过程是随机的。你可能想尝试一下NTrials选项和/或初始化RAND以重现下面的结果。因为“MatchRefFilter'默认为false, 'NoiseShaping是正确的,我们可以省略它们。优化后的定点滤波器达到了91个13位系数的要求。这表示在相同数量的系数下,比参考定点设计节省了4位。

Hq4 = minimizecoeffwl(Hd, Ntrials=10);% 91 13位系数hfvt = fvtool(Hqbase,Hq4, ShowReference=“关闭”颜色=“白色”);传奇(hfvt17位参考滤波器,“13位噪声形滤波器”);

{

作为噪声在阻带外形成的权衡,噪声型滤波器的通带纹波略有增加,这通常不是问题。还要注意,在应用噪声整形后,通带纹波与频率之间没有简单的关系。

缩放(hfvt,[0 0.5060 -0.0109 0.0109])

{

约束系数

我们之前已经看到了如何在系数更小的字长和系数更小的字长之间进行权衡(或在固定滤波器顺序的设计中使用更大的过渡宽度)。MatchRefFilter的参数。minimizecoeffwl()方法设置为“false”。现在,我们将展示如何通过放松这个限制来进一步控制这种权衡。

FM = fdesign.lowpass(“Fp,置,美联社,Ast”, 0.1, 0.12, 70);Hm =设计(fm);

我们首先匹配浮点设计的顺序,并获得一个噪声形状的定点滤波器,它满足规范,有237个20位字长的系数。

Hmref = minimizecoeffwl(Hm, MatchRefFilter=true);disp (Hmref)
FilterStructure: 'Direct-Form FIR'算术:'fixed'分子:[1x237 double] PersistentMemory: false CoeffWordLength: 20 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 FilterInternals: 'FullPrecision'

通过放宽匹配要求(从而让过滤器顺序增加),我们得到247个系数(比前一种情况略有增加),字长减少到15位。

Hq5 = minimizecoeffwl(Hm, MatchRefFilter=false);disp (Hq5);
FilterStructure: 'Direct-Form FIR'算术:'fixed'分子:[1x247 double] PersistentMemory: false CoeffWordLength: 15 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 FilterInternals: 'FullPrecision'

控件可以更好地控制最终的字长constraincoeffwl()方法。例如,将设计限制为16位系数。

Wl = 16;Hqc = constraincoeffwl(Hm,WL);disp(认证机构)
FilterStructure: 'Direct-Form FIR'算术:'fixed'分子:[1x243 double] PersistentMemory: false CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 FilterInternals: 'FullPrecision'

最大化阻带衰减

在为具有若干特定字长可配置系数的架子滤波引擎(assp)进行设计时,需要在给定的顺序和限制的字长下使滤波器的阻带衰减最大化。在下一个例子中,我们希望使用70阶半带decimator获得69 dB的阻带衰减,同时使用14位表示系数。

Fh = fdesign.halfband(“N, Ast”、70、69);Hb1 =设计(fh,“equiripple”);

如果我们简单地用14位系数量化滤波器,我们只得到62.7 dB的衰减。

Hb1。算术=“固定”;Hb1。CoeffWordLength = 14;mb1 = measure(Hb1)
mb1 =采样率:N/A(归一化频率)通带边缘:0.44518 3-dB点:0.48816 6-dB点:0.5止带边缘:0.55482通带波纹:0.010552 dB止带注意。转换宽度:0.10963

通过将噪声整形出阻带,我们可以将衰减提高近1.5 dB,达到64.18 dB,但仍然不能满足规格要求。

Hbq1 = maximizestopband(Hb1, 14);mq1 = measure(Hbq1)
mq1 =采样率:N/A(归一化频率)通带边缘:0.44562 3-dB点:0.48812 6-dB点:0.5止带边缘:0.55367通带波纹:0.010959 dB止带注意。过渡宽度:0.10805

下一步是过度设计一个衰减为80 dB的浮点滤波器。我们以更大的过渡宽度的形式付出了衰减增加的代价。14位非噪声型滤波器的衰减从62.7 dB提高到66.2 dB,但仍未达到规范要求。

跳频。stop = 80;Hb2 =设计(fh,“equiripple”);Hb2。算术=“固定”;Hb2。CoeffWordLength = 14;mb2 = measure(Hb2)
mb2 =采样率:N/A(归一化频率)通带边缘:0.43464 3-dB点:0.48704 6-dB点:0.5止带边缘:0.56536通带波纹:0.0076847 dB止带注意。转换宽度:0.13073

噪声整形技术使我们的滤波器最终满足规格,将阻带衰减提高了3db以上,从66.2 dB提高到69.4 dB。

Hbq2 = maximizestopband(Hb2,14);mq2 =测量(Hbq2)
mq2 =采样率:N/A(归一化频率)通带边缘:0.43584 3-dB点:0.4871 6-dB点:0.5止带边缘:0.56287通带波纹:0.0053253 dB止带注意。转换宽度:0.12703

与浮点设计相比,定点滤波器的过渡宽度增加了。这是为了用14位系数获得69 dB衰减所付出的代价,因为需要24位系数才能匹配浮点设计的过渡宽度和阻带衰减。

关闭(hfvt);hfvt = fvtool(reffilter(Hb1),Hbq2, ShowReference=“关闭”颜色=“白色”);传奇(hfvt“浮点过滤”,“14位噪声形滤波器”);

{

关上(hfvt)

总结

我们已经看到了如何使用噪声整形技术来最小化单级或多级FIR定点滤波器的系数字长,或者如何使用它来最大化阻带衰减。我们还看到了在最小阶设计的情况下如何用比特来换取更多的系数,或者在固定阶设计的情况下如何用比特来换取更大的过渡宽度。

参考文献

[1] Jens Jorgen Nielsen,使用误差谱整形技术的量化系数线性相位直接形式FIR数字滤波器设计,IEEE®声学,语音和信号处理学报,第37卷,第7期,1989年7月,第1020—1026页。

Alan V. Oppenheim和Ronald W. Schafer,离散时间信号处理,第2版,Prentice Hall, 1999, ISBN 0-13-754920-2。