优化定点FIR滤波器

这个例子展示了如何优化定点FIR滤波器。优化可以参考滤波器响应的特性,如阻带衰减或达到特定规格所需的比特数。这种功能对于那些针对特定字长具有大量可配置系数的硬件的用户来说特别有用,并且/或者在asic和FPGAs上有很大的设计空间需要探索的情况下。硬件设计人员通常可以用更少的位交换更多的系数,反之亦然,从而优化不同的asic或fpga。

这个例子说明了各种基于噪声整形过程的技术,得到了优化的定点FIR滤波器系数。示例显示了如何:

  • 最小化系数字,

  • 约束系数字,

  • 最大化阻带衰减。

理论背景

的噪声整形算法实质上在其他频带它增加为代价移动量化噪声进行定点FIR滤波器的临界频带(通常是阻带)的。下面的框图示出了噪声整形的过程。从本质上讲,滤波器系数是通过类似于数字滤波器系统过去了,但在中间量化。该系统计算所述量化误差为每个系数,然后使错误通过由B1,B2和B3的系数定义的简单IIR高通滤波器。的“舍入”块舍入输入到最接近的量化值。在此之后,量化值从原来的浮点值中减去。在每个延迟块中的初始状态的值可以被设置为和-LSB + LSB之间的随机噪声。

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

最小化系数字

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

TW =。08;%转变宽度Astop = 59;%阻带衰减量(dB)f = fdesign.halfband (“TW, Ast”、TW Astop);高清=设计(f,“kaiserwin”);

为了建立一个基线,我们将过滤器的“算术”属性设置为“固定”,并对系数“wordlength”进行迭代,直到找到满足规范要求的最小值。或者,我们可以使用minimizecoeffwl()来加速这个过程。基线定点滤波器包含91个17位系数。

Hqbase = minimizecoeffwl(高清'MatchRefFilter',真的,'NoiseShaping',假,“Astoptol”,0);% 91 17位系数,Astop = 59.1 dB

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

Hq1 = (Hqbase)复印件;Hq1。CoeffWordLength = 16;% 91 16位系数,Astop = 58.8 dBm1 =测量(Hq1)% #好吧
m1 =采样率:N/A(归一化频率)通带边缘:0.46 3-dB点:0.49074 6-dB点:0.5阻带边缘:0.54通带纹波:0.017157 dB: 58.8741 dB过渡宽度:0.08

或者,我们可以设置一个公差来控制可接受的阻带误差。例如,在阻带公差为0.15 dB的情况下,我们可以节省3位,得到一个系数为91个14位的滤波器。

Hq2 = minimizecoeffwl(高清'MatchRefFilter',真的,'NoiseShaping',假,“Astoptol”,0.15);% 91 14位系数,Astop = 58.8 dB

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

HQ3 = minimizecoeffwl(HD,'MatchRefFilter',假,'NoiseShaping',假);%93 13位系数

更好的解决方案是利用噪声整形来最大化量化滤波器的阻带衰减。噪声整形过程是随机的。您可以尝试使用“NTrials”选项和/或初始化RAND,以重现下面的结果。因为默认情况下'MatchRefFilter'是假的,'NoiseShaping'是真的,所以我们可以省略它们。优化后的定点滤波器满足91个13位系数的要求。这比具有相同数量系数的参考定点设计节省了4位。

