2、使用 Matlab中的 Fdatool设计滤波器
在 Matlab的 Start菜单中选择 Toolboxes -> Filter Design -> Filter Design & Analysis Tools(fdatool),或者在命令行中输入fdatool来启动滤波器设计分析器。调整各参数后得到设计的数字滤波器如下:
1、从 Matlab中导出FIR滤波器系数。
a.在 Fdatool 中,选择 Targets -> Code Composer Studio (tm) IDE。
b.在出现的对话框中选择输出文件类型为 C header file,输出系数类型为signed 16-bit integer,如下图所示:
c.点击OK按钮,选择路径,即可输出前一步设计出的 FIR滤波器的系数表,文件为fdacoefs.h,得到滤波器的参数如下:
const int BL = 81;
const int16_T B[81] = {
-16, 0, -7, 0, 139, 0, -223, 0, 17,
0, 233, 0, -14, 0, -356, 0, 35, 0,
532, 0, -59, 0, -790, 0, 85, 0, 1184,
0, -110, 0, -1857, 0, 130, 0, 3334, 0,
-143, 0, -10382, 0, 16531, 0, -10382, 0, -143,
0, 3334, 0, 130, 0, -1857, 0, -110, 0,
1184, 0, 85, 0, -790, 0, -59, 0, 532,
0, 35, 0, -356, 0, -14, 0, 233, 0,
17, 0, -223, 0, 139, 0, -7, 0, -16
};
2、待测信号设计本实验设计一个采样频率Fs为10 KHz,输入信号频率为0.5 KHz、3 KHz和8 KHz的合成信号,通过设计的带通滤波器将0.5KHz和8 KHz信号滤除,剩余其余信号。为了方便的导入ccs环境,特用Matlab生成随机信号,并导出明为input的dat文件。
随机信号生成代码:
f11=500; %/Hz
f12=3000; %/Hz
f13=8000; %/Hz
fs=10000; %/采样 Hz
N=1000 %数据个数
T=1/fs; %采样周期
n=0:N;
x11=sin(2*pi*f11*n*T);
x12=0.7*sin(2*pi*f12*n*T);
x13=0.5*sin(2*pi*f13*n*T);
x_base=(x11+x12+x13);
%待滤波信号波形
figure(1)
plot(x_base)
%待滤波信号频谱
figure(2)
yff=abs(fft(x_base))
df=n*(fs/N)
plot(df,yff)
xout=x_base/max(x_base);%归一化
xto_ccs=round(32767*xout)
fid=fopen('input.dat','w');%打开文件
fprintf(fid,'1651 1 0 0 0\\n');%输出文件头fprintf(fid,'%d\\n',xto_ccs);%输出
fclose(fid);
3、CCS环境程序设计
A、在CCS上建立FIR工程并将滤波器仿真程序FIR.c、Matlab导出的头文件fdacoefs.h和链接文件FIR.cmd添加到工程中,对程序进行调试、链接;调试无误后生成FIR.out程序。
FIR.c程序如下:
#include "stdio.h"
#include "fdacoefs.h"
//fdacoefs.h为 Matlab生成的系数表头文件
#define N 81 //FIR滤波器的级数+1,本例中滤波器级数为 80
#define LEN 200 //待滤波的数据长度
long yn;
int input[LEN]; //输入缓冲,在仿真时将从内存载入
int output[LEN]; //输出缓冲,直接存放在内存中
void main()
{
int i,j;
int *x;
for(j=0;j x=&input[j]; yn = 0; for(i=0; i output[j]=yn>>15; } while(1);} FIR.cmd程序如下: MEMORY { PAGE 0: EPROG: origin = 0x1400, len = 0x7c00 VECT: origin = 0xff80, len = 0x80 PAGE 1: USERREGS: origin = 0x60, len = 0x1c BIOSREGS: origin = 0x7c, len = 0x4 IDATA: origin = 0x80, len = 0x1380 EDATA: origin = 0x1400, len = 0x8000 EDATA1: origin = 0x9400, len = 0x4c00 } SECTIONS { .vectors: {} > VECT PAGE 0 .sysregs: {} > BIOSREGS PAGE 1 .trcinit: {} > EPROG PAGE 0 .gblinit: {} > EPROG PAGE 0 frt: {} > EPROG PAGE 0 .text: {} > EPROG PAGE 0 .cinit: {} > EPROG PAGE 0 .pinit: {} > EPROG PAGE 0 .sysinit: {} > EPROG PAGE 0 .bss: {} > IDATA PAGE 1 .far: {} > IDATA PAGE 1 .const: {} > IDATA PAGE 1 .switch: {} > IDATA PAGE 1 .sysmem: {} > IDATA PAGE 1.cio: {} > IDATA PAGE 1 .MEM$obj: {} > IDATA PAGE 1 .sysheap: {} > IDATA PAGE 1 .stack: {} > IDATA PAGE 1 } B、装载FIR.out文件,把滤波器程序载入内存;装载之前生成的input.dat文件,将 Address 设置为input,Length 设置为 200,Page 设置为Data。 C、运行程序,点击RUN按钮,程序即开始运行。 D、查看滤波器滤波效果。打开 View->Graph->Time/Frequency,修改参数设置如下: 点击OK,得到输入信号的时域波形: E、重复前三个步骤,只改变图形选项中的 Display Type、Graph Title、Start Address,使之最后出现如下的图形: 左上角:输入数据时域图(Start Address : input) 右上角:输入数据频谱(Display Type : FFT Magnitude) 左下角:输出数据时域图(Start Address : output) 右下角:输出数据频谱(Display Type : FFT Magnitude)下载本文