IIR算法的软硬件实现
专业:通信工程 班级:一班 学号:20102420112
名字:李浩
摘要:
随着信息技术的发展,数字化时代已经到来,数字信号的处理逐步发展成为一门主流技术。滤波技术的发展,对信息处理技术的发展具有及其重要的作用,相对于模拟滤波器,数字滤波器没有漂移,能够处理低频信号,频率响应特性可做成非常接近于理想的特性,且精度可以达到很高,容易集成等这些优势决定了数字滤波器的应用越来越广泛,同时DSP数字信号处理器的出现也促进了数字滤波器的发展。本文论述了IIR数字滤波器的设计原理及其在DSP上的实现思路并对用DSP实现IIR滤波器的方法进行了分析。应用CCS软件调试C和汇编程序 并用TMS320F2812对IIR进行了仿真。
关键字:DSP TMS320F2812 IIR
引言:21世纪是数字化的时代,随着信息处理技术的飞速发展,
数字信号处理技术逐渐发展成为一门主流技术。相对于模拟滤波器,数字滤波器没有漂移,能够处理低频信号,频率特性可做成非常接近于理想的特性,且精度可以达到很高,容易集成等。这些优势决定数字滤波器的应用越来越广泛。数字滤波器是数字信号处理中最重要的组成部分之一,被广泛应用于语音图像处理、数字通信、谱分析、模式识别、自动控制等领域。
基于DSP的IIR滤波器设计课题背景:
随着集成电路技术的发展各种新型的大规模和超大规模集成电路不断涌现,集成电路技术与计算机技术结合在一起,使得数字信号处理系统的功能越来越强。数字信号处理技术逐渐发展成为一门主流技术,数字信号处理技术就是基于VLSI 技术和计算机技术发展起来的一门重要技术。DSP 技术已在通信、控制、信号处理、仪器
仪表、医疗、家电等很多领域得到了越来越广泛的应用。
数字滤波器在各种数字信号处理中发挥着十分重要的作用,用数字滤波器设计一直是信号处理领域的重要研究课题。常用的数字滤波器有IIR滤波器和FIR滤波器。其中IIR滤波器因具有结构简单、占用存储空间少、运算速度快、较高的计算精度和能够用较低的阶数实现、较好的选频特性等优点得到了广泛应用。
研究意义 :
滤波是信号处理中一种最基本但十分重要的技术。利用滤波可以从复杂的信号中提取所需的信号,抑制不需要的信号,在数字信号处理中,滤波占有极其重要的地位。数字滤波是通过数值运算的方法对输入信号进行滤波的数字信号处理过程,是语音和图象处理、模式识别、谱分析等应用中的一个基本的处理技术。与模拟滤波相比,数字滤波器是通过数值运算来实现滤波的,具有处理精度高、稳定可靠、集成度高、不存在阻抗匹配等优势,可以实现模拟滤波器无法实现的特殊滤波功能。
DSP由于运算速度快,具有可编程特性和接口灵活的特点,使得
它在许多电子产品的研制、开发和应用中发挥着重要的作用,采用DSP来实现信号处理系统是当前发展的趋势。用可编程 DSP 芯片实现数字滤波可通过修改滤波器的参数十分方便地改变滤波器的特性。因此,有必要对滤波器的设计方法进行研究理解其工作原理,优化设计方法,设计开发稳定性好的滤波器系统。将通过DSP 设计平台,实现较为重要的 FIR滤波器系统,实现能独立完成滤波功能的系统。从而通过本课题的研究,掌握滤波器的设计技术,为通信、信号处理
等
领域实用化数字滤波器设计提供技术准备。本科题的研究将为今后设计以 DSP 为核心部件的嵌入式系统集成提供技术准备,这不仅具有重要的理论意义,同时还具有重要的实际意义。
实验原理
1.无限冲激响应数字滤波器的基础理论。
2.模拟滤波器原理(巴特沃斯滤波器、切比雪夫滤波器、椭圆滤波器、贝塞尔滤波器)。
3.数字滤波器系数的确定方法。 4.根据要求设计低通IIR滤波器
要求:低通巴特沃斯滤波器在其通带边缘1kHz处的增益为-3dB,12kHz处的阻带衰减为30dB,采样频率25kHz。设计:
-确定待求通带边缘频率fp1Hz、待求阻带边缘频率fs1Hz和待求
阻带衰减-20logδsdB。
模拟边缘频率为:fp1=1000Hz,fs1=12000Hz 阻带边缘衰减为:-20logδs=30dB
-用Ω=2πf/fs把由Hz表示的待求边缘频率转换成弧度表示的数字频率,得到Ωp1和Ωs1。
Ωp1=2πfp1/fs=2π1000/25000=0.08π弧度 Ωs1=2πfs1/fs=2π12000/25000=0.96π弧度 -计算预扭曲模拟频率以避免双线性变换带来的失真。 由w=2fs tan(Ω/2)求得wp1和ws1,单位为弧度/秒。
wp1=2fs tan(Ωp1/2)=6316.5弧度/秒 ws1=2fs tan(Ωs1/2)=794727.2弧度/秒
-由已给定的阻带衰减-20logδs确定阻带边缘增益δs。
因为-20logδs=30,所以logδs=-30/20,δs=0.03162 -计算所需滤波器的阶数:
log(n11))log(1(0.03162)2s21)0.714)2log(s1p12log(794727.26316.5
因此,一阶巴特沃斯滤波器就足以满足要求。 -一阶模拟巴特沃斯滤波器的传输函数为: H(s)=wp1/(s+wp1)=6316.5/(s+6316.5)
由双线性变换定义s=2fs(z-1)/(z+1)得到数字滤波器的传输函数为:
H(z)500006316.5z1z16316.50.3346(1z10.3307z11)
因此,差分方程为:
y[n]=0.3307y[n-1]+0.3346x[n]+0.3346x[n-1]
硬件框图:
液晶显示模块PcTMS320F2812信号源发生模块时钟电路电源电路复位电路
程序流程图:
调试过程与步骤: 一、 软件实现
1.实验准备
-设置软件仿真模式。 -启动CCS
2.打开工程,浏览程序,工程目录为D:\\dsp\6\\iir\\iir.pjt 3.编译并下载程序
4.打开观察窗口:*选择菜单View->Graph->Time/Frequency…,
进行如下设置:
*选择菜单View->Graph->Time/Frequency…,进行如下设置:
5.清除显示:在以上打开的窗口中单击鼠标右键,选择弹出式菜单中“Clear Display”功能。
6.设置断点:在程序iir.c中有注释“/* 请在此句上设置软件断点 */”的语句上 置软件断点。
7.运行并观察结果
⑴选择“Debug”菜单的“RUN”项,或按F5键运行程序。
⑵观察“IIR”窗口中时域图形;观察滤波效果。 实验结果
输入波形为一个低频率的正弦波与一个高频的余弦波叠加而成。如图:
通过观察频域和时域图,得知:输入波形中的低频波形通过了滤波器,而高频部分则被衰减。
附IIR算法相对应C语言编程及汇编程序
/*===========================================
=============================================*/
#include \"DSP281x_Device.h\" // DSP281x Headerfile Include File #include \"DSP281x_Examples.h\" // DSP281x Examples Include File #include \"f2812a.h\" #include\"math.h\"
#define IIRNUMBER 2 #define SIGNAL1F 1000 #define SIGNAL2F 4500 #define SAMPLEF 10000 #define PI 3.1415926
floatInputWave(); float IIR();
floatfBn[IIRNUMBER]={ 0.0,0.7757 }; floatfAn[IIRNUMBER]={ 0.1122,0.1122 }; floatfXn[IIRNUMBER]={ 0.0 }; floatfYn[IIRNUMBER]={ 0.0 }; floatfInput,fOutput; float fSignal1,fSignal2; float fStepSignal1,fStepSignal2; float f2PI; 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(); fOut[nOut]=fOutput; nOut++; if ( nOut>=256 ) { }
nOut=0;
/* 请在此句上设置软件断点 */
}
}
floatInputWave() { } float IIR() {
for ( i=IIRNUMBER-1;i>0;i-- ) { }
fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0; fYn[0]=0.0;
fSignal1+=fStepSignal1; if ( fSignal1>=f2PI )
fSignal1-=f2PI;
fXn[i]=fXn[i-1]; fYn[i]=fYn[i-1];
fSignal2+=fStepSignal2; if ( fSignal2>=f2PI ) return(fXn[0]);
fSignal2-=f2PI;
}
floatfSum; fSum=0.0;
for ( i=0;i fSum+=(fXn[i]*fAn[i]); fSum+=(fYn[i]*fBn[i]); /*========================================*/ IIR: ADDB SP,#4 MOVB AH,#0 MOVB AL,#0 MOVL *-SP[4],ACC MOVW DP,#0xFE00 MOV @0,#0 MOV AL,@0 CMPB AL,#2 SB L7,GEQ L6: SETC SXM MOVL XAR4,#0x3F8016 MOV ACC,@0 << 1 ADDL @XAR4,ACC MOVL ACC,*+XAR4[0] MOVL *-SP[2],ACC MOVL MOV ADDL MOVL LCR MOVL MOVL LCR MOVL SETC MOVW MOV MOVL ADDL MOVL MOVL MOVL XAR4,#0x3F8012 ACC,@0 << 1 @XAR4,ACC ACC,*+XAR4[0] FS$$MPY *-SP[2],ACC ACC,*-SP[4] FS$$ADD *-SP[4],ACC SXM DP,#0xFE00 ACC,@0 << 1 XAR4,#0x3F801E @XAR4,ACC ACC,*+XAR4[0] XAR4,#0x3F801A *-SP[2],ACC MOV ACC,@0 << 1 ADDL @XAR4,ACC MOVL ACC,*+XAR4[0] LCR FS$$MPY MOVL *-SP[2],ACC MOVL ACC,*-SP[4] LCR FS$$ADD MOVL *-SP[4],ACC MOVW DP,#0xFE00 INC @0 MOV AL,@0 CMPB AL,#2 SB L6,LT L7: MOVL ACC,*-SP[4] SUBB SP,#4 LRETR /*====================================== =======================================*/ 二、IIR算法硬件实现 1.实验准备 ⑴连接实验设备。 ⑵准备信号源进行AD输入。 ①取出2根实验箱附带的信号线(如右图,两端均为单声道语音插头)。 ②用1根信号线连接实验箱左侧信号源的波形输出A端口和“A/D输入”模块的“ADCIN0”插座注意插头要插牢、到底。这样,信号源波形输出A的输出波形即可送到ICETEK-F2812A板的AD输入通道0。 ③用1根信号线连接实验箱左侧信号源的波形输出B端口和“A/D输入”模块的“ADCIN1”插座注意插头要插牢、到底。这样,信号源波形输出B的输出波形即可送到ICETEK-F2812A板的AD输入通道1。 ④设置波形输出A: -向内侧按波形频率选择旋钮,直到标有正弦波的指示灯点亮。 -上下调节波形频率选择旋钮,直到标有100-1KHz的指示灯点亮。 -调节幅值调整旋钮,将波形输出A的幅值调到适当位置。 ⑤设置波形输出B: -向内侧按波形频率选择旋钮,直到标有正弦波的指示灯点亮。 -上下调节波形频率选择旋钮,直到标有1K-10KHz的指示灯点亮。 -调节幅值调整旋钮,将波形输出B的幅值调到适当位置。 注意:由于模数输入信号未经任何转换就进入DSP,所以必须保证输入的模拟信号的幅度在0-3V之间。必须用示波器检测信号范围,保证最小值0V最大值3 V,否则容易损坏DSP芯片的模数采集模块。 2.设置Code Composer Studio 2.21在硬件仿真(Emulator)方式下运行 3.启动Code Composer Studio 2.21 选择菜单Debug->Reset CPU。 4.打开工程文件 工程目录:D:\\dsp\7\\mixerfir\\mixerfir.pjt 5.编译、下载程序,选择菜单Debug->Go Main,使程序运行到main函数入口位置。 6.观察窗口 -打开源程序IIR.c,查看源代码。 7.运行程序观察结果 按CTR控制板的K6键,实现滤波显示,K7键实现混频显示,按K8实现键A、B两信号源分屏显示。 8.观察动态效果,调节信号源输出,观察滤波器输出 改变信号源输入的波形、频率参数,观察动态效果。 9.退出CCS 实验结果 按CTR控制板的K6键,实现滤波显示,K7键实现混频显示,按K8实现键A、B两信号源分屏显示。本实验是低通滤波,按K6键后将信号源B的波形滤掉 按CTR控制板的K6键后,液晶屏上显示如下图所示: 按 CTR 控制板的 K7 键后,显示下图: 按CTR控制板的K8键后,显示如下图: 结果分析 通过无限冲激响应滤波器(IIR)算法的硬件实现与软件实现IIR算法相对比,所设计的IIR滤波器收到较好的效果,完成了设计要求。 心得体会: 在老师认真负责的指导下,顺利地完成了关于DSP芯片TMS320F2812的八个实验,并从中学到了很多。老师以前曾给我们讲DSPs芯片及DSP系统与信息类专业的一些课程有许多联系,以及DSP本身的许多特点。但是由于以前的学习只停留在理论知识阶段,因此并不能理解老师所讲的内容,感觉很抽象,不知道从何处入手,但随着课程学习逐渐接近尾声,与此同时开始的实践实验,才逐渐深入全面的了解DSP,理论水平得到了一定程度的提高,同时更加神话了时间在学习当中的重要性。 DSP设计涉及到多门课程的相关知识,是我们之前学习的那么多课程的一个大的综合,这需要我们在课程的学习过程中,经常回顾一些基础理论知识,经过认真思考与分析,达到解决问题的目的。在这个过程中,我们不仅复习了以前的一些知识,并且通过理论联系实际, 对相关知识点有了更深层次的认识。从课前复习相关实验内容、原理到课题论文的完成,我收获了很多,学到了很多,受益匪浅。在这个过程中,我复习了数字滤波器的原理和设计方法,对DSP编程有了更深的认识和掌握了一定的编程能力。同时感觉收获最大,同时也是学习到最多的可能就是编程能力的提高了,不管是C语言的编程能力,还是基于汇编的dsp编程能力相较于从前,在实践的指引下,得到了很大程度的提高,当然受时间所限,目前的学习还停留在比较肤浅的状态,在以后的慢慢学习生涯当中还要继续更加深入的学习。 如果用一句话来概括本学期dsp学习的心得,那就是“必须注意实践与理论的结合,多动手。”绝对不能只停留在理论阶段,眼高手低,尤其对于dsp这种实践性很强的课程。 因篇幅问题不能全部显示,请点此查看更多更全内容