滤波器.docx
《滤波器.docx》由会员分享,可在线阅读,更多相关《滤波器.docx(26页珍藏版)》请在冰豆网上搜索。
滤波器
成绩
课程设计报告
题目
课程名称
院部名称
专业
班级
学生姓名
学号
课程设计地点
课程设计学时
指导教师
金陵科技学院教务处制
【注:
根据课程设计大纲第四项具体要求撰写课程设计报告】
实验项目名称:
实验学时:
同组学生姓名:
实验地点:
实验日期:
实验成绩:
批改教师:
批改时间:
一、课程设计的目的和要求
要求通过课程设计,加深对DSP芯片TMS320C54x的结构、工作原理的理解,对DSP相关技术进行运用,掌握设计DSP系统的基本方法。
通过使用汇编语言或者C语言编写具有完整功能的图形处理程序,学会DSP和MATLAB相关工具的连接,在CSS里面输出相关波形和频谱图形,实现对混频数据进行的滤波的效果。
学会编制结构清晰、风格良好、数据结构适当的汇编或C语言程序,从而具备解决综合性实际问题的能力。
二、系统功能介绍及总体设计方案
1系统功能介绍
数字滤波器在各种数字信号处理中发挥着十分重要的作用,数字滤波器设计一直是信号处理领域的重要研究课题。
常用的数字滤波器有FIR滤波器和IIR滤波器,其中IIR数字滤波器因具有结构简单、占用存储空间少、运算速度快、较高的计算精度和能够用较低的阶数实现较好的选频特性等特点,得到了广泛应用。
DSP芯片有适合于数字信号处理的软件资源和硬件资源,是实现数字信号处理的重要途径。
目前所见文献,多数为滤波器的模型设计,所得结果也是在MATLAB等实验环境下模拟仿真完成的,带有很大的局限性。
本文讨论IIR数字滤波器在DSP上的实现思路,并对其实现方法进行了分析。
2基于DSP的FIR带通滤波器设计
在本设计中,使用MATLAB模拟产生合成信号,然后利用CCS进行滤波,设定模拟信号的采样频率为6400Hz,设计一个FIR带通滤波器,其参数为:
滤波器名称:
FIR带通滤波器
采样频率:
Fs=6400Hz
通带:
500Hz~1KHz
过渡带:
200Hz~500Hz,1KHz~1.4KHz
带内波动:
<0.5dB
阻带衰减:
-40dB以下
滤波器级数:
N=35
滤波器系数:
由MATLAB根据前述参数求得。
3总体设计方案流程图
因FDATool可直接设定滤波器阻带衰减参数,其交互式的设计环境,可以设计几乎所有的常规滤波器,因此,我们选择FDATool设计法来设计FIR带通滤波器,更为直观和方便。
如图1所示:
图1总体设计流程图(FIR)
三、主要内容和步骤
1概述
在本实验中使用MATLAB模拟产生信号,观察滤波前的时域波形和频域波形。
MATLAB仿真后,使用得到的滤波器参数,进行DSP编程,在DSP中实现FIR带通和IIR高通滤波,并使用CCS的频谱分析功能,查看DSP的滤波效果。
2整体操作步骤:
(1)打开FDATOOL,根据滤波要求设置滤波器类型、通带截止频率等相关参数的设置。
指定完设计参数后点击“DesignFilter”设计滤波器,生成滤波器系数。
(2)将生成的系数导出至MATLABWorkspace中,选择FDATool“FILE”菜单下的”Export”选项,运行MATLAB程序,得到.dat输入文件和.h头文件。
(3)将系数头文件导出至CCS中.在CCS中,编写相关汇编文件或者C语言文件,加载.out程序。
编译运行,可得到输入输出的相关波形和频谱。
3MATLAB程序流程图
如图3所示:
4CCS汇编程序流程图
如图4所示:
四、详细设计
1滤波器原理
数字滤波器是将输入的信号序列,按规定的算法进行处理,从而得到所期望的输出序列。
一个线性位移不变系统的输出序列y(n)和输入序列x(n)之间的关系,应满足常系数线性差分方程:
(4.1)
式中,x(n)为输入序列;y(n)为输出序列;
和
为滤波器系数;N为滤波器的阶数。
FIR滤波器的单位冲击响应h(n)是一个有限长序列。
若h(n)为实数,且满足偶对称或奇对称的条件,即h(n)=h(N-1-n)或h(n)=-h(N-1-n),则FIR滤波器具有线性相位特性。
偶对称线性相位FIR滤波器的差分方程为
(4.2)
式中,N为偶数。
在数字滤波器中,FIR滤波器具有如下几个主要特点:
FIR滤波器无反馈回路,是一种无条件稳定系统;
FIR滤波器可以设计成具有线性相位特性。
2DSP实现系数对称FIR滤波器方法
系数对称FIR滤波器具有线性相位的特性,在数据信号处理中应用十分广泛,常用于相位失真要求较高的场合。
采用线性相位响应可避免影响信号质量的波形失真。
设FIR滤波器N=36,若系数a(n)=a(N-1-n),则对称FIR滤波器,其输出方程为
(4.4)
从上述方程中可以看出,共需要18次乘法和35次加法,其乘法运算减少了一半。
对称FIR滤波器的实现方法:
在数据存储器中开辟两个N/2长度的循环缓冲区New和Old,分别存放N/2个新数据和老数据,如图4所示。
图4数据存储器
设置循环缓冲区指针:
AR1指向New区中的最新数据,AR2指向Old区中的最老数据。
在程序存储器中设置系数表,如图5所示。
图5程序存储器系数表
进行x(n)+x(n-35)加法运算,即(AR2)+(AR3)→AH,并修改数据指针,AR2+1→AR2,AR3-1→AR3。
累加器B清0,完成块操作,重复执行4次:
AH×系数
+(B)→B,修改系数指针,PAR+1→PAR;
(AR2)+(AR3)→AH,修改数据指针,AR2+1→AR2,AR3-1→AR3。
保存和输出结果,并修正数据指针,使AR2和AR3分别指向New区和Old区的最老数据。
形成两个首尾相邻的循环缓冲区。
用New区的最老数据替代Old区的最老数据,输入一个新数据替代New区中de1最老数据。
修正数据指针,使AR2指向New区的最新数据,AR3指向Old区的最老数据。
重复执行
~
步。
3FIR源代码及注释
3.1FIR.ASM汇编代码
.title"fir.asm"
.mmregs
.global_c_int00
;PA0.set0;writedataport
;PA1.set1;readdataport
size.set19
x_new.usect"NewData",19
x_old.usect"OldData",19
input.usect"input",512
output.usect"output",1
.bssy,1
.bsscount,1
.copy"coef1023.h";coeff1023文件
.text
_c_int00:
ld#0,a
stm#x_new,ar2
rpt#size-1
stla,*ar2+
stm#x_old,ar2
rpt#size-1
stla,*ar2+;清零
ld#y,DP
st#0,*(count)
stm#511,ar6;传送511+1次
stm#output,ar4;保存输出数据
stm#input,ar5
ssbxfrct;小数乘法
stm#size,bk;循环缓冲区长度=size
stm#-1,ar0
stm#x_new,ar2
stm#x_old+(size-1),ar3
mvdd*ar5+,*ar2+;数据存储器内部传送数据
FIR:
add*ar2+0%,*ar3+0%,a;送入A的高位AH=x(n)+x(2*size-1)
rptzb,#(size-1);b=0;下条指令执行SIZE次
firs*ar2+0%,*ar3+0%,coeff
;b=b+AH*a0,AH=x(n-1)+x(2*size-2)……循环SIZE次
sthb,@y;保存结果
sthb,*ar4+
mar*+ar2
(2)%;修正AR2,指向新缓冲区最老的数据
mar*ar3+%;修正AR3,指向老缓冲区最老的数据
mvdd*ar2,*ar3+0%;新缓冲区向老缓冲区传送一个数
mar*ar6+0;传送512个数据
banzdFIR,*ar6
;portrPA1,*ar2
mvdd*ar5+,*ar2;输入新数据至新缓冲区
nop
done:
bdone
.end
3.2FIR_v.asm复位向量文件
.title"fir_v.asm"
.ref_c_int00
.sect".vectors"
B_c_int00
.end
3.3Fir.cmd链接命令文件清单
MEMORY
{
PAGE0:
;程序存储器
EPROM:
org=0E00h,len=1000h;取名EPROM,起始地址E00H,长
;4K字
VECS:
org=0FF80H,len=0080h
PAGE1:
SPRAM:
org=0060h,len=0020h
DARAM:
org=0080h,len=1380h
}
SECTIONS
{
.text:
>EPROMPAGE0;.text段分配到程序存储器EPROM中
.data:
>EPROMPAGE0
.bss:
>SPRAMPAGE1
.vectors:
>VECSPAGE0
NewData:
align(128){}>DARAMPAGE1;把NewData段定位到一个128字
DARAM存储块的位置上
OldData:
align(128){}>DARAMPAGE1
input:
align(128){}>DARAMPAGE1
output:
align(128){}>DARAMPAGE1
}
3.4生成及修改过后的coeff1023.h系数头文件
4.MATLAB源代码及注释
FIRMATLAB源程序FIR.M
f11=5000;%/Hz
f12=10000;%/Hz
f13=11000;
f14=15000;
fs=48000;%/采样Hz
N=511%数据个数
T=1/fs;%采样周期
n=0:
N;
x11=0.9*sin(2*pi*f11*n*T);
x12=0.5*sin(2*pi*f12*n*T);
x13=sin(2*pi*f13*n*T);
x14=sin(2*pi*f14*n*T);
x_base=(x11+x12+x13+x14);
%待滤波信号波形
figure
(1)
plot(x_base)
%待滤波信号频谱
figure
(2)
yff=abs(fft(x_base))
df=n*(fs/N)
plot(df,yff)
%调用滤波器函数filter,以及FDATOOL产生的滤波器系数验证滤波效果
y_filtered=filter(B,1,x_base)
%Y=FILTER(B,A,X)
y_filted_fft=abs(fft(y_filtered));
%观察滤波后的波形与频谱
figure(3)
plot(y_filtered);
figure(4)
plot(df,y_filted_fft);
%将待滤波的数据经归一化与取整后转换为16位数据
xout=x_base/max(x_base);%归一化
xto_ccs=round(32767*xout)%取整
fid=fopen('F:
\fir\input1010.dat','w');%打开文件
fprintf(fid,'16511000\n');%输出文件头
fprintf(fid,'%d\n',xto_ccs);%输出
fclose(fid);
5硬件调试
在脱机(不接ccs)的情况下,可以首先进行实验的演示。
在SEED-DTK5416的实验选项的菜单下,选择滤波器实验一项。
等卸载程序后,可菜单操作,完成滤波器实验的演示。
通过LCD观察信号在滤波前后的变化。
五、实验过程
1实验步骤与内容
5.1FIR滤波器设计
具体步骤:
(一)FDATOOL设计法
(1)在命令窗口键入FDAtool命令,调出FDAtool界面,在FilterType选项中选Bandpass,在DesignMethod中选择FIR中选择Equiripple(等波纹)法。
在FilterOrder中选择MinimumOrder(最小阶数),这时MATLAB程序会根据所选择的滤波器类型自动使用最小阶数。
在FrequencySpecification选项中,将fs(采样频率)、fpass1和fstop1、fpass2和fstop2(过渡带)中分别键入6400Hz、200Hz和500Hz、1000Hz和1400Hz;再对MagnitudeSpecification(幅度设定),使Apass(带内波动)=0.5dB,Astop1、Astop1(阻带衰减)=40dB。
(2)点击下方的DesignerFilter(滤波器设计)即可得到所设计的FIR滤波器。
下图为利用滤波器设计和分析工具设计FIR滤波器界面。
图6FDATOOL设计FIR滤波器
设计完成后,可以通过主菜单选项Analysis来分析滤波器的幅频响应和相频响应特性。
点击Analysis中的MagnitudeResponse和PhaseResponse对幅频和相频响应进行分析,其输出的幅频和相频响应特性结果如图9。
图7FDATOOL设计FIR滤波器频率响应
图8FDATOOL设计FIR滤波器相位响应
分析:
在通带内呈线性相位,则系数对称,可用系数对称FIR滤波器方法来实现
图9FDATOOL设计FIR滤波器系数对称图
分析:
系数对称得到验证。
得到FIR滤波器的冲激响应系数的步骤如下:
(1)在主菜单中选择Targets到CodeComposerStudio(r)IDE命令,弹出ExporttoCodeComposerStudio(r)IDE窗口。
设置Numerator为B1023,Exportas选择为Signed16_bitinteger。
图10ExporttoCodeComposerStudio(r)IDE窗口的设置
(2)单击Selettarget按钮,选择目标DSP,这里选择C55xSimulator(TexasInstrumengts),单击OK确认。
FIR滤波器冲激响应系数将按默认名称COEFF1023.h显示出来。
图11FDATOOL设计FIR滤波器系数导入CCS设置界面
(二)CCS仿真
(1)对项目进行编译和链接:
把fir.asm、fir_v.asm、fir.cmd、coeff1023.h依次添加到项目后,点击Project-CompileFile,在项目编译成功之后点击Project-Build选项对该项目进行链接,生成*.out文件。
(2)装载可执行文件:
要让程序代码在DSP内部运行必需将生成的*.OUT文件装载到DSP内部,装载方法是点击:
File-LoadPrograme再选择生成的fir.out文件就可以将程序装载到DSP的内部存储器中。
图12装载可执行文件
(3)关联输入文件:
打开FIR.asm文件,把光标移到“stm#input,ar5”这一行,然后点击PorjectToolbar上的探针按钮
;
此步设置文件关联。
点击File——FileI/O,在弹出的对话框中点击AddFile,把input1010.dat添加进来,在Address栏中输入input,Lenth输入512(代表文件的输入地址即input在内存中的输入地址),选中”WrapAround”(表示输入文件中的数据是循环向DSP内存中输入的),下面是设置的界面:
图5.1选择input1010.dat图5.2设置地址、长度
点击“AddProbePoint”按钮,在弹出的对话框(图5.3),在上图中点击一下“FIR.asmline27-->NoConcection”然后在Connect下拉菜单中选择FILEIN:
E\fir\input1010.dat文件,最后点击Replace按扭,点击确定,再选择按下
按扭,如下图5.4所示。
这样就把input1010.dat文件与这个探针相关联了,以后程序运行到此探针处就会从input1010.dat文件中读取数据。
图5.3加探针图5.4传送数据
(4)运行程序并查看结果:
在View的Graph中单击Time/frequency出现graphpropertydialog框,如图5.5所示。
将显示类型,图形名称,起始地址,抽样点数,数据类型等分别进行设置,输出各种波形。
图5.5输入时域图
5.2实验过程中出现的错误及解决的办法
(1)MATLAB做程序滤波器时,采样频率设置的过小,截止频率大于采样频率的一半,运行的时候图形出现错误。
(2)MATLAB中滤波函数FILTER中的系数设置,可以通过MATLAB中HELP语句来辅助完成,得到的帮助提示如下:
>>helpfilter
FILTEROne-dimensionaldigitalfilter.
Y=FILTER(B,A,X)filtersthedatainvectorXwiththe
filterdescribedbyvectorsAandBtocreatethefiltered
dataY.Thefilterisa"DirectFormIITransposed"
implementationofthestandarddifferenceequation:
a
(1)*y(n)=b
(1)*x(n)+b
(2)*x(n-1)+...+b(nb+1)*x(n-nb)-a
(2)*y(n-1)-...-a(na+1)*y(n-na)
Ifa
(1)isnotequalto1,FILTERnormalizesthefilter
coefficientsbya
(1).
FILTERalwaysoperatesalongthefirstnon-singletondimension,
namelydimension1forcolumnvectorsandnon-trivialmatrices,
anddimension2forrowvectors.
[Y,Zf]=FILTER(B,A,X,Zi)givesaccesstoinitialandfinal
conditions,ZiandZf,ofthedelays.Ziisavectoroflength
MAX(LENGTH(A),LENGTH(B))-1,oranarraywiththeleadingdimension
ofsizeMAX(LENGTH(A),LENGTH(B))-1andwithremainingdimensions
matchingthoseofX.
FILTER(B,A,X,[],DIM)orFILTER(B,A,X,Zi,DIM)operatesalongthe
dimensionDIM.
Seealsofilter2and,intheSignalProcessingToolbox,filtfilt.
Overloadedfunctionsormethods(oneswiththesamenameinotherdirectories)
helpgf/filter.m
helpadaptfilt/filter.m
helpmfilt/filter.m
helpqfilt/filter.m
helpfints/filter.m
helpdfilt/filter.m
ReferencepageinHelpbrowser
docfilter
所以FILTER中A设置为1,而B矩阵由FDATOOL导入workplace中来完成。
(3)在.h文件中未定义COEFF标号,编译出错。
(4)编写CMD文件时,程序存储器PAGE1,必须用空格键格开,否则出现下列提示:
>>e:
\fir\fir.cmd,line4:
error:
syntaxerror
>>e:
\fir\fir.cmd,line4:
error:
MEMORYspecificationignored
编译出错。
(5)没有将系数导入到workplace中,在MATLAB中运行后只出现待滤波的波形和频谱。
即只出现两幅滤波前图。
(6)如果count设置错误,如设置89,即传送数据90次,则无滤波效果,应将count初值设为511。
(7)设置关联文件时,出现下列提示:
图5.6出错提示
应加载.OUT文件后再进行设置。
(8)编译时,出现下述警告:
warning:
entrypointsymbol_c_int00undefined
将程序_MAIN改成_C_INT00可改善,因程序总是默认从_C_INT00处开始执行。
5.3CCS程序运行后的各种输出结果
1FIR滤波器设计输出结果
(一)MATLAB程序运行结果:
(1)待滤波信号时域与频域图
图5.8待滤波信号时域图
图5.9待滤波信号频域图
(4)滤波后信号时域与频域图
图5.10滤波后信号时域图
图5.11滤波后信号频域图
分析:
从采样频率一半内3200Hz看,信号经滤波后存在700Hz,与衰减较大的300Hz,实现了预想的滤波功能。
(二)CCS仿真结果:
(1)滤波前信号时域波形
图5.12滤波前信号时域波形
分析:
图5.12为滤波前的信号,波形很杂乱,从时域上很难看出信号的周期性。
(2)滤波前信号频谱
图5.13滤波前信号的频谱
分析:
含100Hz、300Hz、700Hz与3000Hz的信号。
(3)滤波后信号时域波形
图5.14滤波后信号时域波形
分析:
图5.14为滤波前的信号,波形很有致,从时域上就能看出信号的周期性。
(4)滤波后信号频谱
图5.15波后信号频域波形
(5)滤波前后时域与