优化定点FIR滤波器
这个例子展示了如何优化定点FIR滤波器。优化可以参考滤波器响应的特征,如阻带衰减或实现特定规格所需的比特数。这种功能对于那些具有若干特定字长可配置系数的硬件用户和/或在asic和fpga上有很大设计空间可探索的情况下特别有用。硬件设计者通常可以用更少的比特来交换更多的系数,或者反过来,以优化不同的asic或fpga。
这个例子说明了基于产生优化定点FIR滤波器系数的噪声整形过程的各种技术。该示例演示了如何:
最小化系数字长,
约束系数wordlength,
最大阻带衰减。
理论背景
噪声整形算法本质上是将量化噪声移出定点FIR滤波器的临界频带(通常是停止频带),代价是在其他频带增加噪声。下面的方框图说明了噪声整形的过程。本质上,滤波器系数通过一个类似数字滤波器的系统,但中间有一个量化器。系统正在计算每个系数的量化误差,然后将误差通过由b1, b2和b3系数定义的简单IIR高通滤波器。“round”块将输入四舍五入到最近的量化值。在此之后,量子化值从原始浮点值中减去。每个延迟块的初始状态值可以设置为-LSB和+LSB之间的随机噪声。
系统的输出是新的、量化的、噪声形状的滤波器系数。通过对延迟块中不同的随机初始状态多次重复这一过程,可以产生不同的滤波器。
最小化系数字数
首先,我们要确定满足单级或多级设计规范的最小字长定点FIR滤波器。我们以归一化过渡宽度为.08,阻带衰减为59 dB的半带滤波器为例。Kaiser窗口设计产生91双精度浮点系数,以满足规范。
Tw = .08;%过渡宽度停止= 59;%阻带衰减(dB)F = fdesign.halfband(“TW, Ast”, TW,停止);Hd =设计(f,“kaiserwin”);
为了建立基线,我们通过设置它的'来量化过滤器。算术
属性为“固定”,并通过迭代系数的字长,直到找到满足规范的最小值。或者,我们也可以使用minimizecoeffwl
()加快进程。基线定点滤波器包含91个17位系数。
Hqbase = minimizecoeffwl;...MatchRefFilter = true, NoiseShaping = false,...Astoptol = 0);17位系数,停止= 59.1 dB
17位字长对于许多硬件目标来说没有吸引力。在某些情况下,我们可以只使用16位系数来折衷。但是请注意,原来的规格不再严格满足,因为滤波器的最大阻带衰减只有58.8 dB而不是所需的59 dB。
Hq1 =副本(Hqbase);Hq1。CoeffWordLength = 16;16位系数,停止= 58.8 dBm1 = measure(Hq1)
m1 =采样率:N/A(归一化频率)通频带边缘:0.46 3 dB点:0.49074 6 dB点:0.5阻带边缘:0.54通频带波纹:0.017157 dB阻带注意。转换宽度:0.08
或者,我们可以设置一个公差来控制可接受的阻带误差。例如,当阻带公差为。15 dB时,我们可以节省3位,得到一个具有91个14位系数的滤波器。
Hq2 = minimizecoeffwl...MatchRefFilter = true, NoiseShaping = false,...Astoptol =酒精含量);14位系数,停止= 58.8 dB
系数字长的节省是以定点设计不再满足规格为代价的。公差可能因应用程序的不同而不同,但这种策略在许多情况下的吸引力可能有限。我们可以通过放松'MatchRefFilter'约束来使用另一个自由度。通过设置'MatchRefFilter
属性为false时,我们不再尝试匹配Hd的滤镜顺序(用于最小顺序设计)或滤镜过渡宽度(用于固定顺序设计)。允许重新设计中间浮点滤波器的结果是满足93个13位系数规范的定点滤波器。与参考定点设计相比,我们节省了4位,但最终得到了2个额外的系数(1个非零系数)。
Hq3 = minimizecoeffwl;...MatchRefFilter = false, NoiseShaping = false);13位系数
一个更好的解决方案是使用噪声整形来最大化量化滤波器的阻带衰减。噪声的形成过程是随机的。你可以尝试一下NTrials
选项和/或初始化RAND以再现下面的结果。因为“MatchRefFilter
'默认为false, 'NoiseShaping
是正确的,我们可以省略它们。优化后的定点滤波器达到了91个13位系数的要求。这比具有相同系数数的参考不动点设计节省了4位。
Hq4 = minimizecoeffwl(Hd, Ntrials=10);13位系数hfvt = fvtool(Hqbase,Hq4, ShowReference=“关闭”颜色=“白色”);传奇(hfvt“17位参考滤波器”,“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)
分子:[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);
分子:[1x247双]PersistentMemory: false CoeffWordLength: 15 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 FilterInternals: 'FullPrecision'
要更好地控制最终的字长,请使用constraincoeffwl
()方法。例如,将设计限制为16位系数。
Wl = 16;Hqc = constraincoeffwl(Hm,WL);disp(认证机构)
分子:[1x243双]PersistentMemory: false CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 FilterInternals: 'FullPrecision'
最大阻带衰减
在设计具有若干特定字长可配置系数的货架滤波引擎(ASSPs)时,需要在给定的顺序和受限制的字长下使滤波器的阻带衰减最大化。在下一个例子中,我们希望使用70阶半带decimator获得69 dB的阻带衰减,同时使用14位表示系数。
Fh = fdesign.halfband(“N, Ast”、70、69);Hb1 =设计(fh,“equiripple”);
如果我们简单地用14位系数量化滤波器,我们只得到62.7 dB的衰减。
Hb1。算术=“固定”;Hb1。CoeffWordLength = 14;mb1 =测量(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分贝的浮点滤波器。我们以更大的过渡宽度的形式为衰减的增加付出了代价。14位无噪声形滤波器的衰减从62.7 dB提高到66.2 dB,但仍未达到规范要求。
跳频。停止= 80;Hb2 =设计(fh,“equiripple”);Hb2。算术=“固定”;Hb2。CoeffWordLength = 14;mb2 =测量(Hb2)
mb2 =采样率:N/A(归一化频率)通带边缘:0.43464 3-dB点:0.48704 6-dB点:0.5阻带边缘:0.56536通带波纹:0.0076847 dB阻带注意。: 66.2266 dB过渡宽度:0.13073
通过噪声整形技术,我们得到了一个滤波器,通过将阻带衰减提高3 dB以上,从66.2 dB提高到69.4 dB,最终满足规格。
Hbq2 =最大止带(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定点滤波器的系数字长,或者如何使用噪声整形技术来最大化阻带衰减。我们还看到了在最小序设计中如何用比特交换更多的系数,或者在固定序设计中如何用更大的过渡宽度。
参考文献
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。