我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 2387|回复: 2

[国防技术] IIR滤波器

[复制链接]

该用户从未签到

390

主题

249

回帖

6325

积分

二级逆天

积分
6325

终身成就奖金点子奖社区居民宣传大使奖优秀斑竹奖

QQ
发表于 2013-12-13 15:08:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
IIR系数和增益调整系数
       本设计中IIR采用接联型,直接二型二阶节(SOS,second order section)作为最基本的单元。
利用FDATOOL工具,输入设计指标要求的参数,可以设计出8阶IIR滤波器,需要4个SOS接联。一个二阶节结构可以用如下的差分方程表示:
            4-1
生成的系数如下表格:
     b1    b2    b3    a1    a2    a3    G
SOS1    1    -1.2292    1    1    -1.41597    0.864442    0.771897
SOS2    1    -0.81988    1    1    -1.39877    0.694324    0.628234
SOS3    1    0.943741    1    1    -1.38503    0.510304    0.625856
SOS4    1    -1.33304    1    1    -1.44019    0.963747    0.015855
表4.1  4级SOS系数
其中,G表示每一级的增益调整系数,在每一级SOS之前将输入的信号X用增益调整系数进行衰减,即
                                                                                   4-2
这样做的目的是因为信号经过每一级的SOS都有一定的大于1的增益,比如,表4.1中的系数,经过MATLA计算可知第一个SOS1的放大增益在2倍左右。而四级SOS提供的增益会非常大。如果不做增益调整,带来的影响有两个:第一,整个IIR滤波提供了额外的增益,而对于滤波器来说我们不希望带来额外的增益;第二,由于某一级SOS可能提供非常大增益,那么在本级计算中很有可能出现溢出的现象。增益调整就是将前一级SOS放大的信号,缩减回来,降低下一级SOS溢出概率。当然这种增益调整并不能完全解决IIR滤波器的溢出问题。
4.2 系数的量化和归一化
4.2.1系数的量化
表4.1中是用小数来表示系数,如果在不做任何变换的前提来直接拿来计算卷积,那么必须采用单精度浮点数乘法来计算。这样势必给FPGA带来很大的资源消耗。
对系数的量化目的就是为了将小数乘法运算转化为整数乘法运算。量化的方法很简单,对公式4-1两边同时乘以214,将系数可能的最大值2量化到215,加上符号位整个系数长度刚好为16位,即系数为16bits带符号整型。同时在a2、a3加上符号,将差分方程调整为全加法计算,即,
4-3
得到的量化系数为:

表4.2 量化后的4级SOS系数
将增益调整系数放进下一级SOS系数b1、b2、b3中,即
表4.3 增益调整后的4级SOS系数
这样做的目的就是为了将低乘法器的使用。计算过程中就可以不再考虑增益调整问题,输入信号X经过四级SOS运算后,幅度没有增强。
4.2.2 系数的归一化
关于a1系数的量化,从差分公式中可以看出,原本a1的值是1,即不需要乘法运算。但是系数量化后a1=214=16384那么在计算y(n)输出时带来了除法,而在FPGA中实现2的幂次倍的除法时可以直接利用移位操作来实现,即每个SOS输出结果向右移位14bits,即完成了除法。这个过程就是叫做去归一化。
4.2.3 量化精度对滤波效果的影响
1、量化位数越小,FIR对小信号滤波效果变差(频响、带内增益和带外衰减都存在问题);
2、量化位数越大,虽然对滤波效果有很大的帮助,但是出现溢出的概率越高;
3、量化中有截断误差。
4.3 IIR的溢出
4.3.1 溢出的产生原因
从数学角度分析差分方程式4-3

