原创 零基础学FPGA(三十三)多相结构抽取滤波器笔记

2015-8-29 15:19 2584 11 4 分类: FPGA/CPLD 文集: FPGA/CPLD

        前两篇文章已经介绍过了,在多速率信号处理中,CIC滤波器和FIR半带滤波器应用的非常广泛,由于CIC滤波器的特殊结构,使得它非常适合采样速率远远大于信号速率的情况时的抽取跟内插滤波器,同样,FIR半带滤波器的通阻带对称性使他适合于2倍抽取跟内插滤波器,如果单级滤波器达不到要求,可以通过级联的方式来获得响应的抽取或内插倍数以及阻带的衰减。

        然而,当我们的需求不满足上述两种滤波器的适用范围的时候,我们就需要用到普通的滤波器,例如我们的信号速率并没有远远小于采样率,例如我们需要进行3倍抽取或者内插,此时我们就需要用到普通滤波器实现。普通滤波器没有上述两种滤波器的特殊结构,要想提高运算效率,节省硬件资源,还需要从算法上下手。

       关于多相结构的FIR滤波器的理论部分书上很多,且都是些数学推导,小墨用打字的方式也说不明白,只能大体说一下我自己的理解,想要深入了解这种算法的朋友还需要通过书本,自己亲手推导才能加深印象。

       我直接举个例子好了,我觉得书上用的都是字母表示,理解起来不方便,还不如直接举个例子来的方便。

一、使用 filter design &analysis 工具设计FIR滤波器

       假设我要对一个合成信号进行滤波,合成信号是由一个20hz和一个800hz的正弦波合成,关于滤波器的设计,我们可以先用MATLAB为我们提供的一个滤波器设计工具来进行设计,即   filter design &analysis 工具

 

       qq截图20150829130003.jpg

       我用这个工具设计一个FIR低通滤波器,采用窗函数法设计,用凯塞窗。为了简单起见,我们自己定义滤波器的通阻带,采样频率以及通阻带衰减,尽量让滤波器阶数小一点,方便我们后边的FPGA实现,毕竟这只是个例子,简单一点比较好,如果真的当做工程设计来做,那就具体情况具体分析了

       滤波器设计参数见上图,最终我们的滤波器阶数为25阶,还算是一个可以接受的长度。做这一步的目的主要是确定一下滤波器的长度,由于我们还要对系数进项量化,因此还要再回到MATLAB中进行设计,设计参数就按上面的来,得到相应阶数的滤波器系数,量化并进行16进制转换供FPGA使用。

       qq截图20150829131809.jpg   

    前面说了,多相结构的FIR滤波器是在算法上下功夫,所以本身滤波器的设计过程就是普通滤波器的设计过程,并没有什么不同,下面再来看多相分解算法

二、多相分解算法

       以上面这个例子为例,原始采样率为6000hz,假设我现在需要对其进行3倍降频,按照一般的FIR抽取滤波器直接算法是这样的:

       将输入信号存入长度为26的移位寄存器中,假设当第10个数据输入到移位寄存器中的时候,移位寄存器中数据要跟26个滤波器系数进行一次卷积运算,运算完成后输出到抽取器,因为10不是3的倍数,所以,输出的这个数据就被舍弃,因为3倍抽取器是每隔三个数进行一次抽取。同样,当第11个数据到达移位寄存器的时候,还需要进行一次卷积运算然后输出到抽取器,又因为11不是3的倍数,所以这个数据也被舍弃,直到第12个数据输入到移位寄存器,输出的数据才能通过抽取器输出,此时输出的数据为Y(3),也就是第四个滤波器真正输出的数据。这样看来,每进行一次抽取,就有两次卷积运算是徒劳的,白白浪费了时间和资源。

      多相分解结构的算法是这样的:

qq截图20150829143214.jpg

       将抽取器放到滤波器之前,当第10个数据输入到移位寄存器的时候,抽取器前面的延时链上的数据为x(9),x(8),x(7),此时,由于10不是3的倍数,所以抽取器不打开,也就是不进行抽取,当第12个数据进入到移位寄存器的时候,12是3的倍数,所以抽取器打开,此时才开始进行输入数据与滤波器系数的卷积运算,如果再将抽取器后面的部分展开就是这样的:

        qq截图20150829145633.jpg

     当然,我们这个例子的滤波器长度为26,所以可以继续往上加

