基于FPGA的FIR滤波器设计Word文件下载.docx
《基于FPGA的FIR滤波器设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA的FIR滤波器设计Word文件下载.docx(22页珍藏版)》请在冰点文库上搜索。
根据FIR滤波器的系数对称性,可以先进行加法运算,然后把加法结果再进行串行的乘累加运算。
这种串行滤波器的结构如图3所示。
R
乘累加器
输入数据
滤波输出
图3串行滤波器结构
4.经过多种方案的比较,本设计最终决定采用串行结构来实现FIR滤波器。
方案是利用MATLAB提供的FDAtool设计所需要的FIR数字滤波器,并确定需要的滤波系数,最终实现FPGA的设计。
三、电路设计
1.利用FDAtool设计FIR数字滤波器。
采用MATALAB中附带的FDAtool工具,输入所需滤波器的参数,即可得到需要的滤波器。
各参数如下:
阶数:
15低通滤波(Lowpass)Bate=0.5
Fs=48kHzFc=10.8kHz
参数的设置如图4所示。
图4设置FIR滤波器参数
按照要求的参数,将参数输入FDAtool中,可以自动生成所需要的滤波器,并可以观察到设计的滤波器的幅频响应、相频响应以及得到的滤波器系数。
得到的FIR滤波器的幅频响应如图5所示。
图5FIR滤波器的幅频响应
幅频特性是描绘输入信号幅度固定,输出信号的幅度随频率变化而变化的规律,从设计的FIR滤波器的幅频响应可以看出,在频率为0至10kHz内表现为通带,10kHz以后表现为阻带,通带与阻带之间幅频响应产生突变,表现为低通滤波。
得到的FIR低通滤波器的相频响应如图6所示。
图6FIR滤波器的相频响应
FIR滤波器的相频响应,是指信号通过系统之后的输出信号的相位与它输入时的信号的相位值之差。
从滤波器的相频响应的特点,也可以看出其明显的低通特性。
由设计的滤波器可以得到相应的滤波系数如图7所示。
图7滤波器系数
将得到的滤波器系数导出,并利用MATLAB进行整理:
Num*(2^9)
ans=
Columns1through14
-19.12695.663628.96312.8166-45.2723-25.106893.6359214.4269214.426993.6359-25.1068-45.27232.816628.9631
Columns15through16
5.6636-19.1269
通过上面的滤波系数可以观察到很严格的对称性。
各系数在FPGA中的不带负号的具体二进制移位实现如下:
-19.1269:
左移4位+左移1位+原数+右移2位
5.6636:
左移2位+原数+右移1位+右移2位
28.9631:
左移4位+左移3位+左移2位+原数
2.8166:
左移1位+原数
-45.2723:
左移5位+左移3位+左移2位+原数+右移2位
-25.1068:
左移4位+左移3位+原数
93.6359:
左移6位+左移4位+左移3位+左移2位+原数+右移1位
214.4264:
左移7位+左移6位+左移4位+左移2位+左移1位+右移1位
2.FIR数字滤波器的FPGA的实现
工程设计所用的模块有:
顶层原理图文件,底层寄存器、加法器、减法器、乘法器的VHDL文件。
顶层的原理图如图8所示。
图8顶层原理图
各模块的详细说明:
a.寄存器
在原理图中标号为suoc8,输入的8位数据依次通过suoc8,达到各级的延时作用。
寄存器输入端有时钟信号、清零端、8位的输入端,输出也为8位。
当清零端clear为“1”时,无论输入端输入怎样的数值,输出端均输出“00000000”。
当clear为“0”时,加入时钟信号,当遇到时钟信号的上升沿,则将输入的数据从输出端输出。
生成的suoc8寄存器模块如图9所示。
图9寄存器suoc8模块
寄存器suoc8的相应的VHDL程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYsuoc8IS
PORT(clk:
INSTD_LOGIC;
clear:
Din:
INSTD_LOGIC_VECTOR(7DOWNTO0);
Dout:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDsuoc8;
ARCHITECTUREaOFsuoc8IS
BEGIN
PROCESS(clk,clear)
BEGIN
IFclear='
1'
THEN
Dout<
="
00000000"
;
ELSE
IF(clk'
EVENTANDclk='
)THEN
Dout<
=Din;
ENDIF;
ENDPROCESS;
ENDa;
b.第一级加法器
数据通过add889,就是8位数字输入,9位数字输出加法器,完成第一级相加运算。
因为本题是15阶FIR数字滤波器,它的滤波系数有对称的关系,所以采用第一级加法器,达到简化运算的效果。
当遇到一次时钟信号的上升沿,完成一次加法运算。
add889加法器如图10所示。
图10加法器add889模块
加法器add889的VHDL程序如下:
USEIEEE.STD_LOGIC_arith.ALL;
ENTITYadd889is
PORT(clk:
inSTD_LOGIC;
Din1,Din2:
insigned(7downto0);
Dout:
outsigned(8downto0));
ENDadd889;
ARCHITECTUREaofadd889is
SIGNALs1:
signed(8downto0);
SIGNALs2:
BEGIN
s1<
=(Din1(7)&
Din1);
s2<
=(Din2(7)&
Din2);
PROCESS(Din1,Din2,clk)
ifclk'
eventandclk='
then
Dout<
=s1+s2;
endif;
endprocess;
enda;
c.乘法器
乘法器用来将数据乘以由matlab计算得到的滤波系数,各系数的结果是通过移位运算得到,节约了硬件乘法器资源。
在上面说到,乘法器是通过移位实现的,以系数-19.1269为例,则是左移4位+左移1位+原数+右移2位。
当遇到一次时钟信号的上升沿,完成一次乘法运算。
生成的乘法器模块如图11所示。
图11乘法器mult19模块
乘法器mult19对应的VHDL程序如下:
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_arith.all;
ENTITYmult19is
PORT
(clk:
Din:
INSIGNED(8DOWNTO0);
Dout:
OUTSIGNED(15DOWNTO0));
ENDmult19;
ARCHITECTUREaOFmult19IS
SIGNALs1:
SIGNED(15DOWNTO0);
SIGNALs2:
P1:
process(Din)
s1(15DOWNTO7)<
=Din;
s1(6DOWNTO0)<
0000000"
ifDin(8)='
0'
then
s2<
=("
000"
&
s1(15DOWNTO3))+("
000000"
s1(15DOWNTO6))+("
Din)
+("
000000000"
Din(8DOWNTO2));
else
111"
111111"
1111111"
111111111"
P2:
PROCESS(clk)
=s2;
ENDPROCESS;
d.第二级加法器和减法器
通过8个乘法器无符号相乘后的数据被传递给第二级加法器进行加法运算,如果乘法系数是负数,则在第二级经过减法器来保证运算的正确性。
当遇到一次时钟信号的上升沿,完成一次加法或减法运算。
以加法器add161617和减法器sub161416为例,由QuarttusII生成的加法器模块如图12所示。
图12add161617加法器模块
加法器Add161617对应的VHDL程序如下:
ENTITYadd161617is
insigned(15downto0);
outsigned(16downto0));
ENDadd161617;
ARCHITECTUREaofadd161617is
signed(16downto0);
=(Din1(15)&
=(Din2(15)&
由QuarttusII生成的减法器sub161416模块如图13所示。
图13减法器sub161416模块
减法器sub161416对应的VHDL程序如下:
ENTITYsub161416is
Din1:
Din2:
insigned(13downto0);
Dout:
outsigned(15downto0));
ENDsub161416;
ARCHITECTUREaofsub161416is
signed(15downto0);
s1<
=(Din2(13)&
Din2(13)&
=s1-Din1;
所需的寄存器、乘法器、加法器和减法器通过编程,生成之后根据顶层原理图进行连接,加入输入端和输出端,即可构成所需要的FIR数字滤波器。
3.各模块之间的关系
由于本设计采用的是串行的滤波器设计,其中使用的15个寄存器依次相连,前一级寄存器的输出端接入下一级寄存器的输入端,起到逐级延时的作用。
根据滤波器系数的对称性,第0级系数与第15级系数相等,第1级与第14级系数相等,以此类推,第N级与第15-N级系数相等,因此可先进行加法运算,即第N级与第15-N级相加。
第N级与第15-N级相加之后与得到的第N个乘法系数相乘,一共得到8组无符号相乘的结果。
得到的数据再以此相加,乘法系数带负号的数值经过减法器,作为减数,从而达到加法的效果,逐级相加之后输出。
四、性能的测试
为了验证设计的FIR数字滤波器的性能,并验证设计的FIR数字低通滤波器的正确性,本设计加入了x(t)=sin(500*pi*t)+cos(10000*pi*t)的输入信号,其中的原信号为x
(t)=sin(500*pi*t),x
(t)=cos(10000*pi*t)为叠加在原信号上的噪声信号。
用MATLAB仿真原信号x
(t)=sin(500*pi*t),可以观察到其为正弦波如图14所示。
图14未加噪声信号之前的正弦信号
设抽样频率为10000,则抽样后x(n)=sin(0.05*pi*n)+cos(pi*n),取n=0,1…39,则可得到40个抽样值,由于x(n)为浮点数,本设计将x(n)扩大2
倍,得到x
(n),然后再取整,所得到的数值如表1所示
表1输入序列的处理
n
取整
16.00
16
10
32.00
32
20
30
1
-13.49
-13
11
-0.19
21
-18.50
-19
31
-31.80
-32
2
20.94
12
31.21
22
11.05
0.78
3
-8.73
-9
13
-1.74
-2
23
-23.26
-23
33
-30.25
-30
4
25.40
25
14
28.94
29
24
6.59
7
34
3.05
5
-4.68
-4
15
-4.6
-5
-27.31
-27
35
6
26
36
6.5
17
-8.7
27
37
8
18
28
38
9
19
39
由表1可得,采样值为Din=[16,-13,21,-9,25,-4,29,-2,31,0,32,0,31,-2,29,-5,25,-9,21,-13,16,-19,11,-23,7,-27,3,-30,1,-32,0,-32,1,-30,3,-27,7,-23,11,-19],将采样值作为输入信号,并将输入信号Din=[16,-13,21,-9,25,-4,29,-2,31,0,32,0,31,-2,29,-5,25,-9,21,-13,16,-19,11,-23,7,-27,3,-30,1,-32,0,-32,1,-30,3,-27,7,-23,11,-19]同样用MAYLAB生成相应杆状图,其杆状图如图15所示。
图15滤波前的输入信号杆状图
由生成的原理图在QuartusII上编译后,将输入信号数据从输入端(Din)输入,创建时域仿真波形,加入时钟信号clk,并将clear置低电平,可以得到滤波后的数据如图16(a)和16(b)所示。
图16(a)仿真后的时域波形
图16(b)仿真后的时域波形
由上图中的输出可得到输出的数据:
Dout=[-152,171,-5,-21,-340,102,500,1128,965,1064,1180,2130,2732,3370,3378,3798,4010,4168,4173,4033,3782,3515,3108,2600,2082,1588,1030,372,-350,-1040,-1588,-2085,-2610,-3102,-3515,-3810,-4033,-4162,-4161,-4028,-3660,-3683,-3100,-2585,-1743,-1690,-1530,
-1485,-596,-50,396,2,-22,-162,190],
将仿真后得到的数据在MATLAB中生成相应的杆状图,指令如下:
t=0:
1:
54;
Dout=[-152,171,-5,-21,-340,102,500,1128,965,1064,1180,2130,2732,3370,3378,3798,4010,4168,4173,4033,3782,3515,3108,2600,2082,1588,1030,372,-350,-1040,-1588,-2085,-2610,-3102,-3515,-3810,-4033,-4162,-4161,-4028,-3660,-3683,-3100,-2585,-1743,-1690,-1530,
-1485,-596,-50,396,2,-22,-162,190];
stem(t,Dout);
生成的杆状图如图17所示。
图17通过滤波器后得到的输出图形
通过图17和图15比较可知,在滤波前为叠加信号,滤波之后基本接近于正弦信号,基本接近于未加叠加信号时的波形图14,说明设计的FIR滤波器具有较好的滤波效果。
为验证滤波器的正确性,下面用MATLAB计算其卷积关系,由Din=[16,-13,21,-9,25,-4,29,-2,31,0,32,0,31,-2,29,-5,25,-9,21,-13,16,-19,11,-23,7,-27,3,-30,1,-32,0,-32,1,-30,3,-27,7,-23,11,-19],h(n)=[-19,5.6,29,3,-45,-25.1,93.6,214.5,214.5,93.6,-25.1,-45,3,29,5.6,-19]
指令如下:
Din=[16,-13,21,-9,25,-4,29,-2,31,0,32,0,31,-2,29,-5,25,-9,21,-13,16,-19,11,-23,7,-27,3,-30,1,-32,0,-32,1,-30,3,-27,7,-23,11,-19];
h=[-19,5.6,29,3,-45,-25.1,93.6,214.5,214.5,93.6,-25.1,-45,3,29,5.6,-19];
y=round(conv(h,Din)/2);
得到的计算结果如下:
y=
Columns1through12
-152168-4-20-3381015021126969106311882132
Columns13through24
273833753384380240134170418340383805351831102605
Columns25through36
208515871040371-371-1040-1587-2085-2605-3110-3518-3815
Columns37through48
-4035-4168-4168-4035-3663-3686-3107-2585-1748-1697-1538-1482
Columns49through55
-597-463870-26-158181
经过比较,由Din和h进行卷积得到的结果,和Din经过滤波器得到的Dout数值基本一致,由此可证明FIR低通滤波器的正确性。
五、结论
这次课程设计首先利用MATLAB中的FDAtool工具设计了需要的15阶FIR数字低通滤波器,并得到了对应的滤波系数,根据滤波系数设计出了滤波器中的乘法器,利用VHDL语言的编程,设计了滤波器中所需要的各个寄存器、加法器、减法器和乘法器等模块,最终形成了原理图,为了验证滤波器