1、北京信息科技大学DSP实验二实 验 报 告课程名称 DSP原理与应用 实验项目 FIR算法的DSP实现 指导教师 学 院 信息与通信工程 _专 业 电子信息工程 班级/学号 学生姓名 实验日期 成 绩_ 实验2 FIR算法的DSP实现一、实验目的1. 掌握汇编语言的编程方法。2. 掌握C语言和汇编语言的混合编程。3. 利用MATLAB设计FIR滤波器。4. 编写以浮点和Q15格式产生混合波形数据的函数。5. 编写C语言浮点实现FIR滤波算法函数。6. 编写C可调用汇编语言定点实现FIR滤波器算法函数。7. 使用CCS图形显示窗口观察和分析信号波形及其频谱。8. 进行代码性能测评。二、实验仪器及
2、工具计算机,安装Windows XP 操作系统、MATLAB 7.0.1、TI 的TMS320C5000 DSP 的开发软件 CCS2.21;ICETEK-VC5509教学实验箱。三、实验内容1 利用MATLAB设计FIR滤波器,以浮点和Q15格式导出滤波器系数。2 FIR算法的TMS320C55x DSP的C语言浮点及汇编语言定点实现。四、实验步骤1. 编写MATLAB程序,利用MATLAB设计FIR低通或高通滤波器,以浮点和Q15格式导出滤波器系数。例:利用kaiser窗设计一个低通FIR数字滤波器,通带的范围是0Hz到1100Hz, 阻带的范围是1600 Hz到4000 Hz,通带的波纹
3、最大为0.03,阻带的波纹最大为0.03 。信号的抽样频率为8000 Hz。可根据信号的频率更改滤波器的频率。2. 设置CCS为“C55x Cycle Accurate Simulator”软件仿真模式,打开CCS,创建工程,编写.cmd文件,编写主程序文件。编写以浮点和Q15格式产生混合波形数据的函数。如产生抽样频率为8000 Hz,600Hz、2000 Hz、2800 Hz的三种频率的混合波形数据,其中混合频率可以自行确定。添加文件到工程中。编译、调试、链接、加载、运行程序,使用观测窗查看波形数据;选择菜单ViewGraphTime/Frequency,在弹出的“Graph Propert
4、y Dialog”对话框中进行相应的配置显示产生波形的时域和频域图。3. 编写C语言浮点实现FIR滤波算法函数。在主程序文件中增添C语言浮点实现FIR滤波算法的模块,这其中包括导入MATLAB设计的滤波器浮点系数。编译、调试、链接、加载、运行程序,选择菜单ViewGraphTime/Frequency,在弹出的“Graph Property Dialog”对话框中进行相应的配置显示滤波系数和输出信号的时域图和频域的幅度和相位图。并利用Profiler工具测试函数大小及滤波时间。4. 编写C可调用汇编语言定点实现FIR滤波器算法函数。利用单乘法单元(MAC)定点实现块FIR滤波器算法。编译、链接
5、、加载、运行程序,选择菜单ViewGraphTime/Frequency,在弹出的“Graph Property Dialog”对话框中进行相应的配置显示滤波系数和输出信号的时域图和频域的幅度和相位图。利用Profiler工具测试函数大小及滤波时间,并与C语言的浮点实现进行比较。5. 设置CCS为“C5510 Device Simulator”,利用Profiler工具测试函数大小及滤波时间。观察程序运行状况,与以上结果对比分析。6. 再次将设置CCS为“C55x Cycle Accurate Simulator”软件仿真模式,并保存退出,打开CCS 2(C5000)集成开发环境,打开工程,将
6、滤波系数替换为高通滤波,运行程序,选择菜单ViewGraphTime/Frequency,在弹出的“Graph Property Dialog”对话框中进行相应的配置显示滤波系数、输出信号的时域图和频域的幅度和相位图。五、实验截图: 图(1) MATLAB实现低通滤波器 图(2)混合波形的时域和频域图形 图(3)C语言实现FIR低通滤波后的时域、频域波形 图(4)汇编语言实现FIR低通滤波后的时域、频域波形 图(5)Profiler工具测试函数大小及滤波时间六、实验心得 本次实验考察了fir滤波器在DSP中的实现算法,通过MATLAB导出滤波器的系数,然后再利用DSP中的C语言算法或汇编算法可
7、以实现对于混合信号的滤波作用。通过这样的一次实验,我掌握了一些DSP软件调试中的方法,如利用观测窗验证部分变量的值的变化,就可以判断算法中运行情况,还有就是断点和探针的应用。实验中还用到了波形发生函数,将几个不同的频率的正弦波混合到一起,相信通过这样的一次编程,以后遇到相同的问题就可以顺利解决了。在实验中设计了一个低通滤波器,相类似的可以设计出高通、带通和带阻的。附:程序代码1、MATLAB设计低通滤波器clc,close allfsamp=8000; %采样率fcuts=1100 1600 ; %截止频率 mags=1 0; %低通滤波devs=0.03 0.03; %波纹系数N,Wn,BE
8、TA,TYPE = KAISERORD(fcuts, mags , devs ,fsamp);B = FIR1(N, Wn, TYPE, kaiser( N+1,BETA ) );plot(B),figure,freqz(B) %浮点系数的导出f1=fopen(B.txt,w);fprintf(f1,%9f, B);fclose(f1); %Q15格式系数的导出f2=fopen(BQ15.txt,w);BQ15=round(B.*32768); %朝最近的整数取整fprintf(f2,%6d, BQ15);fclose(f2);2、 -l rts55.lib/*Linker command f
9、ile for Experiment 2(C55x memory map)*/MEMORYMMR : origin = 0000000h, length = 00000c0hSPRAM : origin = 00000c0h, length = 0000040hDARAM0 : origin = 0000100h, length = 0003F00hDARAM1 : origin = 0004000h, length = 0004000hDARAM2 : origin = 0008000h, length = 0004000hDARAM3 : origin = 000c000h, length
10、 = 0004000hSARAM0 : origin = 0010000h, length = 0004000hSARAM1 : origin = 0014000h, length = 0004000hSARAM2 : origin = 0018000h, length = 0004000hSARAM3 : origin = 001c000h, length = 0004000hSARAM4 : origin = 0020000h, length = 0004000hSARAM5 : origin = 0024000h, length = 0004000hSARAM6 : origin = 0
11、028000h, length = 0004000hSARAM7 : origin = 002c000h, length = 0004000hSARAM8 : origin = 0030000h, length = 0004000hSARAM9 : origin = 0034000h, length = 0004000hSARAM10 : origin = 0038000h, length = 0004000hSARAM11 : origin = 003c000h, length = 0004000hSARAM12 : origin = 0040000h, length = 0004000hS
12、ARAM13 : origin = 0044000h, length = 0004000hSARAM14 : origin = 0048000h, length = 0004000hSARAM15 : origin = 004c000h, length = 0004000hVECS : origin = 0ffff00h, length = 00100h /* reset vector */SECTIONSvectors : VECS /* interrupt vector table */.cinit : SARAM0.text : SARAM1.stack : DARAM0.sysstac
13、k: DARAM0.sysmem : DARAM1.data : DARAM1.bss : DARAM1.const : DARAM1fir_coef : SARAM0 /* user defined sections */fir_data : DARAM2input : SARAM0output : SARAM0 align 0x4 /* boundary alignment */fir_code : SARAM13、正弦波产生文件#include #define T 0.000125 /* 8000 Hz sampling frequency */#define f1 600 /* 800
14、 Hz frequency */#define f2 2000 /* 1800 Hz frequency */#define f3 2800 /* 3300 Hz frequency */#define PI 3.1415926#define two_pi_f1_T (2*PI*f1*T) /* 2*pi*f1/Fs */#define two_pi_f2_T (2*PI*f2*T) /* 2*pi*f2/Fs */#define two_pi_f3_T (2*PI*f3*T) /* 2*pi*f3/Fs */#define a1 0.333 /* Magnitude for wave 1 *
15、/#define a2 0.333 /* Magnitude for wave 2 */#define a3 0.333 /* Magnitude for wave 3 */void signal_gen(int *x, float *y, int N) float temp;int i;for (i=0; i=0) xi = (int)(0x8000*temp+0.5);/else xi=(int)(0x8000*temp-0.5);xi=temp=0?(int)(0x8000*temp+0.5):(int)(0x8000*temp-0.5);/浮点转Q15定点并且四舍五入,采用条件运算符/
16、C语言优先级由高到低:算术运算符关系运算符逻辑运算符/条件运算符赋值运算符逗号运算符yi=temp;4、主函数/fircasm.cint input160;float inputfloat160;#define M 128 /* Input sample size */#define L 27 /* Number of FIR filter coefficients */#define SN L /* Signal buffer size */extern void signal_gen(int *x,float *y, int N);extern void firc(float *, int
17、, float *, int, float *, float *);extern unsigned int fir(int *, unsigned int, int *,unsigned int,int *, int *, unsigned int);/* Define DSP system memory map */#pragma DATA_SECTION(LP_h, fir_coef);#pragma DATA_SECTION(x, fir_data);#pragma DATA_SECTION(in, input);#pragma DATA_SECTION(index, fir_data)
18、;#pragma DATA_SECTION(out, output);#pragma DATA_SECTION(LP_hfloat, fir_coef);#pragma DATA_SECTION(xfloat, fir_data);#pragma DATA_SECTION(infloat, input);#pragma DATA_SECTION(outfloat, output);#pragma DATA_SECTION(inputfloat, input);#pragma DATA_SECTION(input, input);#pragma CODE_SECTION(main, fir_co
19、de);/* Low-pass FIR filter coefficients */static int LP_hL= 291, 62, -393, -576, -91, 768, 1066, 115, -1540, -2155, -131, 4368, 9066, 11069, 9066, 4368, -131, -2155, -1540, 115, 1066, 768, -91, -576, -393, 62, 291,;/ 低通,通带的范围是0Hz到1100Hz, 阻带的范围是1600 Hz到4000 Hzstatic float LP_hfloatL=0.008868,0.001896
20、,-0.011995,-0.017569,-0.002763,0.023447, 0.032522, 0.003501,-0.047009,-0.065779,-0.003996,0.133297,0.276677, 0.337806, 0.276677,0.133297,-0.003996,-0.065779,-0.047009, 0.003501,0.032522, 0.023447,-0.002763,-0.017569,-0.011995, 0.001896,0.008868,;/ 低通,通带的范围是0Hz到1100Hz, 阻带的范围是1600 Hz到4000 Hzint input1
21、60;float inputfloat160;int xSN; /* Signal buffer */unsigned int index; /* Signal buffer index */int outM; /* Output buffer */int inM; /* Input buffer */float infloatM;float outfloatM;float xfloatL;void main(void)unsigned int i,j;signal_gen(input,inputfloat, 160);/* Initialize filter signal buffer */
22、for (i=0; iSN;i+)xfloati=0;j=0;for (i=0; iSN;i+)xi=0;index=0;for (;)for (i=0; iM; i+)ini=inputj+; / Get a buffer of samplesif (j = 160)j=0;for (i=0; i VECS /* interrupt vector table */.cinit : SARAM0.text : SARAM1.stack : DARAM0.sysstack: DARAM0.sysmem : DARAM1.data : DARAM1.bss : DARAM1.const : DARAM1fir_coef : SARAM0 /* user defined sections */fir_data : DARAM2input : SARAM0output : SARAM0 align 0x4 /* boundary alignment */fir_code : SARAM1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1