基于FPGA的FIR滤波器设计.docx
- 文档编号:9930515
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:22
- 大小:286.75KB
基于FPGA的FIR滤波器设计.docx
《基于FPGA的FIR滤波器设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的FIR滤波器设计.docx(22页珍藏版)》请在冰豆网上搜索。
基于FPGA的FIR滤波器设计
一、概述
在通信与信息技术领域,数字信号处理显得越来越重要了,数字滤波器在数字信号处理中起到重要作用并能够获得广泛应用。
数字滤波器根据频域特性可以分为低通、高通、带通和带阻四种基本类型,根据时域特性可以分为无限脉冲响应IIR(InfinteImpulseResponse)和有限脉冲响应FIR(FiniteImpulseResponse)。
FIR滤波器具有良好的线性相位特性,因此在数据通信、图像处理方面有广泛的应用。
FPGA(FieldProgrammableGateArray),即现场可编程门阵列,由于具有用户可编程性,能够实现用户规定的各种用途,因此又被称为可编程专用集成电路,在电子系统的设计中得到广泛的应用。
利用FPGA实现FIR数字滤波器的设计,是本次课程设计需要解决的问题,利用学过的知识实现FIR数字滤波器是本次课程设计的主要内容。
二、方案论证
1.FIR数字滤波器是一种线性时不变系统(LTI),如果FIR数字滤波器的单位脉冲响应h(n)的长度为N,其传递函数和差分方程分别为:
H(z)=
y(n)=x(n)*h(n)=
其中,x(n)和y(n)分别为输入和输出序列。
如果FIR数字滤波器的单位脉冲响应h(n)是实数序列,而且满足偶对称或者奇对称条件,即
h(n)=h(N-1-n)
或者
h(n)=-h(N-1-n)
则滤波器具有严格的线性相位特点。
正是因为这种特点,在滤波器的设计过程中,可使乘法器的数量减半。
对于n阶滤波器,当n是偶数时,乘法器的个数为n/2个,当n为奇数时,乘法器的个数为(n+1)/2个。
由传递函数和差分方程可以直接画出FIR滤波器的直接型结构如图1所示。
x(n)z
z
z
z
…
h(0)h
(1)h
(2)h(N-3)h(N-2)h(N-1)
…y(n)
图1FIR滤波器的直接型结构
2.FIR滤波器的实现方法有多种,通常有串行算法、半并行算法和并行算法,在串行算法中,常见的有单乘法器MACFIR滤波器和对称MACFIR滤波器。
单乘法器MACFIR滤波器是最简单的DSP滤波器结构之一,在采样速度比较慢、系数比较多的时候,需要用高速时钟来驱动乘法器,硬件数量比较少也使得滤波器的吞吐量下降了。
而对于对称MACFIR滤波器,基于逻辑结构的加法器将数据相加,在单乘法器滤波器的基础上,限制了最高时钟速度,需要额外的资源支持对称。
由于数据是在一个端口上正向读出和在另一端口反向读出,因此在控制部分提高了一定的资源消耗。
在并行算法中,常见的有转置型FIR滤波器、脉冲型FIR滤波器等,二者都使用加法器链,但在课程设计中不易实现。
3.根据滤波器的实现表达式,滤波器的实质是做一个乘累加运算,乘累加运算的次数由滤波器的阶数来决定,其串行结构如图2所示。
输入数据滤波输出
图2滤波器串行实现结构图
利用串行结构来实现FIR滤波器所使用的资源较少,只需要一些寄存器、一些乘累加器就可以完成滤波运算,一次滤波需要的时钟数由滤波器的结束来决定。
但对于课程设计的要求,阶数比较低时采用这种方法相对比较方便。
根据FIR滤波器的系数对称性,可以先进行加法运算,然后把加法结果再进行串行的乘累加运算。
这种串行滤波器的结构如图3所示。
R
R
R
乘累加器
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:
INSTD_LOGIC;
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='1')THEN
Dout<=Din;
ENDIF;
ENDIF;
ENDPROCESS;
ENDa;
b.第一级加法器
数据通过add889,就是8位数字输入,9位数字输出加法器,完成第一级相加运算。
因为本题是15阶FIR数字滤波器,它的滤波系数有对称的关系,所以采用第一级加法器,达到简化运算的效果。
当遇到一次时钟信号的上升沿,完成一次加法运算。
add889加法器如图10所示。
图10加法器add889模块
加法器add889的VHDL程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_arith.ALL;
ENTITYadd889is
PORT(clk:
inSTD_LOGIC;
Din1,Din2:
insigned(7downto0);
Dout:
outsigned(8downto0));
ENDadd889;
ARCHITECTUREaofadd889is
SIGNALs1:
signed(8downto0);
SIGNALs2:
signed(8downto0);
BEGIN
s1<=(Din1(7)&Din1);
s2<=(Din2(7)&Din2);
PROCESS(Din1,Din2,clk)
BEGIN
ifclk'eventandclk='1'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:
INSTD_LOGIC;
Din:
INSIGNED(8DOWNTO0);
Dout:
OUTSIGNED(15DOWNTO0));
ENDmult19;
ARCHITECTUREaOFmult19IS
SIGNALs1:
SIGNED(15DOWNTO0);
SIGNALs2:
SIGNED(15DOWNTO0);
BEGIN
P1:
process(Din)
BEGIN
s1(15DOWNTO7)<=Din;
s1(6DOWNTO0)<="0000000";
ifDin(8)='0'then
s2<=("000"&s1(15DOWNTO3))+("000000"&s1(15DOWNTO6))+("0000000"&Din)
+("000000000"&Din(8DOWNTO2));
else
s2<=("111"&s1(15DOWNTO3))+("111111"&s1(15DOWNTO6))+("1111111"&Din)
+("111111111"&Din(8DOWNTO2));
endif;
endprocess;
P2:
PROCESS(clk)
BEGIN
ifclk'eventandclk='1'then
Dout<=s2;
endif;
ENDPROCESS;
ENDa;
d.第二级加法器和减法器
通过8个乘法器无符号相乘后的数据被传递给第二级加法器进行加法运算,如果乘法系数是负数,则在第二级经过减法器来保证运算的正确性。
当遇到一次时钟信号的上升沿,完成一次加法或减法运算。
以加法器add161617和减法器sub161416为例,由QuarttusII生成的加法器模块如图12所示。
图12add161617加法器模块
加法器Add161617对应的VHDL程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_arith.ALL;
ENTITYadd161617is
PORT(clk:
inSTD_LOGIC;
Din1,Din2:
insigned(15downto0);
Dout:
outsigned(16downto0));
ENDadd161617;
ARCHITECTUREaofadd161617is
SIGNALs1:
signed(16downto0);
SIGNALs2:
signed(16downto0);
BEGIN
s1<=(Din1(15)&Din1);
s2<=(Din2(15)&Din2);
PROCESS(Din1,Din2,clk)
BEGIN
ifclk'eventandclk='1'then
Dout<=s1+s2;
endif;
endprocess;
enda;
由QuarttusII生成的减法器sub161416模块如图13所示。
图13减法器sub161416模块
减法器sub161416对应的VHDL程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_arith.ALL;
ENTITYsub161416is
PORT(clk:
inSTD_LOGIC;
Din1:
insigned(15downto0);
Din2:
insigned(13downto0);
Dout:
outsigned(15downto0));
ENDsub161416;
ARCHITECTUREaofsub161416is
SIGNALs1:
signed(15downto0);
BEGIN
s1<=(Din2(13)&Din2(13)&Din2);
PROCESS(Din1,Din2,clk)
BEGIN
ifclk'eventandclk='1'then
Dout<=s1-Din1;
endif;
endprocess;
enda;
所需的寄存器、乘法器、加法器和减法器通过编程,生成之后根据顶层原理图进行连接,加入输入端和输出端,即可构成所需要的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
取整
n
取整
n
取整
n
取整
0
16.00
16
10
32.00
32
20
16.00
16
30
0
0
1
-13.49
-13
11
-0.19
0
21
-18.50
-19
31
-31.80
-32
2
20.94
21
12
31.21
31
22
11.05
11
32
0.78
1
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
3
5
-4.68
-4
15
-4.6
-5
25
-27.31
-27
35
-27.31
-27
6
28.94
29
16
25.40
25
26
3.05
3
36
6.5
7
7
-1.74
-2
17
-8.7
-9
27
-30.25
-30
37
-23.26
-23
8
31.21
31
18
20.94
21
28
0.78
1
38
11.05
11
9
-0.19
0
19
-13.49
-13
29
-31.80
-32
39
-18.50
-19
由表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语言的编程,设计了滤波器中所需要的各个寄存器、加法器、减法器和乘法器等模块,最终形成了原理图,为了验证滤波器
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA FIR 滤波器 设计