无限冲激响应滤波器IIR算法硬件实现DSP论文.docx
《无限冲激响应滤波器IIR算法硬件实现DSP论文.docx》由会员分享,可在线阅读,更多相关《无限冲激响应滤波器IIR算法硬件实现DSP论文.docx(21页珍藏版)》请在冰豆网上搜索。
无限冲激响应滤波器IIR算法硬件实现DSP论文
摘要
20世纪60年代以来,随着大规模集成电路、数字计算机等信息技术的飞速发展,数字信号处理(DigitalSignalProcessing,DSP)技术应运而生并得到快速发展。
在过去的20多年时间里,DSP在理论和应用方面不断地进步和完善,在越来越多的应用领域中迅速取代传统的模拟信号处理方法,并开辟出出许多新的应用领域。
目前数字信号处理技术已经在通信、雷达、航空航天、工业控制、生物医学控制、生物医学工程、网络及家电领域得到极为广泛的应用,数字化时代正在到来。
1928年,美国德州仪器公司(TexasInstrumentsIncorporation,简称TI公司)推出该公司的第一款DSPs芯片,很快DSPs芯片就以其数字器件特有的稳定性、可重复性、可大规模集成和易于实现DSP算法等优点,为数字信号处理技术带来了更大的发展和应用前景。
采用各种类型DSPs实现系统的数字化处理和控制已经成为未来发展的趋势,并且睡着DSPs运算能力的不断提高,数字信号处理的研究重点由最初的非实用转向高速实时应用。
本文主要是应用TI公司生产的一款芯片TMS320F2812DSPs来实现无限冲击响应滤波器(IIR)算法。
本文的主要工作可归结如下:
1、介绍无限冲激响应滤波器(IIR)实现的原理。
2、详细分析无限冲激响应滤波器(IIR)算法。
3、画出无限冲激响应滤波器(IIR)实现的硬件框图及软件流程图。
4、实验调试过程及步骤。
5、分析在CCS软仿真及硬仿真环境下实验结果。
6、反汇编一个小程序及对DSPs实现IIR算法理解。
7、对学习DSPs理论课及做实验的心得体会。
通过软件仿真及硬件实现结果表明,用DSPs实现无限冲激响应滤波器(IIR)算法能够很好的达到预期的效果。
关键词:
IIR,,DSPs,无限冲激响应,CCS,滤波器
引言
硬件实现无限冲激响应滤波器(IIR)算法有多种方法,本文介绍用TI公司生产的一款芯片TMS320F2812DSPs来实现无限冲激响应滤波器(IIR)算法,其中涉及无限冲激响应滤波器(IIR)算法软件仿真和硬件实现。
通过实验分析,我们可以看出实验结果和理论结果符合的很好,因此MS320F2812DSPs可以很好的实现无限冲激响应滤波器的滤波特性。
实验原理
1、无限冲激响应数字滤波器的理论基础。
2、模拟滤波器原理(巴特沃斯滤波器、切比雪夫滤波器、椭圆滤波器、贝赛尔滤波器)。
3、数字滤波器系数的确定方法。
4、根据要求设计低通IIR滤波器
要求:
低通巴特沃斯滤波器在其通带边缘1kHz处的增益为-3dB,12kHz处的阻带衰减为30的dB,采样频率25kHz。
设计:
-确定待求通带边缘频率fp1Hz、待求阻带边缘频率fs1Hz和待求阻带衰减-20logδsdB。
模拟边缘频率为:
fp1=1000kHz,fs1=12000kHz,阻带边缘衰减为:
-20logδsdB=30dB。
-用Ω=2лf/fs把由Hz表示的待求边缘频率转换成弧度表示的数字频率,得到Ωp1,Ωs1
Ωp1=2лfp1/fs1=2л1000/25000=0.08л弧度
Ωs1=2лfs1/fs=2л12000/25000=0.96л弧度
-计算预扭曲线模拟频率以避免双线性变换带来的失真。
由w=2fstan(Ω/2)求得wp1和ws1,单位为弧度/秒
wp1=2fstan(Ωp1/2)=6316.5弧度/秒
ws1=2fstan(Ωs1/2)=794727.2弧度/秒
-由已给定的阻带衰减-20logδsdB确定阻带边缘增益δs。
因为-20logδsdB=30dB,所以logδs=-30/20,δs=0.03162
-计算所需滤波器阶数:
因此,一阶巴特沃斯滤波器就满足要求。
-一阶巴特沃斯滤波器的传输函数为:
H(s)=wp1/(s+wp1)=6316.5/(s+6316.5)
有双线性变换定义s=2fs(z-1)/(z+1)得到的数字滤波器的传输函数为:
因此,差分方程为:
y[n]=0.7757y[n-1]+0.1122x[n]+0.1122x[n-1].
硬件框图
因此,差分方程为:
y[n]=0.7757y[n-1]+0.1122x[n]+0.1122x[n-1].
硬件框图
F2812-A评估板原理图
实验中用到的主要硬件模块
软件流程图
调试过程和步骤
1.实验准备
(1)连接实验设备。
(2)准备信号源进行AD输入。
1)取出2根实验箱附带的信号线。
2)用1根信号线连接实验箱左侧信号源的波形输出A端口和“A/D输入”模块的“ADCIN0”插座,注意插头要插牢、到底。
这样,信号源波形输出A的输出波形即可送到ICETEK-F2812A板的AD输入通道0.
3)用1根信号线连接实验箱左侧信号源的波形输出B端口和“A/D输入”模块的“ADCIN1”插座,注意插头要插牢、到底。
这样,信号源波形输出A的输出波形即可送到ICETEK-F2812A板的AD输入通道1.
4)设置波形输出A:
-向内侧按波形频率选择按钮,直到标有正弦波的指示灯亮。
-上下调节波形频率选择按钮,直到标有100-1KHz的指示灯亮。
-调节幅值调整旋钮,将波形输出A的幅值调到适当位置。
5)设置波形输出B:
-向内侧按波形频率选择按钮,直到标有正弦波的指示灯亮。
-上下调节波形频率选择按钮,直到标有1K-10KHz的指示灯亮。
-调节幅值调整旋钮,将波形输出B的幅值调到适当位置。
注意:
由于模数输入信号未经任何转换就进入DSP,所以必须保证输入的模拟信号的幅度在0—3V之间。
必须用示波器检测信号范围,保证最小值0V,最大值3V,否则容易损坏DSP芯片的模数采集模块。
2.设置CodeComposerStudio2.21在硬仿真(Emulator)方式下运行。
3.启动CodeComposerStudio2.21
选择菜单Debug->ResetCPU。
4.打开工程文件
工程目录:
D:
\dsp\t8\mixeiir\mixeriir.pjt
5.编译、下载程序,选择菜单Debug->GoMain,使程序运行到main函数的入口位置。
6.观察窗口
-打开IIR.c,查看源代码。
7.观察程序运行结果
按CTR控制板的K6键,实现滤波显示,K7键实现混频显示,按K8键实现A、B两信号源分屏显示。
8.观察动态效果,调节信号源输出,观察滤波器输出,改变信号源输入的波形、频率参数,观察动态效果。
9.退出CCS。
实验结果
一、软仿真环境下的实验结果
1.作如下设置及得到的波形图
图1
2.作如下设置得到的波形图
图2
3.作如下设置得到的波形图
图3
4.作如下设置得到的波形图
图4
4.把四幅图片放着一起比较如下
图5
二、硬仿真环境下的实验结果
1.按CTR控制板的K6键观察到的波形
图6
2.按K7键观察到的波形
图7
3.按K8键观察到的波形
图8
实验结果分析
1.软仿真结果分析
--图1是信号经过调制后的模型,毛刺代表其高频分量。
--图3是图1中信号的频域图形,从频域可以看出,其频谱既含有低频分量,又含有高频分量。
--图2调制信号经过无限冲击响应滤波器(IIR)滤波之后得到的波形。
--图4图2中信号的频域图形,从频域可以看出,经过无限冲击响应滤波器(IIR)滤波之后只剩下低频分量,高频分量几乎衰减为0。
--图5把四幅图放在一块比较,可以显而易见的看出图形滤波前后的差别,经比较可以看出,在软仿真条件下,用TMS320F2812DSPs来实现的无限冲击响应滤波器(IIR)具有较好的滤波性能。
2.硬仿真结果分析
--图6上面为低频信号,下面为高频信号。
--图7为两信号相乘的结果,即调制的结果。
--图8为调制信号经无限冲击响应滤波器(IIR)的结果。
比较图6和图8我们可以发现,两图的波形几乎完全相同,由此我们可以得出如下结论:
用TMS320F2812DSPs来实现的无限冲击响应滤波器(IIR)具有较好的滤波性能。
程序算法分析及反汇编
1、根据自己的理解,给iir.c程序添加备注
#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile
#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile
#include"f2812a.h"
#include"math.h"
#defineIIRNUMBER2
#defineSIGNAL1F1000
#defineSIGNAL2F4500
#defineSAMPLEF10000
#definePI3.1415926
floatInputWave();
floatIIR();
floatfBn[IIRNUMBER]={0,0.7757};//定义差分方程y(n)系数,并赋值
floatfAn[IIRNUMBER]={0.1122,0.1122};//定义差分方程x(n)的系数,并赋值
floatfXn[IIRNUMBER]={0.0};//定义输入序列
floatfYn[IIRNUMBER]={0.0};//定义输出序列
floatfInput,fOutput;//定义输入,输出
floatfSignal1,fSignal2;
floatfStepSignal1,fStepSignal2;//定义第一路信号周期,第二路信号周期
floatf2PI;//定义2*pi
inti;
floatfIn[256],fOut[256];
intnIn,nOut;
main(void)
{
nIn=0;nOut=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=PI*0.1;
//fStepSignal1=2*PI/30;
//fStepSignal2=2*PI*1.4;
fStepSignal1=2*PI/50;//第一路信号周期
fStepSignal2=2*PI/2.5;//第二路信号周期
while
(1)
{
fInput=InputWave();//输入波形
fIn[nIn]=fInput;
nIn++;nIn%=256;
fOutput=IIR();//IIR滤波
fOut[nOut]=fOutput;//输出波形
nOut++;
if(nOut>=256)
{
nOut=0;/*请在此句上设置软件断点*/
}
}
}
floatInputWave()//输入波形函数
{
for(i=IIRNUMBER-1;i>0;i--)
{
fXn[i]=fXn[i-1];
fYn[i]=fYn[i-1];
}
fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;
fYn[0]=0.0;
fSignal1+=fStepSignal1;//低频信号
if(fSignal1>=f2PI)fSignal1-=f2PI;
fSignal2+=fStepSignal2;//高频信号
if(fSignal2>=f2PI)fSignal2-=f2PI;
return(fXn[0]);//返回调制信号
}
floatIIR()
{
floatfSum;
fSum=0.0;
for(i=0;i{
fSum+=(fXn[i]*fAn[i]);//本程序的算法所在,在此实现滤波
fSum+=(fYn[i]*fBn[i]);//本程序的算法所在,在此实现滤波
}
return(fSum);
}
2、本实验实现滤波的算法就是:
y[n]=0.7757y[n-1]+0.1122x[n]+0.1122x[n-1].
通过此算法可以滤去信号的高频分量。
3、自己对照着C语言写的汇编语言小程序
4、实现算法(fSum+=(fXn[i]*fAn[i]);fSum+=(fYn[i]*fBn[i]);)的汇编语言:
IIR:
ADDBSP,#4
MOVBAH,#0
MOVBAL,#0
MOVL*-SP[4],ACC
MOVWDP,#0xFE00
MOV@0,#0
MOVAL,@0
CMPBAL,#2
SBL7,GEQ
L6:
SETCSXM
MOVLXAR4,#0x3F8016
MOVACC,@0<<1
ADDL@XAR4,ACC
MOVLACC,*+XAR4[0]
MOVL*-SP[2],ACC
MOVLXAR4,#0x3F8012
MOVACC,@0<<1
ADDL@XAR4,ACC
MOVLACC,*+XAR4[0]
LCRFS$$MPY
MOVL*-SP[2],ACC
MOVLACC,*-SP[4]
LCRFS$$ADD
MOVL*-SP[4],ACC
结束语——心得体会
这学期学习了王院长教授DSP原理与应用技术这本书,收获很多。
DSP对我们来说是一门新的知识,是一门综合性很强的专业课程,觉得它学起来应该不是很容易。
这门课一开始,王院长就告诉我们如何学习这门课,因为这门课对我们来说比较陌生,是一门全新的课。
王院长给我们说DSPs是一门实践性很强的课,学生往往在学习过程中和实际开发过程相脱节,因此对DSPs的一些基本概念只停留在文字的解释上,形不成系统的概念,无法与实践的电路相联系。
王院长告诉我们初学者学习这门课时应该把基本概念、逻辑概念、物理概念相互联系起来,学会三者之间的对应。
由于DSPs涉及的内容很多,王院长告诉我们要学会框架是的学习方法,所谓框架是的学习方法,就是要抓住课程主要的知识点,不要一开始就陷入众多的寄存器、汇编指令及片内外设的具体应用中,而应该先掌握DSPs芯片的主要知识体系,切实掌握仿真、实时性、系统等概念的内涵。
在课程学习过程中我体会到,只有按照王院长所说的学习方法才能跟上课的进度,因为书上的内容太多,不可能全部记着,只有主要的知识体系才能掌握。
理论课程结束之后,我们紧接着就开始了实验课。
因为DSPs是一门实践性很强的课程,所以实验课对我们来说是很重要的。
我们一共做了八个实验,在这八个实验的过程中收获了不少经验教训。
我们实验用的软件是CCS,硬件是DSP实验箱。
在做实验过程中一定的看清实验步骤严格按实验步骤操作,不然很轻则造成不必要的麻烦,重则可能导致实验设备的损坏。
做完八个试验后,我的体会是,在做每个实验之前,最好把实验内容看一遍,弄明白实验原理,熟悉实验步骤,这样做实验室才能做到有的放矢。
在软仿真环境下做的实验,有时间的话可以在宿舍先做一遍,在做的过程中如果遇到不能解决的问题,在实验室做实验的时候可以向助教请教解决。
即使在宿舍做实验没有遇到问题,对我们来说也是有好处的,因为在宿舍已经做过一遍,所以在实验室我们可以轻车熟路的做下去,快速的做完规定的实验,剩余的时间我们可以看你做过实验的程序,争取在实验室里把程序给看明白。
在实验室看程序好处多多,当遇到不懂的语句时,我们可以请教助教,如果在其他地方看程序,恐怕就没用这么好的条件了。
做硬仿真实验时,由于宿舍没有试验箱,我们不可能在宿舍做,所以在做硬仿真实验之前,我们一定要做好预习准备工作,在实验过程中要做到细致、小心,因为实践操作是一个很严谨过程,任何一个步骤出现问题,也许就得必须重新开始,这样会很浪费实验时间的。
在实验室中有这个小体会,有时候程序出现问题没办法解决时,可以重启电脑,因为实验室D盘是受保护的,重启后会恢复原来状态,重启后接着做就没事了。
做实验难免要的循规蹈矩、认认真真的的做,开始我觉得实验会很枯燥,但后来发现不是这样的,只要深入进去做,做实验还是有很多乐趣的。
举一个例子来说明,在实验4中第三个小实验是液晶显示器控制现实的实验。
我做到这个实验后,看了一下源程序,发现源程序还是比较容易的,就想尝试着自己在液晶显示器上画点儿东西。
于是我就利用程序里的画直线的函数,修改程序。
先画了一个简单的“十”,看到“十”显示在液晶显示器上上,感觉很兴奋,就又想画一个笑脸,又画了一个“十”字作为眼睛,当两个“十”字成功的显示在液晶显示器上时,感觉我们离成功仅有一步之遥了,我们再接再厉,为笑脸画起“嘴”来,修改程序运行之后,发现和预想的效果不大一样,我们开始找问题,当找到问题,准备重新修改程序时,实验的时间结束了。
虽然没有达到要的效果,但能通过自己改程序,显示出一定的东西,还是觉得很有成就感的。
总之,在学习DSPs理论课和实验中获得了许多东西,有乐趣,有经验,有教训……。
学习理论课教会了我学习这类课的学习方法。
在实验使我对课本上所学的有关DSPs的知识有了更进一步的认识,提高了我的实验技能,锻炼了我的动手能力;更重要的是经过实验课,我体会到做什么事都要有耐心,都要认真做,在实验中如果粗心大意,一个实验花很长时间也不一定能做出来,如果静下心来认真做,很多时候实验可以很快的做出来,因此,在做实验使我感悟到作风严谨,做事细心的重要性。