
一、实验目的
1.掌握汇编语言的编程方法。
2.掌握C语言和汇编语言的混合编程。
3.利用MATLAB设计FIR滤波器。
4.编写以浮点和Q15格式产生混合波形数据的函数。
5.编写C语言浮点实现FIR滤波算法函数。
6.编写C可调用汇编语言定点实现FIR滤波器算法函数。
7.使用CCS图形显示窗口观察和分析信号波形及其频谱。
8.进行代码性能测评。
二、实验仪器及工具
计算机,安装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,通带的波纹最大为0.03,阻带的波纹最大为0.03 。信号的抽样频率为8000 Hz。可根据信号的频率更改滤波器的频率。
2.设置CCS为“C55x Cycle Accurate Simulator”软件仿真模式,打开CCS,创建项目,编写.cmd文件,编写主程序文件。编写以浮点和Q15格式产生混合波形数据的函数。如产生抽样频率为8000 Hz,600Hz、2000 Hz、2800 Hz的三种频率的混合波形数据,其中混合频率可以自行确定。添加文件到项目中。编译、调试、链接、加载、运行程序,使用观测窗查看波形数据;选择菜单View→Graph→Time/Frequency,在弹出的“Graph Property Dialog”对话框中进行相应的配置显示产生波形的时域和频域图。
3.编写C语言浮点实现FIR滤波算法函数。在主程序文件中增添C语言浮点实现FIR滤波算法的模块,这其中包括导入MATLAB设计的滤波器浮点系数。编译、调试、链接、加载、运行程序,选择菜单View→Graph→Time/Frequency,在弹出的“Graph Property Dialog”对话框中进行相应的配置显示滤波系数和输出信号的时域图和频域的幅度和相位图。并利用Profiler工具测试函数大小及滤波时间。
4.编写C可调用汇编语言定点实现FIR滤波器算法函数。利用单乘法单元(MAC)定点实现块FIR滤波器算法。编译、链接、加载、运行程序,选择菜单View→Graph→Time/Frequency,在弹出的“Graph Property Dialog”对话框中进行相应的配置显示滤波系数和输出信号的时域图和频域的幅度和相位图。利用Profiler工具测试函数大小及滤波时间,并与C语言的浮点实现进行比较。
5.设置CCS为“C5510 Device Simulator”,利用Profiler工具测试函数大小及滤波时间。观察程序运行状况,与以上结果对比分析。
6.再次将设置CCS为“C55x Cycle Accurate Simulator”软件仿真模式,并保存退出,打开CCS 2(’C5000)集成开发环境,打开项目,将滤波系数替换为高通滤波,运行程序,选择菜单View→Graph→Time/Frequency,在弹出的“Graph Property Dialog”对话框中进行相应的配置显示滤波系数、输出信号的时域图和频域的幅度和相位图。
【程序代码】
//block_fir.c
void firc(float *in, int M, float *h, int L, float *out, float *x)
{
刷新缓冲
}
; fir.asm - Generic FIR filter
; 利用单MAC
; prototype: unsigned int fir(int *, unsigned int, int *,
; unsigned int, int *, int *, unsigned int);
;
; Entry: arg0: AR0 - filter input buffer pointer
; arg1: T0 number of samples in input buffer; arg2: AR1 - FIR coefficients array pointer
; arg3: T1 - FIR filter order
; arg4: AR2 - output buffer pointer
; arg5: AR3 - signal buffer pointer
; arg6: AR4 - signal buffer index
;
; Return: T0 = signal buffer index
_fir
pointers
|| rptblocal sample_loop-1 ; Start the outer loop
|| rpt CSR ; Start the inner loop
sample_loop
|| ret
#define M 128 /* Input sample size */
#define L 37 /* 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, 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");
#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_code");
/* Low-pass FIR filter coefficients */
static int LP_h[L]={
-79, -101, 0, 180, 256, 68, -307, -525, -251,
444, 976, 665, -567, -1835, -1722, 653, 4745, 8653,
10262, 8653, 4745, 653, -1722, -1835, -567, 665, 976,
444, -251, -525, -307, 68, 256,180,0,-101,-79,
}; //低通
static float LP_hfloat[L]={
-0.002423,-0.003085, 0.000000, 0.005480, 0.007808, 0.002078,
-0.009368,-0.016010,-0.0079, 0.013553, 0.029784, 0.020294,
-0.017318,-0.055992,-0.052540, 0.019938, 0.144791, 0.2073,
0.313170, 0.2073, 0.144791, 0.019938,-0.052540,-0.055992,
-0.017318, 0.020294, 0.029784, 0.013553,-0.0079,-0.016010,
-0.009368, 0.002078, 0.007808, 0.005480, 0.000000,-0.003085,
-0.002423
}; //低通
int input[160];
float inputfloat[160];
int x[SN]; /* Signal buffer */
unsigned int index; /* Signal buffer index */
int out[M]; /* Output buffer */
int in[M]; /* Input buffer */
float infloat[M];
float outfloat[M];
float xfloat[L];
void main(void)
{
}
/*
signal_gen.c - Generate sine waves as test data
prototype: void signal_gen(int *, float *, int)
arg0: - data buffer pointer for output in Q15
arg1: - data buffer pointer for output in float
arg2: - number of samples
*/
#include #define T 0.000125 /* 8000 Hz sampling frequency */ #define f1 800 /* 800 Hz frequency */ #define f2 1800 /* 1800 Hz frequency */ #define f3 3300 /* 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*/ #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) { 浮点转Q15定点 } -l rts55.lib /* Linker command file for Experiment 2(C55x memory map) */ MEMORY { } SECTIONS { } 【试验截图】 输入信号inputfloat的时域图: 输入信号inputfloat的幅度图和相位图: 用MATLAB设计低通滤波器: 经过C语言的低通滤波器后的信号outfloat的时域图: 经过C语言的低通滤波器后的信号outfloat的幅度图和相位图: 经过汇编语言的低通滤波器后的信号out的时域图: 经过汇编语言的低通滤波器后的信号out的幅度图和相位图: 用MATLAB设计高通滤波器: 经过C语言的高通滤波器后的信号outfloat的时域图: 经过C语言的高通滤波器后的信号outfloat的幅度图和相位图: 经过汇编语言的高通滤波器后的信号out的时域图: 经过汇编语言的高通滤波器后的信号out的幅度图和相位图: 五、总结实验体会及实验中存在的问题 这是第二次做DSP实验,实验指导书中很详细的介绍了实验的方法,我按照实验指导书步步执行,并未遇到严重的大问题。在实验的过程中由于对汇编语言不熟悉,导致因为格式不对而编译出错,但在老师的细心帮助下很快得到了解决。我希望能在这几次实验后能更加熟练DSP及MATLAB的操作,对fir滤波器做更深了解。