假设每一级SOS输入的系数为16bits有符号数,数据为18bits有符号数,则乘法运算结果输出位宽为:
1sign bit+15bits+17bits=33bits,
每累加一次数据位宽增加一位。所以y(n)最大宽度为:
33bits+4bits=37bits。
去归一化之后,每一级SOS输出位宽为:
37bits-14bits=23bits
那么如果将计算位宽调整到23bits是不是就可以保证不会溢出呢?
我们要考虑两个问题,第一个是本级的输出作为下级的输入,如果下级SOS的位宽任然为18bits,那么从数学角度,溢出的情况是肯定会发生的;第二是,本级当前的输出作为下个数据的历史值(即反馈),注意以上位宽在计算时,我们假设数据都是18bits,很显然这是不科学的,因为反馈值y(n-1)和y(n-2)位宽可能已经超出了18bits。
由以上数学角度分析可以得出下面结论:
1、IIR滤波器的溢出是一定存在的;
2、溢出不仅是在IIR接联里某一级SOS产生,可能随着级数的增加而加深(或者说不可控)。
我们再从IIR系数角度分析溢出问题。
IIR每个SOS都可以由一个二阶模拟滤波器与之相对应,即每个SOS都有自己的增益。增益过大那么在本级计算过程中出现溢出的概率越高。所以,我们可以通过调整每级SOS之前的增益调整系数来避免溢出的出现,即,在具有大增益的SOS之前缩小输入值。但这样做带来的结果就是AD精度的丢失。丢失精度带来的结果是,波形存在很多毛刺,且小信号波形失真严重。
在资源有限的情况下,我们必须做此调整来保证不溢出。相对波形失真,我们更不愿意看出溢出。

4.3.2调整每级SOS的输入和增益调整系数,将溢出控制在有效范围之内
       先看看表4.1系数在各级SOS处的增益。

图4.1
可以看出第三级SOS增益较大大,此级容易出现溢出现象。分析各级增益对输入输出位宽的影响。

图4.2
由上所述,将增益调整放在下级SOS中计算,所以每一级的SOS增益做了调整。SOS1和SOS2一共提供了大约4倍增益,即16bits左移2位,变成18bits数据,在此,由于我们就是采用18bits位宽计算,所以在两个SOS输出端出现溢出的几率较低。第三级SOS提供了14.2倍的增益,即左移4bits,变成了22bits数据,此时,已经完全溢出。第四级由于衰减系数比较小,所以增益缩小了0.02倍,即22bits右移6bits,又回归到了16bits。
       我们将所有的增益都乘起来得:

整个滤波系统增益为1。
       下面我们就保证系统增益不变的情况下,调整每级的输入位宽和增益调整系数来减低溢出概率。

1、  我们知道由于噪声的存在,16位AD采集到的数据低位都是噪声数据,所以在滤波时,可以丢弃低几位,在这里,我们采用15bits输入。即>>1;
2、  SOS3增益为16倍左右,即会使输入<<4,为了保证输出仍在18bits的动态范围之内,必须将17bits数据>>3后再输入到SOS3中,即>>3;
3、  SOS4本来的增益只有0.02,做了衰减,那么18bits进肯定不会产生溢出。但是我们考虑到SOS4之前我们已经将数据>>4,做了缩小操作,必须在后级中补回来才能保证整个系统的增益为1。我们可以将补偿放在增益调整系数里面,因为前级对信号做了缩小操作所以SOS4之前的增益缩减可以稍微弱点,我们将增益调整系数扩大16倍,即>>4。而曾个SOS4增益变成了0.32,即>>1bits。从数学公式,考虑18bits输入到SOS4中可能会出现溢出,那么我们将数据>>1。即17bits的数据进入SOS4,输出的刚好是16bits数据。
4、  从整个系统角度,数据被我们>>3位(AD缩小1位除外),增益调整系数<<4位,所在整个系统增益放大了1bits。IIR滤波变成了15bits进16bits出的带有增益的滤波器。
5、  数据每>>1一次,就丢失1bits精度,我们一共丢失了5bits的精度,带来的结果就是波形失真。
调整某些级的输入和改进增益调整系数的目的就是为了保证18bits计算无溢出,带来的不良结果是:小信号输入时波形失真严重;噪声变大;频响变差。
       IIR设计过程中的注意点:
