当前位置:首页 > 新闻资讯 > FPGA之家动态 >

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

时间:2024-07-29      来源:网络搜集 关于我们 0

点击上方

蓝字

关注我们

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

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

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

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

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

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

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

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

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

二、多相分解算法

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

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

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

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

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

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

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

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

  毕竟也是普通FIR滤波器,用到的乘法器比较多,这也是之前我尽量降低滤波器阶数的原因,乘法器中的参数一个是移位寄存器中的数据,另一个就是生成的滤波器系数,之前都做过类似的,这里不再多说。

    3倍抽取器是有三部分的数据的,我们把这三部分数据相加,其实就是卷积运算的最后一步累加运算,要注意的是累加后的输出数据的位宽,可以通过MATLAB仿真,确定输出数据的位宽,这里我仿真出来输出数据需要用23位二进制数表示。

     算法的笔记不好写,毕竟打不出数学公式,老用文字叙述感觉总不能表达好自己的想法,大家尽量多看下书本,再结合一下代码就很容易明白了。下面是仿真波形

扫描二维码获取

更多精彩

FPGA设计论坛

往期推荐  

简谈基于FPGA的千兆以太网

零基础学FPGA(三十) IIR数字滤波器的FPGA实现笔记

至芯入门课程-USB2.0设计

零基础学FPGA(三十一),Hogenauer CIC抽取滤波器的FPGA实现

零基础学FPGA-精简指令集RISC_CPU设计精讲

欢迎关注至芯科技

至芯官网:www.zxopen.com

至芯科技技术论坛:www.fpgaw.com

至芯科技淘宝网址:

https://shop101836044.taobao.com/spm=a230r.7195193.1997079397.2.9gJ436

至芯科技FPGA初级课程 :

https://ww.bilibili.com/video/BV1Yh411d733?from=search&seid=10043829254555203948 

至芯科技-FPGA 交流群(QQ):282124839

点击观看FPGA初级课程

点个

在看

你最好看


注明:本内容来源网络,不用于商业使用,禁止转载,如有侵权,请来信到邮箱:429562386ⓐqq.com 或联系本站客服处理,感谢配合!

用户登陆

    未注册用户登录后会自动为您创建账号

提交留言