HQ4 = minimizecoeffwl(HD,“Ntrials”10);%91 13位系数hfvt = fvtool(Hqbase,HQ4,'ShowReference',“关”,'颜色',“白色”);传说(hfvt,'17位参考滤波器”,“可Noise-Shaped过滤器的);

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

轴([0 0.5060 -0.0109 0.0109])

约束系数字

我们已经先前看到我们如何权衡多个系数(或用于与一个固定的滤波器阶数的设计更大的过渡宽度)为更小的系数由minimizecoeffwl()方法的“MatchRefFilter”参数设置为“假”字长。我们现在证明我们如何能够在最小的顺序设计的情况下,采取多级(3级)8的例子进一步控制这种折衷:1个抽取:

调频= fdesign.decimator (8,低通滤波器的,'Fp的,的Fst,鸭,AST',0.1,0.12,1,70);HM =设计(FM,“多级”,“nstages”3);

注意:以下命令是计算密集型的,可能需要几分钟才能运行。

我们首先匹配浮点设计的顺序,得到符合规格的噪声型定点滤波器:

  • 7第一级15位系数,

  • 第二阶段的10个13位系数,

  • 第三阶段的系数为65个17位。

Hmref = minimizecoeffwl(嗯,'MatchRefFilter',真正的);

通过让滤波器的阶数的增加,我们可以减少系数字长到:

  • 第一阶段的9位系数,

  • 第二阶段的10个12位系数,

  • 第三级65的15位的系数。

HQ5 = minimizecoeffwl(HM,'MatchRefFilter',假);

为了更好地控制最终字长的,我们可以使用constraincoeffwl()方法。多级设计中,每一级的字长可以单独限制。例如,我们限制每个阶段分别使用10,12和14位。受约束的设计符合与规格:

  • 第一阶段的10位系数为8,

  • 第二阶段的12位系数,

  • 68第三阶段的14位系数。

WL = [10 12 14];认证机构= constraincoeffwl(嗯,王);

最大化阻带衰减

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

跳频= fdesign.decimator (2“半带”,“N, Ast”、70、69);Hb1 =设计(跳频,“equiripple”);
警告:该设计产生,这将在以后的版本中删除一个MFILT对象。要生成等效系统对象,设置了“SYSTEMOBJECT”参数设置为true。语法:HS =设计(d,..., 'SYSTEMOBJECT',真)

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

Hb1.Arithmetic =“固定”;Hb1.CoeffWordLength = 14;MB1 =量度(HB1)% #好吧
mb1 =采样率:N/A(归一化频率)通带边缘:0.44518 3-dB点:0.48816 6-dB点:0.5阻带边缘:0.55482通带纹波:0.010552 dB: 62.7048 dB过渡宽度:0.10963

通过塑造出来的噪声阻带的,我们可以提高近15分贝衰减64.18分贝,但我们仍然不能满足规范要求。

Hbq1 = maximizestopband (Hb1 14);mq1 =测量(Hbq1)% #好吧
mq1 =采样率:N/A(归一化频率)通带边缘:0.44373 3 dB点:0.48811 6 dB点:0.5阻带边缘:0.55529通带纹波:0.01064 dB: 64.1876 dB转换宽度:0.11156

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

跳频。Astop = 80;Hb2 =设计(跳频,“equiripple”);Hb2.Arithmetic =“固定”;Hb2.CoeffWordLength = 14;MB2 =量度(HB2)% #好吧
警告:该设计产生,这将在以后的版本中删除一个MFILT对象。要生成等效系统对象,设置了“SYSTEMOBJECT”参数设置为true。语法:HS =设计(d,..., 'SYSTEMOBJECT',真)MB2 =采样率:N / A(归一化频率)通带边缘:0.43464 3分贝点:0.48704 6-dB的点:0.5阻带边缘:0.56536通带波纹:0.0076847分贝阻带安泰信。:66.2266分贝转变宽度:0.13073

噪声整形技术使阻带衰减从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阻带: 69.4039 dB转换宽度:0.12703

相比于浮点设计定点滤波器的过渡宽度增加。这是必须付出的代价得到衰减69分贝,只有14位系数作为则需24位系数两者的过渡宽度和浮点设计的阻带衰减相匹配。

关闭(hfvt);hfvt = fvtool (reffilter (Hb1) Hbq2,'ShowReference',“关”,'颜色',“白色”);传说(hfvt,“浮点过滤”,“14-bit Noise-Shaped过滤器的);

关上(hfvt)

摘要

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

参考

延斯·约根·尼尔森,线性相直接形式FIR数字的滤波器设计与量化系数使用错误光谱整形技术,IEEE®交易声学,语音和信号处理,卷。37,第7号,1989年7月,第1020--1026。

《离散时间信号处理》,第2版,普伦蒂斯霍尔出版社,1999年版,ISBN 0-13-754920-2。