dsp滤波要点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字信号处理
综合设计性实验报告
学院:电子信息工程学院
班级:自动化0706班
电子0701班
指导教师:高海林
学生:张越07213056
陈冠宇07214004
北京交通大学电工电子教学基地
2010年1月20日
利用DSP实现信号滤波
一:实验目的
实现离散信号滤波是DSP的基本功能,本实验中我们尝试实现分别了设计FIR 和IIR滤波器实现低通,高通,带通,带阻四种滤波器对正弦离散信号进行滤波。(1)学会编写滤波程序和输入信号程序。
(2)熟悉CCS集成开发环境,熟悉DSK板的使用。
(3)通过实验比较FIR和IIR在设计上和滤波效果上的区别。
二:FIR滤波器的设计
例:设计一个采样频率Fs为8000Hz,输入信号频率为1000HZ、2500HZ与4000HZ 的合成信号,通过设计FIR滤波器分别实现低通,高通,带通,带阻的滤波功能。
一:实验原理
一个线性位移不变系统的输出序列y(n)和输入序列x(n)之间的关系,应满
足常系数线性差分方程:
x(n): 输入序列,y(n): 输出序列,ai、bi : 滤波器系数,N: 滤波器的阶数。在式上式中,若所有的ai 均为0,则得FIR 滤波器的差分方程:
对上式进行z 变换,可得FIR 滤波器的传递函数:
FIR 滤波器的结构
FIR 滤波器的单位冲激响应h(n)为有限长序列。
若h(n)为实数,且满足偶对称或奇对称的条件,则FIR 滤波器具有线性相位特性。在数字滤波器中,FIR 滤波器具有如下几个主要特点:
① FIR 滤波器无反馈回路,是一种无条件稳定系统;
② FIR 滤波器可以设计成具有线性相位特性。
本实验程序设计的就是一种偶对称的线性相位滤波器。
程序算法实现采用循环缓冲区法。
二:算法原理:
①在数据存储器中开辟一个N个单元的缓冲区(滑窗),用来存放最新的N个输入样本;
②从最新样本开始取数;
③读完最老样本后,输入最新样本来代替最老样本,而其他数据位置不变;
④用BK 寄存器对缓冲区进行间接寻址,使缓冲区地址首尾相邻。
三:实验程序设计步骤
1.FIR滤波器设计
利用MATLAB中的FDA工具导出正确的参数。
2.产生滤波器输入信号文件
以下是一个产生输入信号的C语言程序,信号是频率为1000Hz、2500Hz和4000Hz 的正弦波合成的波形:
#include
#include
void main()
{
int i;
double f[256];
FILE *fp;
if((fp=fopen("in.inc","wt"))==NULL)
{
printf("can't open file! \n");
return;
}
for(i=0;i<=255;i++)
{
f[i]=sin(2*3.14159*i*1000/8000)+sin(2*3.14159*i*2500/8000)+sin(2*
3.14159*4000/8000);
fprintf(fp," .word %1d\n",(long)(f[i]*32768/3));
}
fclose(fp);
}
该文件会生成一个.inc的文件,由于比较冗长,在此不再赘述。然后,在DSP汇编语言中通过.copy汇编命令将生成的数据文件iirin.inc复制到汇编程
序中,作为IIR滤波器的输入数据。此过程的作用相当于把信号通过了AD转换。
由此即可得到16位二进制数据表示的离散数据文件,即离散的三频谱叠加的正
弦信号。
3.编写滤波器的汇编源程序
(1)低通滤波器
**********一个FIR低通滤波器程序lowpass.asm************
**************使用线性缓冲区法************************
.mmregs
.global start
.def start,_c_int00
KS .set 256 ;输入样本数据个数
N .set 46 ;FIR滤波器阶数
COEF_FIR .sect "COEF_FIR" ;FIR滤波器系数
.word 297, 226, 180, 24, -213, -451, -585, -532, -271
.word 125, 505, 686, 535, 40, -651, -1260, -1456, -979
.word 248, 2064, 4092, 5839, 6848, 6848, 5839, 4092, 2064
.word 248, -979, -1456, -1260, -651, 40, 535,
686, 505
.word 125, -271, -532, -585, -451, -213, 24, 180, 226, 297
.data
INPUT .copy "lowpass.inc" ;输入数据在数据区0x2400 OUTPUT .space 1024 ;输出数据在数据区0x2500 DATABUF .usect "FIR_BFR",N
BOS .usect "STACK",0Fh
TOS .usect "STACK",1
.text
.asg AR4,DATA_P ;数据x(n)缓冲区指针
.asg AR6,INBUF_P ;模拟输入数据指针
.asg AR7,OUTBUF_P ;FIR滤波器输出数据指针
_c_int00
b start
nop
nop
start: SSBx FRCT ;小数乘法编程时,设置FRCT(小
数方式)位
STM #DATABUF,DATA_P ;数据缓冲区清零
RPTZ A,N-1
STL A,*DATA_P+
FIR_TASK:
STM #DATABUF,DATA_P
STM #INPUT,INBUF_P
STM #OUTPUT,OUTBUF_P
STM #KS-1,BRC
RPTB LOOP-1
LD *INBUF_P+,A ;装载输入数据
FIR_FILTER: ;FIR滤波运算
STL A,*DATA_P ;输入样本值x(n)
STM #(DATABUF+N-1),DATA_P ;数据缓冲区指针指向
x[n-(N-1)]
RPTZ A,N-1
MACD *DATA_P-,COEF_FIR,A ;FIR滤波运算
MAR *DATA_P+ ;调整DATA_P指针指向DATABUF
第一个单元
STH A,*OUTBUF_P+
LOOP:
EEND B EEND
.end