五邑大学 DSP 基于DSPLib的滤波器程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五邑大学实验报告实验课程名称:DSP原理及应用
院系名称:信息工程学院
专业名称:电子信息工程
实验项目名称:基于DSPLib的滤波器程序设计班级:学号:
报告人:
基于DSPLib 的滤波器程序设计实验
一、 实验目的
1、了解FIR 、IIR 数字滤波器的原理。
2、掌握FIR 、IIR 数字滤波器的设计方法。
3、熟悉对DSPLib 的调用方法以及数字滤波器在DSP 系统中的实现。
二 、实验内容(要求)
实验内容:现有连续时间信号[]()2000cos(21000)2cos(22000)x t t t ππ=⋅⋅+⋅⋅,已基于采样频率16000s f Hz =对()x t 采样,获得离散数据()x n 。设计一个FIR (或IIR )数字低通滤波器,对数据()x n 滤波,滤除()x n 中2000Hz 频率分量,保留1000Hz 频率分量。 实验要求:
1、设计FIR (或IIR )数字低通滤波器,得到滤波器的有关参数;
2、基于DSPLib 编制DSP 的C 语言程序,实现上述低通滤波,并对数据()x n 滤波。
3、利用CCS 中VIEW 菜单中的Graph 调试工具观察信号时域波形及其频谱。
三 、实验原理(背景知识)
1、FIR 、IIR 数字滤波器的基本原理。
IIR 滤波器传递函数包括零点和极点两组可调因素,对极点的惟一限制是在单位圆内。因此可用较低的阶数获得高的选择性,所用的存储单元少,计算量小,效率高。但是这个高效率是以相位的非线性为代价的。选择性越好,则相位非线性越严重。FIR 滤波器传递函数的极点固定在原点,是不能动的,它只能靠改变零点位置来改变它的性能。所以要达到高的选择性,必须用较高的阶数;对于同样的滤波器设计指标,FIR 滤波器所要求的阶数可能比IIR 滤波器高5-10倍,结果,成本较高,信号延时也较大;如果按线性相位要求来说,则IIR 滤波器就必须加全通网络进行相位校正,同样要大大增加滤波器的阶数和复杂性。而FIR 滤波器却可以得到严格的线性相位
2、MA TLAB 的数字滤波器设计工具FDAtool 。 2.1 启动滤波器设计分析器
在MA TLAB 的start 菜单中选择Toolboxes->Filter Design->Filter Design & Analysis Tools(fdatool),或者在命令行中输入fdatool 来启动滤波器设计分析器。启动后界面如图1所示:
图1 FDAtool设计界面
2.2 滤波器设计
在选项中选择或输入滤波器参数,然后点击“Design Filter”按钮完成滤波器设计。设计成功后的结果如图2所示。
图2 滤波器设计
2.3 导出FIR滤波器系数。
在fdatool中,选择Targets->Code Composer Studio IDE。
在出现的对话框中选择输出文件类型为C.header file,输出系数类型为signed 16-bit integer,如图2所示。
点击OK按钮,选择路径,即可输出前一步设计出的FIR滤波器系数表。
图2 导出FIR滤波器系数
3、DSPLib的应用
CCS提供DSPLib,其中包含了基本的数学计算和数字信号处理常用算法模块的函数,可直接调用这些函数实现一些数字信号处理算法。本实验主要使用了fir、firs、firs2、iircas4、
iircas5、iircas5I等函数实现数字滤波。
程序框图如下:
四、实验步骤
1、打开CCS,并设置好相对应的参数,采用软件仿真。
2、利用Matlab 产生带通滤波信号用于滤波器测试。在Matlab 中运行后将会生成input.dat 文件。该数据文件中含有1000Hz、2000Hz 两种频率的信号,用于滤波器滤波效果测试
3、编写主函数,包含必要的头文件,并设置好相对应的路径。完毕将支持的库函数加入工程中。编译成功后会在”<工程所以目录>/debug”文件夹下产生*.out 文件,在CCS 软件的File->Load Program 里打开这个.out 文件。
4、将滤波器设计文件载入到内存中。选择File->Data->Load…打开之前Matlab 生成的input.dat 文件;运行程序,查看滤波器滤波效果;打开View->Graph->Time/Frequency便可查看程序是否有逻辑错误。
五、程序源代码
1、主函数:
#include
#include
#include
#include "fdacoefs.h
#define NX 1024
#define NH 201
#define pi 3.1415926
#define PMST (unsigned int*)0x1D
int i,j;
DATA x[NX], h[NH],r[NX], db[NH];
DATA *dbptr=&db[0];
#pragma DATA_SECTION(h,".coeffs")
#pragma DATA_SECTION(db,".dbuffer")
void dataIO(void);
void main(void)
{
*PMST=0x00A0; //IPTR=000000001,MP/MC=0,OVLY=1,DROM=0
dataIO();
for (i=0; i for(i=0;i fir(x, h, r, &dbptr, NH, NX); return; } void dataIO() { /* do data I/O */ return; } 2、中断函数: .ref _c_int00 .sect ".vectors"