FIR低通滤波器设计报告.docx
- 文档编号:8245924
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:11
- 大小:123.59KB
FIR低通滤波器设计报告.docx
《FIR低通滤波器设计报告.docx》由会员分享,可在线阅读,更多相关《FIR低通滤波器设计报告.docx(11页珍藏版)》请在冰豆网上搜索。
FIR低通滤波器设计报告
FIR低通滤波器设计报告
1.FIR低通滤波器原理
1.1FIR滤波器简介
FIR(FiniteImpulseResponse)滤波器:
有限长单位冲激响应滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。
因此,FIR滤波器在通信、图像处理、模式识别等领域都有着广泛的应用。
IIR数字滤波器方便简单,但它相位的非线性,要求采用全通网络进行相位校正,且稳定性难以保障。
FIR滤波器具有很好的线性相位特性,使得它越来越受到广泛的重视。
1.2FIR滤波器特点
有限长单位冲激响应(FIR)滤波器有以下特点:
1既具有严格的线性相位,又具有任意的幅度;
2FIR滤波器的单位抽样响应是有限长的,因而滤波器性能稳定;
3只要经过一定的延时,任何非因果有限长序列都能变成因果的有限长序列,因而能用因果系统来实现;
4FIR滤波器由于单位冲击响应是有限长的,因而可用快速傅里叶变换(FFT)算法来实现过滤信号,可大大提高运算效率。
5FIR也有利于对数字信号的处理,便于编程,用于计算的时延也小,这对实时的信号处理很重要。
6FIR滤波器比较大的缺点就是阶次相对于IIR滤波器来说要大很多。
FIR数字滤波器是一个线性时不变系统(LTI),N阶因果有限冲激响应滤波器可以用传输函数H(z)来描述,
在时域中,上述有限冲激响应滤波器的输入输出关系如下:
其中,x[n]和y[n]分别是输入和输出序列。
当冲击响应满足下列条件时,FIR滤波器具有对称结构,为线性相位滤波器:
这种对称性,可使得乘法器数量减半:
对n价滤波器,当n为偶数时,乘法器的个数为n/2个;当n为奇数时,乘法器的个数为(n+1)/2个。
在电路实现中,乘法器占用的逻辑单元数较多。
乘法器的增加,意味着电路成本增加,另外对电路的工作速度也有影响。
N阶线性相位的因果FIR系统的单位冲激响应滤波器可用对称冲激响应
或者反对称冲激响应
来描述。
具有对称冲激响应的FIR传输函数的冲激响应可写成如下形式:
当N为偶数时
当N为奇数时
则FIR线性相位系统的结构可转化成如图所示:
(注:
因本题用偶数阶滤波器,所以只画出偶数阶原理图)
输出
2.FIR低通滤波器的总体设计
2.1参数确定
根据给定的参数:
低通16阶滤波器;
抽样频率:
80khz;
截至频率:
10khz;
输入,输出位宽:
10位(最高位为符号位);
Kaiser窗函数,Bata=0.5;
根据MATLAB工具可以求出此FIR低通滤波器的系数,分别为:
-31,-88,-106,-54,70,239,401,499,499,401,70,-54,-106,-88,-31.
2.2总体设计
根据以上的分析可以画出此滤波器的原理框图,如下图所示:
其中系数从左向右分别是:
-31,-88,-106,-54,70,239,401,499.
3.FIR低通滤波器的模块设计
分析:
从框图上可以看出,程序需要一个10位的D寄存器,因为是十六阶的滤波器,所以需要15个10位的D寄存器;在第一级加法器中,为10位进位,所以输出应为11位,目的是为了保证符号的保留;在乘法器中,因为有负数,此时我们可以把负数拿到最后级的加法器中实现,在乘法器中,只进行正数的符号数相乘,原理为:
乘以一个系数时,我们可以把系数分解为2的次幂的形式,比如31=16+8+4+2+1,16为2的4次方,8为2的3次方,4为2的2次方,2为2的1次方,1为2的0次方,乘以一个16,即为把被乘数像左移4位,乘以8即为把被乘数向左移3位,乘以4即为把被乘数向左移2位,乘以2即为把被乘数向左移1位,乘以1即为把被乘数向左移0位,最后把几个移位后的数相加,所以可以按此原理来实现已知系数的乘法器;因为有负系数,所以在最后用一个减法器来实现。
3.1D寄存器的实现
3.1.1D寄存器原理
寄存器用于寄存一组二值代码,对寄存器的触发器只要求它们具有置1、置0的功能即可,因而本设计中用D触发器组成寄存器,实现寄存功能。
在CP正跳沿前接受输入信号,正跳沿时触发翻转,正跳沿后输入即被封锁。
3.1.2D寄存器VHDL代码
libraryieee;
useieee.std_logic_1164.all;
entitydfis
port(d:
instd_logic_vector(9downto0);
clk,reset:
instd_logic;
q:
outstd_logic_vector(9downto0));
enddf;
architecturedfofdfis
begin
process(clk,reset)
begin
if(reset='1')then
q<=(others=>'0');
elsif(clk'eventandclk='1')then
q<=d;
endif;
endprocess;
enddf;
3.1.3仿真图
3.1.4生成模块图
3.2加法器的实现
在第一级加法器中,输入为10位,为了保证符号位,令输出为11位;在第二级加法器中,要根据信号经过乘法器以后输出的位数来定,原理同第一级加法器相同,具体的模块输入与输出的位数可以查看最后的原理图文件。
3.2.1第一级加法器的VHDL代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
entityadis
port(clk:
instd_logic;
ad1,ad2:
insigned(9downto0);
q:
outsigned(10downto0));
endad;
architectureadofadis
begin
process(clk,ad1,ad2)
begin
if(clk'eventandclk='1')then
q<=(ad1(9)&ad1)+(ad2(9)&ad2);
endif;
endprocess;
endad;
3.2.2第一级加法器仿真图
3.2.3第一级加法器模块图
3.3乘法器的实现
以乘以54为例子,给出乘法器的VHDL设计代码,原理为:
54=32+16+4+2,32为2的5次方,16为2的4次方,4为2的2次方,2为2的1次方,乘以一个32,即为把被乘数像左移5位,乘以16即为把被乘数向左移4位,乘以4即为把被乘数向左移2位,乘以2即为把被乘数向左移1位,最后把几个移位后的数相加。
3.3.1VHDL代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
entitycheng54is
port(clk:
instd_logic;
din:
insigned(10downto0);
dout:
outsigned(15downto0));
endcheng54;
architecturecheng54ofcheng54is
signaltemp1:
signed(15downto0):
="0000000000000000";
signaltemp2:
signed(14downto0):
="000000000000000";
signaltemp3:
signed(12downto0):
="0000000000000";
signaltemp4:
signed(11downto0):
="000000000000";
begin
process(din,clk)
begin
temp1(15downto5)<=din;
temp2(14downto4)<=din;
temp3(12downto2)<=din;
temp4(11downto1)<=din;
ifclk'eventandclk='1'then
if(din(10)='0')then
dout<=temp1+("0"&temp2)+("000"&temp3)+("0000"&temp4);
else
dout<=temp1+("1"&temp2)+("111"&temp3)+("1111"&temp4);
endif;
endif;
endprocess;
endcheng54;
3.3.2乘以54仿真图
3.3.3乘法器的模块图
3.4减法器的实现
在乘以负系数的情况下,我们没有理会所带来的影响,在乘法器工作时,我们是按照正数来计算的,在前四个乘法器中都是与负数相乘,正好,两两相加,提取一个负号,在最后按照减法计算,在以前的计算中,位数已经扩展到20位,而要求我们要输出十位数据,所以我们要在最后减法器的计算中舍去低10位,所以结果比实际结果小的多。
3.4.1减法器VHDL代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
entitysubis
port(clk:
instd_logic;
sub1:
insigned(19downto0);
sub2:
insigned(17downto0);
q:
outsigned(9downto0));
endsub;
architecturesubofsubis
signaltemp:
signed(19downto0):
="00000000000000000000";
begin
process(clk,sub1,sub2)
begin
if(clk'eventandclk='1')then
temp<=sub1-(sub2(17)&sub2(17)&sub2);
endif;
endprocess;
q<=temp(19downto10);
endsub;
3.4.2减法器的模块图
4.滤波器的整体连接
在Quartusii中新建一个工程(homework),并在此工程下新建BlockDiagram/SchematicFile,并在文件里插进去所设计好的各个模块设置好时钟信号,并且连接好线路,如下图:
清晰图见所附电子档“homework.bdf”文件。
为验证其正确性,在MATLAB下输入信号:
90,0,0,0,50,0,0,0,90,0,0,0,50,0,0,0,...,在MATLAB下利用conv函数可以求出仿真结果:
在Quartusii下输入同样的一组信号可以得到仿真图如下:
对比两个仿真图,我们可以看出,虽然结果不是相同(负数部分),但是误差较小,可以反映出大体的趋势,因此可以肯定,设计是比较成功的!
5.总结
在设计滤波器的过程中,遇到过不少的困难,主要的是位数的确定。
当然通过此次的课程作业,从中学习到了不少的只是,熟练的掌握了QUARTUSII的使用,对VHDL有了更深的理解。
首先,设计出了D寄存器,16阶的滤波器需要15个移位寄存器,是相同的;再次设计出了第一级加法器,因为是10位,所以信号引脚范围为:
9-0,为保证符号位的保留,输出位数为11位。
到此并没有什么困难,可是到了乘法器的设计时,因为对位数的模糊,设计成了10位的输入,比加法器的输出少了一位,没办法,全部重新改正,但是原理还是很清晰的。
乘法器的输入都是11位的,因为乘以的数不同,所以输出不再相同,根据所乘以的系数设计出了八个乘法器。
第二级加法器是分别不同的,以为输入是乘法器的输出,所以要分别设计四个加法器,还是扩展以为高位,用以保留符号位。
第三级加法器又是不相同的,其设计原理与第二级相同,分别设计出两个加法器。
最重要的是最后的减法器,由于所乘系数的对称性,以及偶数个系数,所以把负号拿到最后一级的加法器中,自然成了减法器,最重要的是输出的位数,要求输出是10位,而在最后一级的加法以后,位数已经扩展到了20位,所以我们需要对其进行截断处理。
在有的截断处理中,是在每一级中进行截断,开始第一遍的时候,我是在三级加法器中进行的截断,一级在第二级的加法中分别在ad21中截取2位,在ad22中截取了2位,在ad23中截取了3位,在ad_24中截取了4位,在第三级的ad31和ad32加法中截取了2位,最后在减法器中截断了3位,但是仿真出来的结果与真实的结果有很大的误差,所以我就想,是不是截断不科学造成的呢?
干脆,我把加法器中的截断处理全部取消,只是在最后的一级中进行截断处理,实际上在最后截取了10位,事实证明这是正确的,好处是误差比较小,所以在MATLAB仿真的时候结果要除以2的10次方,即y=conv(x,num)/1024,其中x为输入信号,num为滤波器系数。
所以,有的时候需要我们用创新的思维,大胆的想法,并付出实践,才会从中发现科学的奥秘!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FIR 滤波器 设计 报告