基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现.docx
《基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于TMS320F2812 DSP处理器的FIR滤波器的设计与实现.docx(16页珍藏版)》请在冰豆网上搜索。
基于TMS320F2812DSP处理器的FIR滤波器的设计与实现
郑州航空工业管理学院
电子通信工程系
DSP原理及应用课程设计报告
设计题目:
基于TMS320F2812DSP处理器的FIR滤波器的设计与实现
学号:
0913.................
姓名:
................
专业:
电子信息工程
设计日期:
2012年6月13日
指导老师:
...........................
一、引言
二、设计目的
三、设计要求
四、总体设计
4.1利用Matlab软件的FDATool工具设计FIR滤波器
4.1.1有限冲击响应数字滤波器的基础理论
4.1.2利用Matlab软件的FDATool设计FIR滤波器
4.1.3提取滤波器参数
4.2CCS环境下FIR滤波器的设计及软件仿真
4.2.1程序流程图
4.2.2在CCS集成开发环境下新建FIR滤波器工程
4.2.3观察滤波前后的信号的时域波形及FFTMagnitude波形
4.2.4程序清单
4.3对实时采样信号进行滤波的FIR滤波器的实现
4.3.1程序清单
4.3.2测试效果
4.3.3SCI串行数据传输
五、总结
六、参考文献
基于TMS320F2812DSP处理器的FIR滤波器的设计与实现
一、引言
数字信号处理(DSP)包括两重含义:
数字信号处理技术(DigitalSignalProcessing)和数字信号处理器(DigitalSignalProcessor)。
在数字信号处理的基本方法中,滤波是应用非常广泛的一个环节,数字滤波器的理论与相关设计也一直都是人们研究的重点之一。
数字滤波器根据其单位冲击响应函数的时域特性可分为两类:
无限冲击响应(InfiniteImpulseResponse,IIR)滤波器和有限冲击响应(FiniteImpulseResponse,FIR)滤波器。
与IIR滤波器相比,FIR的实现是非递归的。
使用通用DSP芯片实现滤波方式较为简单,是一种实时的,快速的,特别适合于实现各种数字信号处理运算的微处理器,借助于通用数字计算机按滤波器的设计算法编出程序进行数字滤波计算。
由于它具有丰富的硬件资源,改进哈弗结构,高速数据处理能力和强大的指令系统而在很多领域得到广泛应用。
二、设计目的
1、掌握用窗函数法设计FIR滤波器的原理及方法,掌握使用matlab编程的基本方法。
2、掌握TMS320F2812DSP处理器开发的程序框架结构,学习驱动TMS320F2812DSP处理器程序编写并能使其正常工作。
实习驱动ADC模块实现信号的实时采集与模数转换。
3、掌握使用TMS320F2812DSP处理器实现FIR数字低通滤波器的设计方法,并能够实时采集输入信号并滤除高频信号再通过SCI串口传输到计算机显示。
三、设计要求
1、利用Matlab软件的FDATool工具设计FIR滤波器,并提取滤波器参数;
2、在CCS集成开发环境下,利用第1步得到的滤波器参数,利用窗函数法设计FIR滤波器程序,观察输入信号及滤波后得到的输出信号的时域波形及FFTMagnitude波形;
3、利用TMS320F2812的ADC片内外设的外围电路实时采集的混频信号数据,使用1个51阶的FIR低通滤波器,在CCS中设计FIR滤波器程序实现滤波,观察相关波形及滤波效果,通过SCI接口将数据传送到计算机上。
四、总体设计
4.1利用Matlab软件的FDATool工具设计FIR滤波器
4.1.1有限冲击响应数字滤波器的基础理论
滤波器就是在时间域或频域内,对已知激励产生规定响应的网络,使其能够从信号中提取有用的信号,抑制并衰减不需要的信号。
滤波器的设计实质上就是对提出的要求给出相应的性能指标,再通过计算,使物理可实现的实际滤波器频率响应特性逼近给出的频率响应特性。
FIR数字滤波器系统的传递函数为:
(1)
由此得到系统的差分方程:
(2)
若FIR数字滤波器的单位冲激响应序列为h(n),它就是滤波器系数向量b(n)。
传统的滤波器分析与设计均使用繁琐的公式计算,改变参数后需要重新运算,从而在分析与设计滤波器尤其是高阶滤波器时工作量特别大。
这里应用MATLAB设计FIR滤波器,根据给定的性能指标设计一个H(z),使其逼近这一指标,进而计算并确定滤波器的系数b(n),再将所设计滤波器的幅频响应、相频响应曲线作为输出,与设计要求进行比较,对设计的滤波器进行优化。
设计完成之后将得到FIR滤波器的单位冲激响应序列h(n)的各个参数值。
4.1.2利用Matlab软件的FDATool设计FIR滤波器
(1)打开Matlab软件,首先在命令窗口键入FDAtool命令,启动滤波器设计分析器,调出FDAtool界面.
(2)在FilterType选项中选Lowpass,在DesignMethod中选择FIR滤波器,接着在FIR中选择Window(窗函数)法。
(3)然后在FilterOrder中选择SpecifyOrder(为指定阶数),输入数值为“24”;在Opitions框中选中“ScalePassband”;在窗类型(Window:
)下拉框选择“Blackman”。
(4)在FrenquencySpecification选项中,将fs(为采样频率)、fact(为通带截止频率)中分别键入30000Hz和9600Hz。
(5)点击“DesignFilter”按钮,完成滤波器的设计。
具体参数及设计成功后的结果如图所示。
设计完成后,可以通过菜单选项Analysis来分析滤波器的幅频响应和相频响应特性。
点击Analysis中的MagnitudeResponse和PhaseResponse对幅频和相频响应进行分析。
4.1.3提取滤波器参数
(6)在FDATool中,选择Targets->GenerateCHeader...,如图设置
后,点击Generate按钮,选择路径,即可输出前一步设计出的FIR滤波器的系数表。
默认的系数表文件为fdacoefs.h。
(7)在Matlab中打开得到的fdacoefs.h的文件,系数表如图
(8)取系数表中的数据小数点后3位有效值,得到如下内容:
constfloatB[25]={0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,
-0.018,0.049,-0.02,-0.11,0.28,0.64,0.28,
-0.11,-0.02,0.049,-0.018,-0.009,0.01,
-0.002,-0.002,0.001,0.0,0.0};
4.2CCS环境下FIR滤波器的设计及软件仿真
4.2.1程序流程图如下
初始化
输入低通滤波器各频率参数
构建滤波器频域特性波形
使用FDATool提取滤波器参数或用FIR滤波器计算程序计算得到滤波器参数
构建FIR滤波器进行滤波
无限循环
4.2.2在CCS集成开发环境下新建FIR滤波器工程
(1)设置软件仿真模式,启动CCS。
(2)建立一个文件夹,存放在D:
\FIR,将D:
\课程设计\FIR滤波器\Fir源程序文件夹下的工程全部复制到D:
\FIR,在CCS中打开D:
\FIR\fir\fir.pjt工程,打开fir.c文件,编译生成fir.out文件,通过File->LoadProgram…装载该文件。
(3)设置波形时域观察窗口,选择菜单View→Graph→Time/Frequency…,如图设置
输入数据时域波形观察
滤波后输出波形观察
(4)设置频域观察窗口,选择菜单View→Graph→Time/Frequency…,分别进行如图设置
输入数据FFT分析图形观察
滤波后输出数据的FFT图形观察
4.2.3观察滤波前后的信号的时域波形及FFTMagnitude波形
(1)设置断点。
在程序fir.c中,有注释断点的语句上设置软件断点。
(2)运行并观察结果。
选择Debug菜单的Run项,或按F5键运行程序。
观察到的图形如下图所示。
4.2.4程序清单
#include"math.h"
#defineFIRNUMBER25
#definePI3.1415926
floatInputWave();
floatFIR();
floatfHn[FIRNUMBER]={0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,
-0.018,0.049,-0.02,-0.11,0.28,0.64,0.28,
-0.11,-0.02,0.049,-0.018,-0.009,0.01,
-0.002,-0.002,0.001,0.0,0.0
};
floatfXn[FIRNUMBER]={0.0};
floatfInput,fOutput;
floatfSignal1,fSignal2;
floatfStepSignal1,fStepSignal2;
floatf2PI;
inti;
floatfIn[256],fOut[256];
intnIn,nOut;
main(void)
{
nIn=0;nOut=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=PI*0.1;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI*1.4;
while
(1)
{
fInput=InputWave();
fIn[nIn]=fInput;
nIn++;nIn%=256;
fOutput=FIR();
fOut[nOut]=fOutput;
nOut++;
if(nOut>=256)
{
nOut=0;/*请在此句上设置软件断点*/
}
}
}
floatInputWave()
{
for(i=FIRNUMBER-1;i>0;i--)
fXn[i]=fXn[i-1];
fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;
fSignal1+=fStepSignal1;
if(fSignal1>=f2PI)fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if(fSignal2>=f2PI)fSignal2-=f2PI;
return(fXn[0]);
}
floatFIR()
{
floatfSum;
fSum=0;
for(i=0;i{
fSum+=(fXn[i]*fHn[i]);
}
return(fSum);
}
4.3对实时采样信号进行滤波的FIR滤波器的实现
4.3.1程序清单
#include"DSP281x_Device.h"
#include"DSP281x_Examples.h"
#include
#definepi3.1415927
intpx[256];
intpy[256];
doublenpass,h[51],x,y,xmid[51];
intm=50;
intn=256;
interruptvoidadc_isr(void);
Uint16Loo