fir滤波器设计Word文件下载.docx
《fir滤波器设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《fir滤波器设计Word文件下载.docx(35页珍藏版)》请在冰豆网上搜索。
利用线性相位有限冲激响应滤波器的对称(或反对称)性质,可以将传输函数的直接型实现所需的乘法器总量减少一半。
例如,图2-2显示了一个具有对称冲击响应的、长度为7的有限冲激响应传输函数的实现。
图2-2线性相位有限冲激响应结构
三、设计思路:
根据课程上老师所讲例题,首先使用matlab计算出符合设计要求的滤波器冲激响应系数。
后将整个电路规划为语言编辑和原理图编辑两个单元,其中语言编辑部分负责编辑整个滤波器电路中所需用的单元器件,包括寄存器、加法器、减法器以及乘法器几个单元器件;
原理图编辑部分完成单元器件的电气连接工作。
整个电路的原理图设置方案如图3-1所示:
图3-1滤波器整体设计思路
四、设计过程:
(一)基于matlab工具的滤波器系数计算:
在matlab命令编辑窗口输入Fdatool指令,敲击回车可以打开FilterDesign&
AnalysisTool窗口(如图4-1所示),在该工具的帮助下,我们可以完成f.i.r.滤波器系数的计算工作。
图4-1FilterDesign&
AnalysisTool窗口
Fdatool界面总共分两大部分,一部分是designfilter,在界面的下半部分,用来设置滤波器的设计参数,另一部分则是特性区,在界面的上半部分,用来显示滤波器的各种特性。
designfilter部分主要分为:
ResponseType(响应类型)选项,包括Lowpass(低通)、Highpass(高通)、Bandpass(带通)、Bandstop(带阻)和特殊的滤波器。
根据本次作业要求,在该选项中选择Lowpass选项。
DesignMethod(设计方法)选项,包括IIR滤波器的Butterworth(巴特沃思)法、ChebyshevTypei(切比雪夫i型)法、ChebyshevTypeii(切比雪夫ii型)法、Elliptic(椭圆滤波器)法等和FIR滤波器的Equiripple法、Least-squares(最小乘方)法、Window(窗函数)法等多种方法。
结合本次作业要求,选择FIR滤波器的窗函数法进行设计。
选定窗函数法后,会在右侧出现Options区域,进行窗函数法相关参量的设置,根据作业要求选择Kaiser窗并设置Beta为:
0.5。
FilterOrder(滤波器阶数)选项,定义滤波器的阶数,包括Specifyorder(指定阶数)和Minimumorder(最小阶数)。
在Specifyorder中填入所要设计的滤波器的阶数(n阶滤波器,specifyorder=n-1),如果选择Minimumorder则matlab根据所选择的滤波器类型自动使用最小阶数。
本次作业要求设计16阶滤波器,所以选定Specifyorder并填入15。
FrenquencySpecifications选项,可以详细定义频带的各参数,包括采样频率Fs和频带的截止频率。
它的具体选项由ResponseType选项和DesignMetho选项决定。
我们要求的Lowpass(低通)滤波器只需要定义Fs、Fc。
采用窗函数设计滤波器时,由于过渡带是由窗函数的类型和阶数所决定的,所以只需要定义通带截止频率,而不必定义阻带参数。
MagnitudeSpecifications选项,可以定义幅值衰减的情况。
采用窗函数设计时,通带截止频率处的幅值衰减固定为6db,所以不必定义。
本次作业中的参数设定结果如图4-2所示。
图4-2滤波器参数设定结果
参数设定完毕,单击工具窗口下方的DesignFilter按钮,开始进行相关参数计算。
在计算结果中我们可以看到该滤波器的一些相关曲线,如幅频响应(如图4-3)、相频响应(如图4-4)、冲激响应(如图4-5)等以及具体的系数值(如图4-6)。
图4-3幅频响应
图4-4相频响应
图4-5冲激响应
图4-6所设计滤波器冲激系数
计算的结果可通过File下拉菜单中的Export命令取出,点击Export打开Export对话框(如图4-7),点击OK按钮可将滤波器系数数据存放到当前工作空间,并以Num命名。
图4-7冲激系数输出对话框
保存并关闭滤波器设计分析工具回到matlab主窗口,在命令编辑区输入Num可得到工具的计算结果(如图4-8)。
图4-8输出在matlab的冲激系数
对FIR滤波器的系数进行调整,做整数化操作(如图4-9)。
可得到滤波器整数化的系数为[-31-88-106-547023940149949940123970-54-106-88-31]
图4-9整数化后的冲激系数
(二)单元器件的语言编辑:
1、寄存器模块
寄存器用于寄存一组二值代码,只要求它们具有置1、置0的功能即可。
在本设计中用D触发器组成寄存器,实现寄存功能。
本设计中使用带异步复位rst端的D触发器,当rst=1时,输出信号q=0,当rst=0且上升沿脉冲到达时q=d。
●程序代码如下:
---------------------------
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYdff16IS
PORT(rst,clk:
INSTD_LOGIC;
d:
INSTD_LOGIC_VECTOR(9DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));
ENDdff16;
ARCHITECTUREdff16OFdff16IS
BEGIN
PROCESS(rst,clk)
BEGIN
IF(rst='
1'
)THEN
q<
=(OTHERS=>
'
0'
);
ELSIF(clk'
EVENTANDclk='
)THEN
=d;
ENDIF;
ENDPROCESS;
仿真结果如图4-10所示:
图4-10寄存器仿真结果
2、加法器模块
实现两个有符号数的相加运算。
即将输入的两数,在时钟脉冲到来时相加运算,输出结果。
在本设计中共有8个两个10位有符号数相加产生一个11位有符号数的加法器、一个18位和19位有符号数相加产生20位有符号数的加法器、一个两个20位有符号数相加产生一个21位有符号数的加法器、一个两个19位有符号数相加产生一个20位有符号位数的加法器、一个20位和21位有符号数相加产生22位有符号数的加法器,以及一个20位和22位有符号数相加产生23位有符号数的加法器电路。
其中一个20位和22位有符号数相加产生23位有符号数的加法器电路为最后一级,所以在加法器电路中在引入低位舍去功能只保留最终10位输出,最终保留10位输出采用了直接取输出23位数的高十位的方法,因此在输出中近似等于除掉了2^13即8192以后的结果。
●10位有符号数相加产生一个11位有符号数的加法器设计:
----------------------
USEieee.std_logic_arith.all;
ENTITYsum101011IS
PORT(a,b:
INSIGNED(9DOWNTO0);
clk:
s:
OUTSIGNED(10DOWNTO0));
ENDSUM101011;
ARCHITECTUREsum101011OFsum101011IS
PROCESS(clk)
BEGIN
IF(clk'
s<
=(a(9)&
a)+(b(9)&
b);
ENDsum101011;
仿真结果如图4-11所示:
图4-11两10位相加产生11位加法器仿真结果
●18位和19位有符号数相加产生20位有符号数的加法器设计:
ENTITYsum7023918IS
PORT(a:
INSIGNED(17DOWNTO0);
b:
INSIGNED(18DOWNTO0);
OUTSIGNED(19DOWNTO0));
ENDsum7023918;
ARCHITECTUREsum7023918OFsum7023918IS
=(a(17)&
a(17)&
a)+(b(18)&
仿真结果如图4-12所示:
图4-1218位19位相加产生20位数仿真结果
●两个20位有符号数相加产生一个21位有符号数的加法器设计:
ENTITYsum40149919IS
INSIGNED(19DOWNTO0);
OUTSIGNED(20DOWNTO0));
ENDsum40149919;
ARCHITECTUREsum40149919OFsum40149919IS
=(a(19)&
a)+(b(19)&
仿真结果如图4-13所示:
图4-13两20位相加产生21位数仿真结果
●两个19位有符号数相加产生一个20位有符号位数的加法器设计:
ENTITYsum181819IS
ENDsum181819;
ARCHITECTUREsum181819OFsum181819IS
=(a(18)&
仿真结果如图4-14所示:
图4-14两19位相加产生20位数仿真结果
●20位和21位有符号数相加产生22位有符号数的加法器:
ENTITYsum192021IS
INSIGNED(20DOWNTO0);
OUTSIGNED(21DOWNTO0));
ENDsum192021;
ARCHITECTUREsum192021OFsum192021IS
a(19)&
a)+(b(20)&
仿真结果如图4-15所示:
图4-1520位和21相加产生22位数仿真结果
●20位和22位有符号数相加产生23位有符号数的加法器电路设计(最后一级带舍位):
----------------------
ENTITYsum192110IS
INSIGNED(21DOWNTO0);
OUTSIGNED(9DOWNTO0));
ENDsum192110;
ARCHITECTUREsum192110OFsum192110IS
VARIABLEc:
SIGNED(22DOWNTO0);
c:
a)+(b(21)&
=c(22DOWNTO13);
仿真结果如图4-16所示:
图4-1620位22位相加产生被截短的10位数仿真结果
3、减法器模块:
实现零值减去两个有符号数的减法运算。
即用零值减去输入的两数,在时钟脉冲到来时做减法运算,输出结果。
-31和-88的乘结果都只包含了乘系数31和88的数值,并没有将两个负号代入,所以两乘法器后面的加法器运算改为减法器模块,采用0-31*累加结果-88*累加结果的方法,实现(-31)*累加结果+(-88)*累加结果的计算。
-106和-54后面的加法器采用同样的方式处理。
●-31和-88的减法器设计:
--------------------
ENTITYsub318817is
PORT(clk:
inSTD_LOGIC;
Din1:
insigned(15downto0);
Din2:
insigned(17downto0);
Dout:
outsigned(18downto0));
ENDsub318817;
ARCHITECTUREsub318817ofsub318817IS
SIGNALs1:
signed(17downto0):
=(Din1(15)&
Din1(15)&
Din1);
SIGNALs2:
signed(18downto0):
PROCESS(Din1,Din2,clk)
IFclk'
eventandclk='
THEN
Dout<
=s2-Din2-s1;
仿真结果如图4-17所示:
图4-17-31和-88减法器的仿真结果
●-106和-54的减法器的设计:
ENTITYsub1065417is
insigned(16downto0);
ENDsub1065417;
ARCHITECTUREsub1065417ofsub1065417IS
=(Din2(16)&
Din2);
=s2-Din1-s1;
仿真结果如图4-18所示:
图4-18-106和-54减法器的仿真结果
4、乘法器模块:
从资源和速度考虑,常系数乘法运算可用移位相加来实现。
将常系数分解成几个2的幂的和形式。
滤波器系数分别为-31、-88、-106、-54、70、239、401、499、499、401、239、70、-54、-106、-88、-31。
算法:
其中带负号数先乘去负号的整数部分,在后面的求和中做减法运算。
编码方式如下:
31被编码为2^5-2^0、88被编码为2^6+2^4+2^3、106被编码为2^6+2^5+2^3+2^1、54被编码为2^6-2^3-2^1、70被编码为2^6+2^2+2^1、239被编码为2^8-2^4-2^0、401被编码为2^9-2^7+2^4+2^0、499被编码为2^9-2^3-2^2-2^0。
实现输入带符号数据与固定数据两个二进制数的乘法运算。
当到达时钟上升沿时,将两数输入,运算并输出结果。
乘31电路设计:
ENTITYmult31IS
PORT(clk:
Din:
INSIGNED(10DOWNTO0);
OUTSIGNED(15DOWNTO0));
ENDmult31;
ARCHITECTUREmult31OFmult31IS
SIGNALs1:
SIGNED(15DOWNTO0);
SIGNALs2:
SIGNED(10DOWNTO0);
SIGNALs3:
A1:
PROCESS(Din,s1,s2,s3)
s1<
=Din&
"
00000"
;
s2<
=Din;
IF(Din(10)='
)THEN
s3<
=('
&
s1(14downto0))-("
s2(10DOWNTO0));
ELSE
11111"
A2:
PROCESS(clk,s3)
I