1、  MAC的结果不但要给下级SOS,还要作为本级的反馈保存到RAM中,那么在本级反馈回来上,只能去归一化,不能做额外的移位。
2、
4.4 利用FPGA实现IIR滤波器(32bits计算)
4.4.1 32bits计算精度的选择
       由以上分析可知,18bits计算IIR,在保证不溢出的条件下必须丢失5bits的精度。带来的不良后果是在小信号输入滤波时波形失真,频响失真。所以为了保证无溢出且滤波效果良好,必须采用32bits带符号计算。下面评估18bits和32bits计算下的硬件资源需求。
1.         18bits计算时,每个AD8221芯片需要4个SOS模块,每个SOS需要2个9*9的DSP单元,需要32(24)*8*16bits(18)=1M4K。那么3片AD8221做8阶IIR滤波,总共需要24个DSP和12个M4K。
2.         相同结构的32bits计算IIR资源需求,DSP和M4K都扩大2倍,分别为48和24。
我们知道,2C8器件DSP最大数量为36个,M4K也为36个。显而易见相同结构32bits计算无法在2C8上实现。DSP需求已经大于2C8所能支持的最大数量。所以在结构上面必须做优化。
4.4.2实现结构
       18bits计算时,我们为每路AD8221分配了一个滤波通道,每路滤波通道里面拥有单独的MAC单元。32bits计算时所需的乘法器成为了瓶颈。所以我们优化思想是将三路AD同时送入到一个滤波通道,分时的进入MAC计算。也就是说本来每个MAC只需要算24个模拟通道值,一共有3*4个MAC同时计算,优化后只有1*4个MAC,需要计算72个通道值。所需的DSP个数为16,存储单元的数量不变,2C8器件可以满足要求。
       每一级SOS中的数据路径如图4.3所示,3路AD值存储到3个RAM中,MUX分时将不同的值送到MAC单元中进行乘累加运算。

图4.3 优化后的SOS的数据路径
4.4 利用FPGA实现IIR滤波器(32bits计算)
4.4.3控制单元(状态机)
       对数据路径单元进行控制的部分由状态机完成。状态说明在表格4.4中,状态转换图如图4.4所示。

表 4.4 各个状态功能说明
         在状态转换图中可以看出,此状态机中有两个循环,大的循环中(蓝色线标识)完成一次采样周期里对3路ADC数据进行IIR滤波计算。大循环内部有一个小循环(红线标识),蓝色循环每执行一次红色循环执行3次,红色循环一次完成对一路ADC的计算。

图4.4 状态转换图
4.4.4 RAM中存储调度
         图4.3所示的数据路径图中的RAM对应的地址空间分配如图4.5所示。为每个模拟通道分配8个存储空间,存储调度如图4.6所示。

图 4.5 每个ADC对应的RAM地址空间

图 4.6 存储调度
         指针在每一帧(24个通道)开始前加2,完成Xn→Xn+1的保存。
1.         在SAVE状态时,保存当前的Xn;
2.         在READ状态时,按顺序读出Xn-2、Yn-2、Xn-1、Yn-1和Xn;
3.         在OUT状态时,保存Yn;
4.         MAC计算乘累加时,连续读5个数据,读地址在指针的基础上加4;
5.         存入Yn值时,写入地址在指针基础上加1;
6.         指针每次按照2自增。
4.4.5时间余量计算


         系统需求,在每个AD_data_ok有效时,采集3个通道值,并在下一个AD_data_ok有效之前完成IIR计算。
         AD_clk=2.5MHz,采样间隔为(1/2.5M)*22=8.8us
         IIR计算所需时间为(1/30M)*187=6.17us
IIR计算时间小于采样间隔,所以能够完成优化后32bits的IIR滤波功能。
回复

使用道具 举报

该用户从未签到

6

主题

315

回帖

295

积分

二级逆天

积分
295

终身成就奖特殊贡献奖原创先锋奖社区居民社区劳模

QQ
发表于 2013-12-13 15:38:28 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

9

主题

713

回帖

2296

积分

二级逆天

积分
2296

终身成就奖原创先锋奖社区居民宣传大使奖

QQ
发表于 2013-12-14 07:55:51 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

每日签到,有金币领取。


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表