`
每次到京城来总不能忘了出去逛逛吧,偌大的北京城去哪呢?炙热的大太阳烤的哪都不想去了,幸好这次有亲戚来北京旅游,搭个顺风车便出去转了一下。这次的闲逛可没有上次那么感叹,上次主要是去的高校,什么清华北大确实比一般学校壮观哈~也是多少人梦寐以求的高等学府。可惜只能作为一名游客的身份来逛一下清华校园了。
北京旅游的地方还是不少的,其实一直想去长城看一下,所谓不到长城非好汉,可是这么热的天,真的是到了长城一身汗了~听说前门大街不错,小吃很多,虽然在长沙吃惯了各种南方小吃,来北京尝一下北京特色还是不错的。一路上最火的算是那个全聚德烤鸭了吧,这么热的天,还有那么多人排队在那等着买,怪不得上次我从北京走的时候在特产店里买了两只真空包装的不怎么好吃,什么东西都还得到旗舰店买哈~
早就听说前门大街前几年刚开了一家杜莎夫人蜡像馆,也是即上海武汉之后的第三家了吧?上次去上海的时候很遗憾路过没进去,这次既然就在眼前怎么能错过~虽然门票贵了点,但是跟普京大帝合个影发一下朋友圈还是挺爽的哈~
下面送上梅西蜡像一张,感觉还是挺像的,其实里面有些人物蜡像还是跟真人差别很远的,比如杰伦....
好了,步入正题,这篇文章写一下关于FIR半带滤波器,并且采用Quartus II给我们提供的强大的FIR IP核进行设计并进行仿真 。这篇文章写的很简单,内容不多,做起来也不复杂,简单记录一下我做的过程吧。 一、关于FIR半带滤波器
首先再来说一下 FIR 半带滤波器的概念,之所以叫他FIR半带滤波器,是因为它本身具有FIR滤波器的本身具有的一些性质,其次它的幅频响应跟一般的FIR滤波器比起来有自己的特点,其实说白了,FIR半带滤波器就是一种特殊的FIR滤波器,它的具体特点概括如下:
1、FIR半带滤波器的通带宽度与阻带宽度相同,并且它的通带容限与阻带容限也相同,这样说来也就是说,通带与阻带是关于π/4对称的,这也是半带滤波器这个名字的由来。
2、FIR半带滤波器的长度为奇数,除零点外,其他偶数序号的单位脉冲响应为0,零点值为0.5,例如:FIR半带滤波器的单位脉冲响应为 -0.2 0 -0.1 0.5 0.1 0 0.2
从这个特点可以看出,FIR半带滤波器的系数有一部分是0,因此,在进行卷积运算的时候也就省去了部分乘法运算和加法运算,这就使得FIR半带滤波器的运行速度大幅度提升,占用的硬件资源大幅度减小。
3、FIR半带滤波器在进行两倍抽取的时候,信号的通带内没有混叠,但是在过渡带内存在混叠
二、多级FIR半带滤波器
从上面的几个特征我们可以看出来,由于FIR半带滤波器的通带跟阻带对称,那么,当通带较小的时候,阻带也较小,也就是意味着过渡带将会很长。举个例子,假如有用信号的通带截止频率是100hz ,我们的采样频率是10khz ,那么我们的FIR半带滤波器的过渡带是多少?就是10k - 100*2 hz的带宽,因此,FIR半带滤波器不能作为最后一级滤波器。
什么意思呢? 因为FIR半带滤波器的幅频特征非常适合作为2倍抽取的滤波器,再加上其单位脉冲响应有将近1半的系数为0,速度快,占用资源少,所以,我们经常将多个FIR半带滤波器级联起来,做多倍抽取操作。但是由于FIR半带滤波器的过渡带较宽,因此不适合作为最后一级滤波器。
再举上面那个例子,有用信号的通带截止频率为100hz ,原始采样频率为10khz,现在将其通过2级FIR半带滤波器,滤波后的采样频率为10k/4 =2500hz。假如最后一级滤波器,也就是第3级滤波器还采用FIR半带滤波器,那么滤波后的采样频率为1250hz,通带截止频率依然为100hz,根据FIR半带滤波器的性质,此时最后一级滤波器的阻带截止频率就为1250/2 -100 = 525hz,过渡带为525 -100 = 400hz 。好了现在假设干扰信号的频段在300hz该怎么办?这样的话FIR半带滤波器就不能将干扰信号滤除掉。所以,FIR半带滤波器不能作为最后一级滤波器使用,最后一级滤波器依然用普通FIR抽取滤波器,虽然阶数较大,但是可以保证信号正确的输出。
三、FIR半带滤波器的matlab 设计
我们通过一个例子来设计这样一个多级FIR半带滤波器
假设我们的合成信号是由100,300和600hz的正弦波相加而成的信号,并将其进行8bit量化,初始采样频率为6400hz,现在我需要将采样信号降为800hz,并要求获得100hz有用信号,要求滤波器的通阻带容限为0.1,设计这样一个FIR半带滤波器。
1、首先我们需要进行需求分析,原始采样频率为6400,要降为800,那么就需要3级2倍抽取滤波器
2、我们需要的是100hz的信号,因此需要将其他信号滤除,根据采样定理,我们降频后的频率为800hz,那么采样频率的一半为400hz,因此我们确定,最后一级滤波器的通带截止频率为100hz,阻带截止频率为300hz ,当然前两级FIR半带滤波器只需要考虑通带截止频率就好了,即100hz
3、要求通阻带的容限为0.1,那么前2两级FIR半带滤波器的通阻带容限为0.1/3 ,最后一级普通FIR抽取滤波器的通阻带容限为0.1
4、可以采用matlab为我们提供的firhalfband函数来设计半带滤波器,设计过程很简单,函数直接返回FIR半带滤波器系数。关于firhalfband函数的使用大家可以通过matlab的help功能进行自己学习,这里的用法就是只需要给出FIR半带滤波器的通带截止频率和通阻带容限即可,前面的参数minorder意思是函数可以根据后面两个参数,即通带截止频率相对于采样频率一半的归一化频率跟通阻带容限,自动计算滤波器最小阶数
根据FIR半带滤波器的特点我们知道,FIR半带滤波器的单位脉冲响应是偶数序号的系数为0,我们通过MATLAB函数直接调用生成的滤波器系数见下图,可见实际情况跟理论相符。
前面说了,FIR半带滤波器由于过渡带较宽,不适合作为最后一级滤波器,最后一级滤波器还是用我们之前说过的普通滤波器设计方法,一般我们设计成最优滤波器的形式
既然FIR半带滤波器作为一种特殊的FIR滤波器,设计过程其实也跟之前说过的FIR滤波器差不多,先来回顾一下前面设计过的FIR滤波器。之前我们是先用MATLAB软件像上面那样,写出滤波器的设计指标,然后直接调用函数生成滤波器系数即可,然后我们手动将滤波器的系数用Verilog 语言放到
FPGA 中跟输入数据进行卷积运算完成滤波,如果需要降低或者提高采样率的话,还需要进行抽取或者内插处理。这次实验我们用的是Quartus II 给我们提供的IP 核来做就没有原来那么麻烦了,所有的工作都交给IP核来工作,我们只需要做的是生成符合要求的滤波器系数,然后仿真正确无误后交给FPGA处理。
上面我们设计完了前两级的FIR半带滤波器和最后一级的FIR普通滤波器,由于我们要进行降频处理,也就是抽取处理,每一次抽取处理紧跟在一个抗混叠滤波器之后进行,见下图:
根据上图可以看到,我们利用3个FIR滤波器进行级联,前两级滤波器为半带滤波器,最后一级为普通FIR半带滤波器,总共进行了8倍抽取。因此我们可以推想,经过这三级滤波器滤波后的信号,会滤除高频分量,留下我们需要的100hz的有用信号并且采样频率降低8倍,下面是仿真图:
我们可以看到,经过三级滤波器滤波后,高频分量有了一定程度的衰减,我们需要的有用信号没有***扰,虽然高频分量的衰减不是很足,当然也是跟我们这个实验设计的阶数有关系,为了简单起见,滤波器阶数较低,衰减不是很足,当然这里也满足设计要求,我们再来看一下时域波形,根据推想,时域波形应该是信号的频率不变,采样频率降为原来的八分之一才对,仿真见下图:
由图可见,设计完全符合我们的要求,既然仿真成功了,那么我们就可以在硬件上实现了。
四、FIR半带滤波器的FPGA设计
这次我们直接调用FIR滤波器的IP核来设计,非常的方便,我们只需要做一下顶层的理化,考虑一下有限字长的影响,就可以将工作交给IP去做,而且效率比我们自己写代码高的多,首先先来认识一下FIR滤波器的IP核:
IP核的调用过程很简单这里不再叙述,在调用的时候有两个IP可以调用,我用的是FIR compile ,另外一个是FIR compile II,但是用了一下不出波形,也就放弃了,这里用第一个来做。
先来看一下设计界面:
1、就是用来新建,编辑和删除滤波器系数用的,进入界面之后会自动新建一个页面,我们如果想编辑滤波器系数的话,可以通过点击edit coefficient set 选项进行滤波器系数设置,见下图:
关于滤波器系数的设置,我们可以通过手动将系数敲进去,但是我们之前不是用MATLAB生成了滤波器系数吗,在阶数少的情况下可以一个一个的敲进去,但是在阶数多的情况下就不适用了,所以我们可以通过导入TXT文件的形式导入滤波器系数,将MATLAB生成的系数写进txt文件中,然后直接导入进去即可,上图就是我将第一级FIR半带滤波器导入后的滤波器频域波形,可见滤波器的通阻带是关于π/2对称的,虽然不是很明显。
2、是用来显示滤波器量化前后的波形变化情况,前者是未经量化的理想滤波器的幅频响应,但是要考虑有限字长的影响,我们需要将滤波器系数进行量化,一般量化8到16位就够了,当然量化位数越高,精度越高,两条曲线会逐渐重合,后者是经12bit量化后的幅频响应曲线。
3、选择auto with power 2 ,IP核会自动将滤波器系数中最大的值量化成2的整数次幂的形式,后面是系数的量化位数,为12bit
4、用来设置滤波器的实现结构,不同的结构实现算法不同,占用资源,速度也不同,我们这里用多周期结构
5、设置流水线级数
6、用来设置我们滤波器的类型,可以是抽取,内插,普通单速率滤波器等,这里我们前两级是FIR半带抽取滤波器,因此我们选择抽取滤波器,抽取倍数为2
7、用来设置输入的数据,我们设置输入数据为有符号二进制数,又因为前面我们说了,合成信号是讲过8bit量化后的,所以我们设置输入数据位宽为8。这样,输入数据为8位,滤波器系数量化为12位,那么我们第一级滤波器的输出为20位。
同理 ,第二级FIR半带抽取滤波器的IP核配置跟第一级几乎相同,只要改一下滤波器系数,重新导入MATLAB生成的第二级滤波器系数即可,还要再改一下第二级滤波器输入数据位宽,此时为20位。第三级,也就是最后 一级,需要用普通单速率滤波器,导入第三级滤波器系数,将滤波器类型改为单速率滤波器,输入数据位宽为32位。
需要注意的是,在调用生成第二级FIR滤波器 IP核的时候不需要重新再创建一个,也创建不了,我们只需要将第一级滤波器IP进行复制,改一个名字即可重新配置
复制已经生成的IP
重新命名
IP核配置好了之后我们依次对其进行例化就好了,例化的过程中要注意IP核引出的几个管脚的意思,注意几个主要的就好了,具体例化见下图:
需要注意的是,我们需要做的是3级的FIR滤波器,每一级滤波器都有一个输入使能跟输出有效,只有当上一级输出有效的时候,下一级才能输入使能,因此我们将顶层3级滤波器例化好之后的RTL视图见下图:
我们调用modelsim进行仿真,仿真波形见下图
可见输出后的波形采样频率已经大大降低,并且滤除掉了高频分量,留下了我们需要的有用新号,可见这次的设计还是符合我们的设计要求的。
想要源码的朋友可以给小墨发邮箱,谢谢大家支持
小墨邮箱584642877@qq.com
`
7
好东西,谢谢分享!
提交评论
请问下,你用“FIR compile II,但是用了一下不出波形”是什么情况啊?我的是系数明明是奇数且对称的,但还是报错,是不是FIR compile II的bug?
提交评论
我按照您的方法设计滤波器,但是在Quartus中的FIR compile 不能综合处modelsim仿真网表,请问怎么解决呢
提交评论