基于FPGA的FIR数字滤波器的设计与实现
2014-10-20熊洁黄蕾
熊洁 黄蕾
摘 要:本课题是基于VHDL的数字滤波器的设计与实现,要求完成数字滤波器的VHDL语言的模块描述,通过MAX+PLUSII进行各模块及顶层的仿真,并下载实现数字滤波器功能。本设计采用窗函数法实现线性FIR数字滤波器的设计,并以一个十六阶低通FIR数字滤波器的实现为例说明了设计过程。
关键词:FIR滤波器;VHDL;窗函数
本课题基于智能芯片的思想,采用FPGA电路的二次开发和在线编程能力硬化实现数字滤波器功能模块,主要讨论基于FPGA技术的数字滤波器设计方案与具体实现方法。本设计的任务是完成数字滤波器的VHDL语言的模块描述,并通过MAX+PLUSII进行各模块及顶层的仿真。
主要任务:
(1)完成基于VHDL的并行FIR数字滤波器的设计。(2)用MAX-PLUSII编程实现。(3)完成数字滤波器算法的仿真。
FPGA有着规整的内部逻辑阵列和丰富的连线资源,特别适合于数字信号处理任务,其并行性和可扩展性好,长期以来,FPGA一直被用于系统逻辑或时序控制上,很少有信号处理方面的应用,其原因主要是因为在FPGA中缺乏实现乘法运算的有效结构。现在这个问题得到了解决,使FPGA在数字信号处理方面有了长足的发展。
1 设计思路及特点
1.1 设计思路
采用窗函数设计法设计FIR滤波器的系数,并采用并行加法结构来提高速度 。
1.2 设计特点
本课题是要设计一个16阶8系数的FIR滤波器,则N=16,x(n),h(n)均用8位二进制数表示。
假设有16个数据x0,x1,x2,……,x14,x15,每个数据都用8位二进制数表示,现要将这16个数相加。我们先将16个数据分为8组,x0与x1,x2与x3……x14与x15。这样的话,8组数据就可以同时进行加法,只需要一个时钟周期。再将上一步所计算得到的8个数据分组,分为四组,进行加法。以此类推,直到算完为止,这样就需要15个加法器,但只需4个时钟周期。与传统累加结构相比,并行加法结构大大减少了计算时间,提高了计算速度。
2 具体步骤
2.1 参数设计
2.1.1设计指标
下面以一个十六阶FIR低通滤波器为例说明设计方法和过程。设定采样频率为100kHz,精度<=+1,截止频率为5kHz,输入数据宽度为8位,输出数据宽度为8位。
2.1.2参数计算
采用窗函数设计法来计算FIR的系数,使用的窗函数为汉宁窗。
我们利用反傅立叶变换公式和低通滤波器的频率响应H(ejω)求出对应的冲激响应hd(n),
由于要求设计一个16阶的FIR,则N=16。计算得hd(n)如下:
hd(0)=hd(15)=0.030025765,hd(1)=hd(14)=0.04365539,hd(2)=hd(13)=0.057190986,hd(3)=hd(12)=0.069900094,hd(4)=hd(11)=0.081074297,hd(5)=hd(10)=0.090077296
hd(6)=hd(9)=0.096388641,hd(7)=hd(8)=0.099639786
根据汉宁窗的表达式,计算出汉宁窗的系数如下:
ω(0)= ω(15)=0,ω(1)= ω(14)=0.043227271,ω(2)= ω(13)=0.165434696,
ω(3)= ω(12)=0.345491502,ω(4)= ω(11)=0.552264231,ω(5)= ω(10)=0.75
ω(6)= ω(9)=0.904508497,ω(7)= ω(8)=0.9890738
根据,可计算出的符合设计指标的线性相位16阶FIR数字低通滤波器的特性参数如下:
h(0)=h(15)=0,h(1)=h(14)=0.001887103,h(2)=h(13)=0.009461373,h(3)=h(12)=0.024149888
h(4)= h(11)=0.044774434,h(5)= h(10)=0.067557972,h(6)= h(9)=0.087184344,
h(7)= h(8)=0.098551101
为了设计的方便,可将上述数据扩大,由于滤波器输出,我们将h(n)扩大1024倍,即210,这样只需将y(n)除以1024,即右移10位即可,将h(n)乘以1024,得到以下数据:
将上述数据取整,并化为二进制数(8位):
2.2 程序实现及编译仿真
2.2.1 编写VHDL程序
首先,根据H1,H2…H7模块的结构图,编写VHDL程序:h1.vhd,h2.vhd…h7.vhd,编译仿真;然后,根据系统的总的设计框图,分别编写移位寄存器、加法器和移位的程序:reg.vhd,adder.vhd,shift.vhd,并编译仿真;最后,把各个模块根据总的系统设计框图相应的连接起来,得到总的系统图,并进行仿真。
2.2.2 仿真结果
仿真结果1大致波形图如下:
如果输入x分别从1至14,代入上式计算,由于在参数设计中将滤波器系数扩大了1024倍,所以将所得结果除以1024可计算得y=5。由上图可以看出,符合设计要求。
仿真结果2绘制波形图如下:
另外,设计的滤波器完成一次滤波所需时间为89.8ns,采样频率可达到10MHz,运算速度快,能满足设计要求。
3 结论及改进
3.1 结论
本课题是基于VHDL的数字滤波器的设计与实现,要求完成数字滤波器的VHDL语言的模块描述,通过MAX+PLUSII进行各模块及顶层的仿真,并下载实现数字滤波器功能。我们以一个16阶低通FIR数字滤波器为例介绍了用窗函数设计法设计的过程,计算出FIR滤波器的特性参数,得出总的系统框图,根据框图连接各模块设计出总的FIR系统图,在MAX+PLUSⅡ环境下编译、仿真,得出仿真结果。其结果正确,而且运算速度快,符合设计要求。
3.2 改进
从FIR的仿真结果可以看出,输出y存在一定的延时和尖峰脉冲。在本次设计中FIR的系数是以16阶低通滤波器采样频率为100kHz截止频率为5kHz为例设计出来的,因此这些系数并不具有通用性。在本次设计中输入信号是一系列数字信号,因此可以利用模数转换器将模拟信号转换为数字信号,再用FIR滤波器处理转换后的信号。
参考文献
[1]日)谷萩隆嗣著.《数字滤波器与信号处理》.北京-科学出版社2003
[2]雷伏容.《VHDL电路设计》.清华大学出版社2006
[3]贝耶尔著.《数字信号处理的FPGA实现》第三版. 清华大学出版社