基于Matlab和FPGA的FIR数字滤波器的设计.docx
- 文档编号:10215507
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:25
- 大小:744.96KB
基于Matlab和FPGA的FIR数字滤波器的设计.docx
《基于Matlab和FPGA的FIR数字滤波器的设计.docx》由会员分享,可在线阅读,更多相关《基于Matlab和FPGA的FIR数字滤波器的设计.docx(25页珍藏版)》请在冰豆网上搜索。
基于Matlab和FPGA的FIR数字滤波器的设计
湖南文理学院课程设计报告
课程名称:
专业课程设计
系部:
电气与信息工程学院
专业班级:
通信工程08102班
学生姓名:
赵瑞娇
学生学号:
200816020246
指导教师:
叶华
完成时间:
2011年6月22日
报告成绩:
评阅意见:
评阅教师日期
目录
一.引言3
二、设计目的:
3
三.FIR滤波器基本原理及结构:
3
1.FIR滤波器简介3
2.FPGA简介4
3数字滤波器的类型和设计指标5
4.FIR滤波器基本原理5
四.数字滤波器的设计与分析6
1.窗函数设计的基本思想和常用窗函数6
2十六阶FIR低通数字滤波器硬件电路设计8
五.FIR滤波器设计的仿真实现11
1.用程序设计法对FIR滤波器的仿真12
2.用窗函数设计法对FIR滤波器的仿真13
3.滤波器的FPGA实现及仿真:
17
六.心得体会24
七.参考文献24
基于Matlab和FPGA
的FIR数字滤波器的设计
一.引言
数字滤波器是数字信号处理的一个重要的技术分支。
利用它可以在形形色色的信号中提取所需要的信号,抑制不需要的干扰或噪声。
数字滤波器根据其单位冲激响应函数的时域特性分为两种:
无限长冲激响应(IIR)滤波器和有限长冲激响应(nR)滤波器。
IIR滤波器保留了模拟滤波器较好的幅度特性,设计简单有效。
但这些特性是以牺牲相位特性为代价而获得的,然而现在许多数据传输、图像处理系统都越来越多的要求系统具有线性相位特性“1。
在这方面,FIR滤波器具有独特的优点,它可以保持严格的线性相位特性,因此越来越受到广泛的重视。
FIR滤波器的设计方法有许多中,如窗函数设计法、频率取样法和最优化设计法等等。
而而随着MATLAB软件尤其是MATLAB的信号处理工具箱和Simulink仿真工具的不断完善,不仅数字滤波器的计算机辅助设计有了可能,而且还可以使设计法达到最优化。
二.设计目的
1.掌握FIR数字滤波器的步骤。
2.掌握MATLAB和FPGA(FieldProgrammableGateArray)的综合应用。
3.设计并实现基于MATLAB和FPGA的FIR数字滤波器。
三.FIR滤波器基本原理及结构
1.FIR滤波器简介
根据冲激响应的时域特性,数字滤波器可分为无限长冲激响应滤波器(IIR)和有限长冲激响应滤波器(FIR)。
相比于IIR滤波器,FIR的突出优点是:
(1).具有精确的线性相位
(2).总是稳定的
(3).硬件容易实现
(4).滤波器的过渡过程具有有限区间
但其在满足同样阻带衰减的情况下需要的阶数较高。
滤波器的阶数越高,占用的运算时间越多,因此在满足指标要求的情况下应尽量减少滤波器的阶数。
FIR滤波器的基本结构可以理解为一个分节的延时线,把每一节的输出加权累加,可得到滤波器的输出。
FIR滤波器的冲激响应h(n)是有限长的,数学上M阶FIR滤波器可以表示为:
其系统函数为:
由于FIR滤波器的单位冲激响应h(n)是一个有限长序列,系统函数H(Z)是Z-1的(N-1)次多项式,它在Z平面有(N-1)个零点,同时在原点有(N-1)阶重极点。
因此,H(Z)永远稳定。
2. FPGA简介
自20世纪70年代初期可编程只读存贮器(PROM)问世以来,PLD有了长足的发展。
早期的可编程逻辑器件只有编程只读存贮器((PROM)、紫外线可擦除只读存贮器(EPROM)和电可擦除只读存贮器(EEPROM)三种。
由于受结构的限制,它们只能完成简单的数字逻辑。
70年代中期出现了可编程逻辑阵列PLA,70年代末期出现了可编程阵列逻辑PAL,80年代中期又推出了通用阵列逻辑GAL,这些PLD器件的一个共同特点是可以实现速度特性较好的逻辑功能,但其过于简单的结构也使它们只能实现规模较小的电路。
为了弥补这一缺陷,近几年又推出了与PAL结构类似的标准门阵列可编程逻辑器件———FPGA(FieldProgrammableGateArray)。
它具有体系结构和逻辑单元灵活、集成度高以及适用范围广等特点。
这种器件兼容了PLD和通用门阵列的优点,可实现较大规模的电路,编程也很灵活。
与门阵列等其它ASIC相比,它又具有设计开发周期短、设计制造成本低、开发先进、标准产品无需测试、质量稳定以及可实时在线检验等优点。
因而被广泛应用于产品的原型设计和产品生产(一般在5000件以下)之中。
几乎在所有应用门阵列、PLD和中小规模通用数字集成电路
的场合均可应用FPGA器件。
这里利用FPGA来实现FIR数字滤波器,事实证明,达到了预期效果。
3.数字滤波器的类型和设计指标
数字滤波是由乘法器、加法器和单位延时器组成的一种运算过程,它对输入的离散信号进行运算处理,以达到改变信号频谱的目的.数字滤波器根据时域特性可分为无限脉冲响应IIR滤波器和有限脉冲响应FIR滤波器,两者各有优缺点:
IIR滤波器能以较低的阶次获得相同的幅度滤波性能,但一般为非线性相位;FIR滤波器单位脉冲响应是有限长的,系统必定稳定,且可以做成严格的线性相位,故在图像处理、数据传输等需要信道具有线性相位特性的场合应用广泛.
FIR数字滤波器就是要根据给定的技术指标,确定系统单位脉冲响应h(n),使系统的相位特性线性、幅度特性逼近给定的技术指标.如果h(n)是实数序列,且满足偶对称或奇对称条件,则滤波器就具有严格的线性相位特性.对幅度特性的逼近,常用最小平方逼近、插值逼近和最佳一致逼近等方法.。
4.FIR滤波器基本原理
FIR数字滤波器的冲击响应h(n)为实序列时,频率响应:
若要求线性相位,则需:
因而h(n)如果满足对称或反对称的条件,就具有线性相位特性,即:
数字滤波器结构有很多种,偶对称FIR滤波器的直接型结构如图1所示。
其中x(n),y(n)分别为输入输出时间序列。
容易得到32阶偶对称FIR滤波器的输入输出关系,如式(4)所示:
根据以上分析,可以把对称结构的FIR数字滤波器分成“移位相加单元、乘法器、输出相加及截位输出”四块,如图2所示。
对于长度为2M的滤波器,其运算次数只有M量级,减少了乘法次数,也提高了运算速度。
在用FPGA实现时可以节约不少资源。
四.数字滤波器的设计与分析
1.窗函数设计的基本思想和常用窗函数
FIR数字滤波器的设计方法有窗函数设计法、频率抽样设计法和最优设计法等,其中窗函数设计是FIR滤波器设计的主要方法之一,由于其运算简便,物理意义直观,已成为工程实际中应用最广泛的方法,窗函数设计滤波器的基本思想,就是根据给定的滤波器技术指标,选择滤波器的阶数N和合适的窗函数w(n)。
即用一个有限长度的窗口函数序列w(n)来截取一个无限长的序列获得一个有限长序列h(n),即h(n)=
*w(n)。
这样我们用一个有限长的序列h(n)去代替,肯定会引起误差,表现在频域就是通常所说的吉布斯(Gibbs)效应。
该效应引起通带内和阻带内的波动性,尤其使阻带的衰减小,影响滤波器的性能。
为了减小吉布斯效应,从原理上来说可以通过加大N。
但实验表明,加大N虽然可以使H(w)过渡带变窄,但对带内波动以及阻带衰减并没有多大的影响。
因此,我们希望能找到不同的窗函数,使其主瓣包含更多的能量,同时旁瓣幅度减小,从而使通带、阻带波动减小,加大阻带衰减。
窗函数方法不仅在数字滤波器的设计中占有重要的地位,同时可以用于功率谱的估计,从根本上讲,使用窗函数的目的就是消除由无限序列的截短而引起的Gibbs现象所带来的影响。
工程实际中常用的窗函数有6种,即矩形窗、三角形窗、汉宁(Hanning)窗、海明(Hamming)窗、布莱克曼(Blackman)窗和凯泽(Kaiser)窗。
不同窗函数的过渡带和阻带衰减特性有所不同。
表1.六种窗函数性能比较
窗类型
旁瓣峰值
主瓣峰值
最小阻带衰减
矩形窗
13dB
4π/M
21dB
三角窗
25dB
8π/M
25dB
汉宁窗
31dB
8π/M
44dB
海明窗
41dB
8π/M
53dB
布莱克曼窗
57dB
10π/M
74dB
凯泽窗(β=5.658)
53dB
7.8π/M
60dB
窗函数设计FIR滤波器的步骤如下:
(1)根据技术要求确定单位取样响应
,如果已知
,则可由下式确定单位取样响应:
(2)根据对过渡带和阻带衰减的要求,选择窗函数的形式,并估计窗口长度N。
选择窗函数的时候,原则上在保证阻带衰减的情况下,尽量选择主瓣窄的窗函数,减小带宽。
(3)由选择好的窗函数形式w(n)确定单位取样响应h(n),公式如下:
h(n)=
*w(n)如果要求线性相位,则同时要保证
对(N-1)/2对称。
(4)重复上述步骤反复验证技术指标是否达到。
可用FFT快速算法计算设计出的滤波器频率响应,公式如下:
2.十六阶FIR低通数字滤波器硬件电路设计
下面以一个十六阶FIR低通滤波器为例说明硬件电路的设计方法和过程。
(1).设计指标。
截止频率:
37.5kHz
类型:
低通输入数据宽度:
8位
阶数:
16阶输出数据宽度:
16位
(2).参数提取.
符合设计指标的线性相位16阶FIR数字低通滤波器的特性参数如下:
h[0]=h[15]=0.000000h[1]=h[14]=0.001992
h[2]=h[13]=0.008241h[3]=h[12]=0.018332
h[4]=h[11]=0.030784h[5]=h[10]=0.043353
h[6]=h[9]=0.053550h=[7]=h[8]=0.059257
(3)单元电路设计
FIR低通数字滤波器电路分为数据位扩展、并串转换器、移位寄存器组、前加单元、中间处理单元、后处理单元以及控制单元等部分。
a.数据位扩展
这里所设计的FIR数字滤波器输入是8位宽的,为了防止溢出,保证电路的正常工作,这里采用符号位扩展方法,经过符号位扩展,总的输入数据宽度为9位。
b.并/串转换器
并/串转换器由9个2选1选择器和9个D触发器组成,结构十分简单,在此不再对其电路结构赘述。
其工作过程为:
并/串转换器以采样速率周期地采入8位样点数据,并输出1位数据流给后级的移位寄存器。
c.移位寄存器组
寄存器组主要完成移位功能。
d.前加单元
前加单元的主要功能是将移位寄存器输出的1位串行数据流进行预相加,它由一位串行加
法器构成。
XC4000系列芯片具有以下两个特点:
(a)内部基本单元CLB(可配置逻辑模块)包括三个函数发生器,分别以F、G和H标记。
其中两个第一级的函数发生器F和G,每个可实现4输入的任何函数,同时它们也可以与H函数发生器组合生成五输入的任何函数。
此外,CLB还具有CLB内部连线比外部连线延时小的特点。
(b)XC4000系列提供了快速进位逻辑(CarryLogic)用来加速加法器和计数器的进位通道。
利用快速进位逻辑、加法器和计数器,在占用最小数量CLB的情况下,却具有极快的工作速度。
且该进位逻辑可以进行灵活配置,以实现任意长度的计数器和减法器。
因此,从提高芯片利用率、布线率,减小电路延时等方面考虑,必须充分利用XC4000系列芯片的特点,对电路中的1位全加器作适合于FPGA特点的特殊设计。
图3电路为本文所采用的经优化后的包括快速进位逻辑的1位全加器电路,其中FMAP为函数映射,可将特定电路映射到CLB的F、G或H函数发生器中;CY4为快速进位逻辑宏单元。
图3一位串行加法器
e.中间处理单元
在FIR数字滤波器中,中间处理单元主要
实现对来自前加单元的1位串行输出数据的相乘和累加功能。
这里采用基于ROM查表法的分布式算法进行中间处理单元的电路设计。
如前所述,本文仅考虑冲激响应对称的情况,即滤波器的系数是对称的,所以独立系数的数目应等于1/2的阶数。
对于16阶的FIR滤波器来说,其独立系数的个数为8个。
f.后处理单元
后处理单元的主要功能是对数据进行四舍五入和从数据流中取出需要的数据。
完成四舍五入功能需要一个16位的加法器,取数据则需要16位并行D触发器。
g.控制单元
控制单元主要由计数器和D触发器组成。
它对电路的控制主要包括:
在电路开始工作前进。
行全局复位,作好工作准备;对输入单元的工作进行控制;提供中间处理单元正常工作所必须的一些信号;提供最终输出结果时的输出同步信号(OUTSYN)。
(4).电路原理
原理图如图4所示。
图4FPGA实现FIR数字滤波器的电路图
图3是FIR数字滤波器的上层图,其输入输出管脚情况和硬件资源占用情况分别见表2和表3。
为了检测设计的电路能否连续正确地工作,连续输入了16位数据(十进制),分别为:
100,101,102,103,104,105,106,107,-101,-102,-103,-104,-105,-106,-107。
FIR数字滤波器硬件仿真结果(前16个输出)如表4所示。
在表4中同时列出了根据文献[4]编写的程序所得到的软件计算结果。
从上述数据可以看出,软件仿真结果与硬件仿真结果相比,误差的绝对值均≤1,可以认
为滤波器的硬件电路工作正确。
此外,为了验证此滤波器在边缘值输入时能否正确工作,还进行了边缘值测试。
当输入数据是8位时,其两个边缘值分别是+127和-128,对应16进制的7F和80。
利用这两组数据做输入,得到的输出也与软件结果进行对比,可以证实此时电路也能正确工作。
本文设计的16阶线性相位FIR数字低通滤波器,利用XC4005EPC84-2芯片实现时,处理数据的系统时钟频率为36MHz,采样速率为4MHz,计算结果和软件计算结果相比最大误差≤±1。
在实际使用时,还可以根据不同精度要求,方便地对该FIR滤波器进行修改以满足不同的指标要求。
另外,在本文设计的低通滤波器基础上,可以通过简单地重组滤波器特性参数,得到高通或带通滤波器。
同时FPGA器件的可编程特性,可方便地对电路进行改进,便于电路性能的进一步提高。
五.FIR滤波器设计的仿真实现
1.用程序设计法对FIR滤波器的仿真
程序如下:
Fs=8000;%采样频率。
f=[10001400]。
a=[10]。
dev=[0.010.1]。
[n,fo,ao,w]=remezord(f,a,dev,Fs);%
估计滤波器的参数。
b=remez(n,fo,ao,w);%用remez函
数设计滤波器。
freqz(b,1,1024,Fs);%滤波器的频率
响应。
t=(0:
100)/Fs。
x=sin(2*pi*t*1000)+sin(2*pi*t*2000);%
设置输入信号x。
x1=filter(b,1,x);%对信号x进行滤
波,得输出信号x1。
figure。
subplot(211);plot(t,x);grid。
subplot(212);plot(t,x1);grid;%画图。
图5滤波器幅度响应和相位响应
2.用窗函数设计法对FIR滤波器的仿真
以设计具有下面指标的低通FIR滤波器为例
因为要求衰减阻带50db,所以可选择海明窗和布莱克曼窗,以海明窗为例,程序代码如下
图6、图7中为其响应波形
wp=0.2*pi;
ws=0.3*pi;
tr_width=ws-wp;
M=ceil(6.6*pi/tr_width)+1;
n=[0:
1:
M-1];
wc=(ws+wp)/2;
alpha=(M-1)/2;
n=[0:
1:
(M-1)];
m=n-alpha+eps;
hd=sin(wc*m)./(pi*m);;
%生成hamming窗
w_ham=(hamming(M))';
%频域图像的绘制
h=hd.*w_ham;
freqz(h,[1])
figure
(2);
subplot(2,2,1),stem(n,hd);title('理想脉冲响应')
axis([0M-1-0.30.3]);xlabel('n');ylabel('hd(n)')
xa=0.*n;
holdon
plot(n,xa,'k');
holdoff
subplot(2,2,2),stem(n,w_ham);title('hamming窗')
axis([0M-1-0.31.2]);xlabel('n');ylabel('w(n)')
subplot(2,2,3),stem(n,h);title('实际脉冲响应')
axis([0M-1-0.30.3]);xlabel('n');ylabel('h(n)')
holdon
plot(n,xa,'k');
holdoff
图6
图7
同样也可以采用凯泽窗设计此滤波器:
图8、图9中为其响应波形
wp=0.2*pi;
ws=0.3*pi;
AS=50;
tr_width=ws-wp;
M=ceil((AS-7.95)/(14.36*tr_width/(2*pi))+1)+1;
n=[0:
1:
M-1];
wc=(ws+wp)/2;
alpha=(M-1)/2;
n=[0:
1:
(M-1)];
m=n-alpha+eps;
hd=sin(wc*m)./(pi*m);;
beta=0.1102*(AS-8.7);
%生成kaiser窗
w_kai=(hamming(M))';
%频域图像的绘制
h=hd.*w_kai;
freqz(h,[1])
figure
(2);
subplot(2,2,1),stem(n,hd);title('理想脉冲响应')
axis([0M-1-0.30.3]);xlabel('n');ylabel('hd(n)')
xa=0.*n;
holdon
plot(n,xa,'k');
holdoff
subplot(2,2,2),stem(n,w_kai);title('kaiser窗')
axis([0M-1-0.31.2]);xlabel('n');ylabel('w(n)')
subplot(2,2,3),stem(n,h);title('实际脉冲响应')
axis([0M-1-0.30.3]);xlabel('n');ylabel('h(n)')
holdon
plot(n,xa,'k');
holdoff
图8
3.滤波器的FPGA实现及仿真
(1).移位及首尾相加单元
把输入数据存储到移位寄存器,利用FIR滤波器的对称性,把移位后的数据首尾相加即可。
加法器输出端要加个寄存器模块,以去除毛刺。
另外为防止相加后数据溢出,要把数据位数扩宽到14+1位。
其中D_in[13..O]是二进制补码输入,DoutXX[14..O]是移位相加后数据输出。
VexrilogHDL程序关键语句为:
assignD_in_temp=(D_in[13]);
({D_in[13],1’b1,D_in[12:
0]}):
D_in;
//把输入数据扩位
……
D_in_buffer[31]<=D_in_temp;
D_in_buffer[30]<=D_in_buffer[31];
……
D_in_buffer[1]<=D_in_buffer[2];
//数据输入在寄存器内依次移位
……
adder_buffer[0]<=D_in_buffer[1]
D_in_temp;
adder_buffer[1]<=D_in_buffer[2]
D_in_buffer[31];
…
adder_buffer[15]<=D_in_buffer[16]
D_in_buffer[17];
//寄存器组首尾相加,并存入缓冲器
……
移位相加单元模块图如图10所示。
图10移位相加模块
移位相加单元时序仿真:
仿真结果如图11所示,输入一个阶跃信号(8191),从图5中可以看出,输出数据从D_out_a到D_out_p依次有一个时钟周期的时延,并且总的时延和滤波器阶数(32)相等,最后输出数据是16382=8191*2,和理论计算值相同。
图11移位相加模块仿真时序图
(2).与滤波器系数相乘
数据首尾相加输出后与滤波器系数h(n)相乘,由于FIR滤波器的结构是对称的,因而只需16个乘法器即可。
乘法器直接调用QuartusⅡ里面的参数化元件库,系数的位宽设为18。
关键Verilog语句如下:
Lpm_multmul_0//实例化一乘法器
(.dataa(add_a),.datab(h0),result(mnl_aa));//add_为移位相加输出
defparammul_0.lpm_widtha=15;//移位及首尾相加单元所得的数据
defparammul_0.lpm_widthb=18;//18位的滤波器系数h(n)
defparammul_0.lpm_widthp=33;
defparammul_0.lpm_widths=33;
defparammul_0.lpm_pipeline=0;
defparammul_0.lpm_representstion=“signed”;//设置成有符号数
以上为一个乘法器设置方法,16个乘法器的整体模块图如图12所示。
图12乘法器模块
为了便于仿真测试,乘法器单元一开始只设置了4个输入。
其中h(0)=100,h
(1)=200,h
(2)=300,h(3)=400,a,b,c,d为4个输入数据,与h(n)相乘后对应输出分别为R_a,R_b,R_c和R_d。
这样设计不失一般性,仿真无误后再扩充到16个即可。
仿真结果如图13所示。
图13乘法器模块仿真时序图
(3)乘法器输出结果相加
16路数据相加后位数被扩为33+4=37,另外要在其输出端加一寄存器,以消除毛刺。
此模块原理图如图14所示。
图14相加输出模块
相加输出模块仿真:
实际用到的是16输入的加法器,为便于仿真测试.输入先设为4路,仿真结果如图15所示。
图15相加输出模块仿真时序图
(4)截位输出
截位是滤波器设计的关键,此处的处理方法是:
14位的输入数据(14b的ADC),18位二进制补码表示的滤波器系数,除去符号位,相乘后小数位是13+17=30,加法运算不改变小数位数。
另外系统测试电路板用的是USB总线,USB控制器的数据位宽是16,因而把输出数据截到16位,然后送给FIFO,从而传到计算机。
截位用VerilogHDL实现的语句是:
assignFIR_out={D_temp[36],D_temp[29:
15]};
此模块的原理图如图16所示,其中FIR_out[15..O]是滤波器的最终输出。
图16输出截位模块
在QuarltusⅡ7.0里调用仿真无误的模块,组成整个系统,最后仿真无误后
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Matlab FPGA FIR 数字滤波器 设计