三、多相分解算法的FPGA实现

   首先当然是先将输入数据存入移位寄存器,这个就不必多说,之前做的时候都是这样实现的,其实我们要做的就是做一个计数器,每来一个数据计数器加1,等到计数器为3的时候产生抽取信号,打开抽取器即可,剩下的做法就是卷积运算的实现方法,说到底这个算法还是很简单的,大家稍微动一下脑子,看一下书就懂了

      qq截图20150829150352.jpg

     抽取信号发出之后,我们锁存当前移位寄存器中的26个数据,然后按照多相分解算法,将对应系数送入乘法器即可。

qq截图20150829150611.jpg
 
  毕竟也是普通FIR滤波器,用到的乘法器比较多,这也是之前我尽量降低滤波器阶数的原因,乘法器中的参数一个是移位寄存器中的数据,另一个就是生成的滤波器系数,之前都做过类似的,这里不再多说。
 
    3倍抽取器是有三部分的数据的,我们把这三部分数据相加,其实就是卷积运算的最后一步累加运算,要注意的是累加后的输出数据的位宽,可以通过MATLAB仿真,确定输出数据的位宽,这里我仿真出来输出数据需要用23位二进制数表示。
 
    qq截图20150829150936.jpg
 
     算法的笔记不好写,毕竟打不出数学公式,老用文字叙述感觉总不能表达好自己的想法,大家尽量多看下书本,再结合一下代码就很容易明白了。下面是仿真波形
 
qq截图20150829151546.jpg
 
需要源码的朋友可以给小墨发邮箱。
 
                                                       小墨邮箱584642877@qq.com

      

 

文章评论2条评论)

登录后参与讨论

bitao1983_395643617 2016-2-28 11:29

不错,能在大学里结合一下实际的东西比什么都强!

billzhu_345737527 2015-10-25 21:08

Shiver me timbers, them's some great innaimotrof.
相关推荐阅读
小墨同学 2015-09-10 10:28
零基础学FPGA( 三十二) 写在京城,多级FIR半带滤波器的FPGA实现
        每次到京城来总不能忘了出去逛逛吧,偌大的北京城去哪呢?炙热的大太阳烤的哪都不想去了,幸好这次有亲戚来北京旅游,搭个顺风车便出去转了一下。这次的闲逛可没有上次那么感叹,上次主要是去的...
小墨同学 2015-08-29 15:18
零基础学FPGA(三十一)写在京城,Hogenauer CIC抽取滤波器的FPGA实现笔记
         实习完还没几天,突然接到北京至芯雷总的电话,让我赶往北京来做一些事情,就这样,我的又一趟北京之旅开始了。         上次来北京还是今年1月份,冬天嘛,京城光秃秃的一片,...
小墨同学 2015-08-05 20:50
【博客大赛】零基础学FPGA (二十六)必会! 从静态时序分析到SDRAM时序收敛(上篇)
    好像小墨有这么一个习惯啊,就是每篇文章的开头总喜欢叨叨几句啊~既然这样,那我们今天也聊几句好了,总感觉直接就开始学习专业知识有点让人看不进去~     今天我们就说说生活吧~时间很快啊,...
小墨同学 2015-07-26 21:57
[博客大赛]零基础学FPGA(三十) IIR数字滤波器的FPGA实现笔记
      然而暑假已经过了快一半,想想也是挺快的,前一段时间学校安排实习,在长沙待了一段时间,说是实习,感觉却是像是度假,住着酒店,100多号人,想想都觉的热闹。实习搞得是Java安卓,当然我也...
小墨同学 2015-06-17 09:50
[博客大赛] 零基础学FPGA (二十九)滤波器开篇,线性相位FIR滤波器的FPGA实现
        也是有一段时间不写博客了啊,主要是这学期的实验课太多,每天都是在写预习报告,实验报告中度过,也快到考试月了啊,感觉又要忙起来了,今天就抽点时间来开个头,开什么头呢?对!就如标题所示...
我要评论
2
11
1
2
3
4
5
6
7
8
9
0
关闭 热点推荐上一条 /2 下一条