视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于ccs的FIR数字滤波器
2025-09-29 17:03:07 责编:小OO
文档
利用汇编语言在CCS环境中设计一个80级的FIR带通滤波器,通带频率为1.375KHz至3.625KHz;阻带边界频率为1KHz和4KHz;采样频率为10KHz,并利用设计好的滤波器对常用信号进行滤波处理。

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; iyn += B[i]*(*x++);

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)下载本文

显示全文
专题