dsp滤波要点说明.docx
- 文档编号:23736987
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:27
- 大小:868.85KB
dsp滤波要点说明.docx
《dsp滤波要点说明.docx》由会员分享,可在线阅读,更多相关《dsp滤波要点说明.docx(27页珍藏版)》请在冰豆网上搜索。
dsp滤波要点说明
数字信号处理
综合设计性实验报告
学院:
电子信息工程学院
班级:
自动化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
voidmain()
{
inti;
doublef[256];
FILE*fp;
if((fp=fopen("in.inc","wt"))==NULL)
{
printf("can'topenfile!
\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
.globalstart
.defstart,_c_int00
KS.set256;输入样本数据个数
N.set46;FIR滤波器阶数
COEF_FIR.sect"COEF_FIR";FIR滤波器系数
.word297,226,180,24,-213,-451,-585,-532,-271
.word125,505,686,535,40,-651,-1260,-1456,-979
.word248,2064,4092,5839,6848,6848,5839,4092,2064
.word248,-979,-1456,-1260,-651,40,535,686,505
.word125,-271,-532,-585,-451,-213,24,180,226,297
.data
INPUT.copy"lowpass.inc";输入数据在数据区0x2400
OUTPUT.space1024;输出数据在数据区0x2500
DATABUF.usect"FIR_BFR",N
BOS.usect"STACK",0Fh
TOS.usect"STACK",1
.text
.asgAR4,DATA_P;数据x(n)缓冲区指针
.asgAR6,INBUF_P;模拟输入数据指针
.asgAR7,OUTBUF_P;FIR滤波器输出数据指针
_c_int00
bstart
nop
nop
start:
SSBxFRCT;小数乘法编程时,设置FRCT(小数方式)位
STM#DATABUF,DATA_P;数据缓冲区清零
RPTZA,N-1
STLA,*DATA_P+
FIR_TASK:
STM#DATABUF,DATA_P
STM#INPUT,INBUF_P
STM#OUTPUT,OUTBUF_P
STM#KS-1,BRC
RPTBLOOP-1
LD*INBUF_P+,A;装载输入数据
FIR_FILTER:
;FIR滤波运算
STLA,*DATA_P;输入样本值x(n)
STM#(DATABUF+N-1),DATA_P;数据缓冲区指针指向x[n-(N-1)]
RPTZA,N-1
MACD*DATA_P-,COEF_FIR,A;FIR滤波运算
MAR*DATA_P+;调整DATA_P指针指向DATABUF第一个单元
STHA,*OUTBUF_P+
LOOP:
EENDBEEND
.end
(2)高通滤波器
*********一个FIR高通滤波器程序highpass.asm************
**************使用线性缓冲区法************************
.mmregs
.globalstart
.defstart,_c_int00
KS.set256;输入样本数据个数
N.set49;FIR滤波器阶数
COEF_FIR.sect"COEF_FIR";FIR滤波器系数
.word-358,632,30,-284,-184,211,371,-6,-448
.word-263,396,572,-142,-806,-319,840,949,-519
.word-1650,-355,2294,2303,-2746,-10014,19293,-10014,-2746
.word2303,2294,-355,-1650,-519,949,840,-319,-806
.word-142,572,396,-263,-448,-6,371,211,-184
.word-284,30,632,-358
.data
INPUT.copy"highpass.inc";输入数据在数据区0x2400
OUTPUT.space1024;输出数据在数据区0x2500
DATABUF.usect"FIR_BFR",N
BOS.usect"STACK",0Fh
TOS.usect"STACK",1
.text
.asgAR4,DATA_P;数据x(n)缓冲区指针
.asgAR6,INBUF_P;模拟输入数据指针
.asgAR7,OUTBUF_P;FIR滤波器输出数据指针
_c_int00
bstart
nop
nop
start:
SSBxFRCT;小数乘法编程时,设置FRCT(小数方式)位
STM#DATABUF,DATA_P;数据缓冲区清零
RPTZA,N-1
STLA,*DATA_P+
FIR_TASK:
STM#DATABUF,DATA_P
STM#INPUT,INBUF_P
STM#OUTPUT,OUTBUF_P
STM#KS-1,BRC
RPTBLOOP-1
LD*INBUF_P+,A;装载输入数据
FIR_FILTER:
;FIR滤波运算
STLA,*DATA_P;输入样本值x(n)
STM#(DATABUF+N-1),DATA_P;数据缓冲区指针指向x[n-(N-1)]
RPTZA,N-1
MACD*DATA_P-,COEF_FIR,A;FIR滤波运算
MAR*DATA_P+;调整DATA_P指针指向DATABUF第一个单元
STHA,*OUTBUF_P+
LOOP:
EENDBEEND
.end
(3)带通滤波器
*********一个FIR带通滤波器程序bandpass.asm************
**************使用线性缓冲区法************************
.mmregs
.globalstart
.defstart,_c_int00
KS.set256;输入样本数据个数
N.set46;FIR滤波器阶数
COEF_FIR.sect"COEF_FIR";FIR滤波器系数
.word193,108,-74,-635,-620,112,784,773,94
.word-533,-431,-18,-243,-946,-741,1064,2933,2307
.word-1241,-4633,-4091,551,5088,5088,551,-4091,-4633
.word-1241,2307,2933,1064,-741,-946,-243,-18,-431
.word-533,94,773,784,112,-620,-635,-74,108,193
.data
INPUT.copy"bandpass.inc";输入数据在数据区0x2400
OUTPUT.space1024;输出数据在数据区0x2500
DATABUF.usect"FIR_BFR",N
BOS.usect"STACK",0Fh
TOS.usect"STACK",1
.text
.asgAR4,DATA_P;数据x(n)缓冲区指针
.asgAR6,INBUF_P;模拟输入数据指针
.asgAR7,OUTBUF_P;FIR滤波器输出数据指针
_c_int00
bstart
nop
nop
start:
SSBxFRCT;小数乘法编程时,设置FRCT(小数方式)位
STM#DATABUF,DATA_P;数据缓冲区清零
RPTZA,N-1
STLA,*DATA_P+
FIR_TASK:
STM#DATABUF,DATA_P
STM#INPUT,INBUF_P
STM#OUTPUT,OUTBUF_P
STM#KS-1,BRC
RPTBLOOP-1
LD*INBUF_P+,A;装载输入数据
FIR_FILTER:
;FIR滤波运算
STLA,*DATA_P;输入样本值x(n)
STM#(DATABUF+N-1),DATA_P;数据缓冲区指针指向x[n-(N-1)]
RPTZA,N-1
MACD*DATA_P-,COEF_FIR,A;FIR滤波运算
MAR*DATA_P+;调整DATA_P指针指向DATABUF第一个单元
STHA,*OUTBUF_P+
LOOP:
EENDBEEND
.end
(4)带阻滤波器
*********一个FIR带阻滤波器程序bandstop.asm************
**************使用线性缓冲区法************************
.mmregs
.globalstart
.defstart,_c_int00
KS.set256;输入样本数据个数
N.set49;FIR滤波器阶数
COEF_FIR.sect"COEF_FIR";FIR滤波器系数
.word-309,830,326,72,98,297,201,-395,-910
.word-584,414,999,575,-92,42,581,10,-1900
.word-2933,-799,3409,5411,2317,-3534,26290,-3534,2317
.word5411,3409,-799,-2933,-1900,10,581,42,-92
.word575,999,414,-584,-910,-395,201,297,98
.word72,326,830,-309
.data
INPUT.copy"bandstop.inc";输入数据在数据区0x2400
OUTPUT.space1024;输出数据在数据区0x2500
DATABUF.usect"FIR_BFR",N
BOS.usect"STACK",0Fh
TOS.usect"STACK",1
.text
.asgAR4,DATA_P;数据x(n)缓冲区指针
.asgAR6,INBUF_P;模拟输入数据指针
.asgAR7,OUTBUF_P;FIR滤波器输出数据指针
_c_int00
bstart
nop
nop
start:
SSBxFRCT;小数乘法编程时,设置FRCT(小数方式)位
STM#DATABUF,DATA_P;数据缓冲区清零
RPTZA,N-1
STLA,*DATA_P+
FIR_TASK:
STM#DATABUF,DATA_P
STM#INPUT,INBUF_P
STM#OUTPUT,OUTBUF_P
STM#KS-1,BRC
RPTBLOOP-1
LD*INBUF_P+,A;装载输入数据
FIR_FILTER:
;FIR滤波运算
STLA,*DATA_P;输入样本值x(n)
STM#(DATABUF+N-1),DATA_P;数据缓冲区指针指向x[n-(N-1)]
RPTZA,N-1
MACD*DATA_P-,COEF_FIR,A;FIR滤波运算
MAR*DATA_P+;调整DATA_P指针指向DATABUF第一个单元
STHA,*OUTBUF_P+
LOOP:
EENDBEEND
.end
附:
FIR滤波器的命令文件
CMD文件的作用是DSP代码的定位
以低通为例,其他类似
lowpass.obj
-mlowpass.map
-olowpass.out
MEMORY
{
PAGE0:
ROM1(RIX):
ORIGIN=0080H,LENGTH=100H
PAGE1:
INTRAM1(RW):
ORIGIN=2400H,LENGTH=0200H
INTRAM2(RW):
ORIGIN=2600H,LENGTH=0100H
INTRAM3(RW):
ORIGIN=2700H,LENGTH=0100H
B2B(RW):
ORIGIN=0070H,LENGTH=10H
}
SECTIONS
{
.text:
{}>ROM1PAGE0
.data:
{}>INTRAM1PAGE1
COEF_FIR:
{}>INTRAM2PAGE1
FIR_BFR:
{}>INTRAM3PAGE1
STACK:
{}>B2BPAGE1
}
三:
IIR滤波器的设计
例:
设计一个采样频率Fs为8000Hz,输入信号频率为1000HZ与2500HZ与4000HZ的合成信号,通过设计IIR滤波器实现低通和高通功能。
实验原理
数字滤波器的输入x[k]和输出y[k]之间的关系可以用如下常系数线性差分
方程及其z变换描述:
系统的转移函数为:
设N=M,则传输函数变为:
转换成极零点表示为:
式中,jz表示零点,jp表示极点,它具有N个零点和N个极点,如果任何
极点在Z平面单位圆外,则系统不稳定。
如果系数bj全部为0,滤波器成为
非递归的FIR滤波器,这时系统没有极点,因此FIR滤波器总是稳定的。
对于
IIR滤波器,有系数量化敏感的缺点。
由于系统对序列施加的算法,是由加法、
延时和常系数乘三种基本运算的组合,所以可以用不同结构的数字滤波器来实
现而不影响系统总的传输函数。
四阶直接型IIR滤波器的结构
实验程序设计步骤
1.IIR滤波器的设计以及参数提取
通过MATLAB中的FDA工具导出正确的滤波器参数,需要注意的一点是:
设计IIR滤波器时,会出现一个或一个以上的系数大于等于1的情况,为了用Q15定点小数格式表示系数,可以用大数去除所有系数。
为避免在累加过程中出现大于等于一的情况,将系数进一步缩小,为此,在MATLAB中加入
二:
产生滤波器输入信号的程序
程序如下:
以下是一个产生输入信号的C语言程序,信号是频率为1000Hz、2500Hz和4000Hz的正弦波合成的波形:
#include
#include
voidmain()
{
inti;
doublef[256];
FILE*fp;
if((fp=fopen("in.inc","wt"))==NULL)
{
printf("can'topenfile!
\n");
return;
}
for(i=0;i<=255;i++)
{
f[i]=sin(2*3.14159*i*1000/16000)+sin(2*3.14159*i*2500/16000)+sin(2*3.14159*4000/16000);
fprintf(fp,".word%1d\n",(long)(f[i]*32768/3));
}
fclose(fp);
}
该文件会生成一个.inc的文件,由于比较冗长,在此不再赘述。
然后,在DSP汇编语言过.copy汇编命令将生成的数据文件iirin.inc复制到汇编程序中,作为IIR滤波器的输入数据。
此过程的作用相当于把信号通过了AD转换。
由此即可得到16位二进制数据表示的离散数据文件,即离散的三频谱叠加的正弦信号。
三:
编写滤波器的汇编源程序
(1)低通滤波器
*****************直接型IIR数字低通滤波器汇编程序iir.asm******************
.title"lowpass.asm"
.mmregs
.globalstart
.defstart,_c_int00
N.set8
.copy"iirin.inc";输入信号x(n)数据
table;IIR滤波器系数
.word1,-2,3,-2,3,-2,3,-2,1
.word-271,531,-623,476,-239,77,-14,1
.data
BN.usect"BN",N+1
AN.usect"AN",N+1
INBUF.usect"INBUF",256;输入缓冲区在数据区0x2400
OUTPUT.usect"OUTPUT",256;输入缓冲区在数据区0x2600
.text
.asgAR0,INDEX_P
.asgAR2,XN_P
.asgAR3,ACOFF_P
.asgAR4,YN_P
.asgAR5,BCOFF_P
_c_int00
bstart
nop
nop
start:
SSBXFRCT
SSBXOVM
SSBXSXM
STM#BN+N,AR1
RPT#N
MVPD#table,*AR1-;将bi由程序区存放到数据区
STM#AN+N-1,AR1
RPT#N-1
MVPD#table+N+1,*AR1-;将ai由程序区存放到数据区
STM#OUTPUT,AR1
RPTZA,#255
STLA,*AR1+;输出数据缓冲区清零
STM#INBUF,AR1
RPT#255
MVPD#INPUT,*AR1+;将输入数据由程序区存放到数据区
STM#OUTPUT,YN_P
STM#INBUF,XN_P
STM#N-1,INDEX_P
STM#255,BRC
RPTBLOOP-1
IIR:
SUBA,A
STM#BN,BCOFF_P
STM#AN,ACOFF_P
RPT#N-1;计算前向通道
MAC*XN_P+,*BCOFF_P+,A
MAC*XN_P,*BCOFF_P,A
MAR*XN_P-0;将AR2指针指向x(n-N)
RPT#N-1;计算反馈通道
MAC*YN_P+,*ACOFF_P+,A
STHA,*YN_P-0;保存y(n)
LOOP:
EENDBEEND
.end
(2)高通滤波器
*****************IIR数字高通滤波器汇编程序highpass.asm******************
.title"highpass.asm"
.mmregs
.globalstart
.defstart,_c_int00
N.set10
.copy"iirin.inc";输入信号x(n)数据
table;IIR滤波器系数
.word10,-68,229,-498,772,-891,772,-498,229,-68,10
.word-283,589,-833,875,-697,423,-191,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dsp 滤波 要点 说明