DSP大作业.docx
《DSP大作业.docx》由会员分享,可在线阅读,更多相关《DSP大作业.docx(28页珍藏版)》请在冰豆网上搜索。
DSP大作业
DSP大作业
无限冲激响应滤波器(IIR)算法及实现
姓名:
徐旭日
来越广泛。
数字滤波器是数字信号处理中最重要的组成部分之一,被广泛应用于语音图像处理、数字通信、谱分析、模式识别、自动控制等领域。
本课题通过软件设计IIR数字滤波器,并对所设计的滤波器进行仿真:
应用DSP集成开发环境—CCS调试程序,用TMS320F2812实现IIR数字滤波。
具体工作包括:
对IIR数字滤波器的基本理论进行分析和探讨。
应用DSP集成开发环境调试程序,用TMS320F2812来实现IIR数字滤波。
通过硬件液晶显示模块验证试验结果,并对相关问题进行分析。
关键词:
数字滤波器;DSP;TMS320F2812;无限冲激响应滤波器(IIR)。
引言:
随着数字化飞速发展,数字信号处理技术受到了人们的广泛关注,其理论及算法随着计算机技术和微电子技术的发展得到飞速发展,被广泛应用于语音图像处理、数字通信、谱分析、模式识别、自动控制等领域。
数字信号处理由于运算速度快,具有可编程的特性和接口灵活的特点,使得它在许多电子产品的研制、开发和应用中,发挥着重要的作用。
采用DSP芯片来实现数字信号处理系统是当前发展的趋势。
在数字信号处理中,数字滤波占有极其重要的地位。
滤波是信号处理中的一个重要概念。
滤波分经典滤波和现代滤波。
经典滤波的概念,是根据傅里叶分析和变换提出的一个工程概念。
根据高等数学理论,任何一个满足一定条件的信号,都可以被看成是由无限个正弦波叠加而成。
换句话说,就是工程信号是不同频率的正弦波线性叠加而成的,组成信号的不同频率的正弦波叫做信号的频率成分或叫做谐波成分。
只允许一定频率范围内的信号成分正常通过,而阻止另一部分频率成分通过的电路,叫做经典滤波器或滤波电路。
数字滤波是语音和图像处理、模式识别、谱分析等应用中的一个基本处理算法。
在许多信号处理应用中用数字滤波器替代模拟滤波器具有许多优势。
数字滤波器容易实现不同幅度和相位频率特性指标。
用DSP芯片实现数字滤波除具有稳定性好、精度高、不受环境影响外,还具有灵活性好的特点。
用可编程DSP芯片实现数字滤波可通过修改滤波器的参数十分方便的改变滤波器的特性。
原理:
1.无限冲激响应数字滤波器的基础理论。
利用模拟滤波器成熟的理论及其设计方法来设计IIR数字低通滤波器是常用的方法。
设计过程是:
按照数字滤波器技术指标要求一个过渡模拟低通滤波器
,再按照一定的转换关系将
转换成数字低通滤波器函数H(z)。
由此可见,设计的关键问题就是要找到这种关系,将s平面的
转换成z平面上的H(z)。
将系统函数
从s平面转换到z平面的方法有多种,但工程上常用的是脉冲响应不变法和双线性变换法。
在课题中我们采用双线性变换法设计IIR数字低通滤波器。
通过采用非线性频率压缩的方法,将整个模拟频率轴压缩到
/T之间,再用
Z=
转换到z平面上。
设
,s=j
,经过非线性频率压缩后用
,
=j
表示,这里用正切变换实现频率压缩:
实现了s平面上整个虚轴完全压缩到
平面上虚轴的
/T之间的转换。
由上式得到:
j
=
代人s=j
,
=j
,得到:
再通过z=
从
平面转换到Z平面得到
;
上面两式即称为双线性变换。
2.模拟滤波器原理(巴特沃斯滤波器、切比雪夫滤波器、椭圆滤波器、贝塞尔滤波器)。
3.数字滤波器系数的确定方法。
4.根据要求设计低通IIR滤波器
要求:
低通巴特沃斯滤波器在其通带边缘1kHz处的增益为-3dB,12kHz处的阻带衰减
为30dB,采样频率25kHz。
设计:
1确定数字低通滤波器的技术指标:
通带边缘频率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=2fstan(Ω/2)求得wp1和ws1,单位为弧度/秒。
wp1=2fstan(
p1/2)=6316.5弧度/秒
ws1=2fstan(
s1/2)=794727.2弧度/秒
-由已给定的阻带衰减-20log
s确定阻带边缘增益
s。
因为-20log
s=30,所以log
s=-30/20,
s=0.03162
计算所需滤波器的阶数:
n≥
=
=0.714
因此,一阶巴特沃斯滤波器的传输函数为:
H(s)=wp1/(s+wp1)=6316.5/(s+6316.5)
由双线性变换定义s=2fs(z-1)/(z+1)得到数字滤波器的传输函数为:
H(z)=
因此差分方程为:
y[n]=0.7757y[n-1]+0.1122x[n]+0.1122x[n-1]
软件流程图:
一、软件实现
1、实验准备
—设置软件仿真模式
—启动CCS
2、打开工程、浏览程序。
3、编译并下载程序
4、打开窗口:
*选择菜单View—>Graph->Time/Frequency…,进行如下设置
出现窗口如下:
选择菜单View->Graph->Time/Frequency…,进行如下设置:
出现窗口:
5、清除显示:
在以上打开的窗口中单击鼠标右键,选择弹出菜单中“ClearDisplay”功能。
6、设置断点:
在程序iir.c中有注释“/*请在此句上设置软件断点*/”的语句上设置软件断点
7、运行并观察结果
(1)选择“Debug”菜单中的“RUN”项,或按F5键运行程序。
(2)观察“IIR”窗口中时域图形:
观察滤波效果。
实验结果:
本次调试过程中出现了不少问题,但在辅导老师的指导下顺利完成IIR数字滤波实验。
软件调试结果如下图示:
输入波形为一个低频率的正弦波与一个高频率的余弦波叠加而成。
如图:
通过观察频域和时域图,得知:
输入信号为低频和高频叠加的信号,输入波形中的低频波形通过了滤波器,而高频部分则被衰减,从而达到了滤波的效果。
但是可以看出滤波后还是存在微弱的高频部分,也就是高频部分没有完全虑去,这从时域图中也可以看出。
二、IIR算法硬件实现
原理:
1、AD原理(上面已论述)
2、模数转换工作过程
—模数转换模块接到启动转换信号后,按照设置进行相应通道的数据采样转换。
—经过一个采样时间的延迟后,将采样结果放入AD数据寄存器中保存。
—等待下一个启动信号。
3、模数转换的程序控制
模数转换相对于计算机来说是一个比较缓慢的过程。
一般采用中断方式启动转换或保存结果,这样在CPU忙于其他工作时可以少占用处理时间。
设计转换程序应首先考虑处理过程如何与模数转换的时间相匹配,根据实际需要选择合适的触发转换的手段,也要能及时的保存结果。
4、混频波形的产生
将接收到的两路AD采样信号进行相加,并对结果的幅度进行限制,从而产生混合后的输出波形。
实验中采用了同相位混频的方法,也可修改程序完成异相混频法。
5、IIR滤波器工作原理及参数的计算参见实验七
6、说明:
本程序在AD中断中对AD进行连续采样。
由于需要进行实时混频,所以交替转换通道0(ADCIN0)和通道1(ADCIN1)。
混频的波形通过IIR滤波器,得到输出波形。
DSP开发板框图:
硬件框图:
一个DSP系统可分为最小系统设计和外围接口设计,DSP在必要的工作环境下才能正常工作。
DSP最小系统包括复位、时钟和电源电路。
程序流程图:
实验准备:
(1)连接实验设备
(2)准备信号源进行AD输入
用信号线连接实验箱左侧信号源的波形输出A端口和“A/D输入”模块的“ADCINO”插座注意插头要插牢、到底。
这样,信号源波形输出A的输出波形即可送到ICETEK—F2812A板的AD输入通道0。
用同样方法连接实验箱左侧信号源的输出B端口和“A/D输入”的“ADCIN1”相连。
设置波形输出A:
—向内侧按波形频率选择按钮,直到标有正弦波的指示灯亮。
—上下调节波形频率选择按钮,直到标有100—1KHZ的指示灯亮。
—调节幅值调整旋钮,将波形输出A的幅值调到适当位置。
设置波形输出B:
—向内侧按波形频率选择按钮,直到标有正弦波的指示灯亮。
—上下调节波形频率选择按钮,直到标有1K-10KHZ的指示灯亮。
—调节幅值调整旋钮,将波形输出A的幅值调到适当位置。
注意:
由于模数输入信号未经任何转换就进入DSP,所以必须保证输入的模拟信号的幅度在0-3V之间。
必须用示波器检测信号范围,保证最小值0V最大值3V,否则容易损坏DSP芯片的模数采集模块。
2、设置CodeComposerStudio2.21在硬件仿真(Emulator)方式下运行请参看本书第三部分、第一章、四、2。
3、启动CodeComposerStudio2.21
选择菜单Debug->ResetCPU。
4、打开工程文件
5、编译、下载程序,选择菜单Debug->GoMain,使程序运行到main函数入口位置。
6、观察窗口
-打开源程序IIR.c,查看源代码。
7、运行程序观察结果
按CTR控制板的K6键,实现滤波显示,K7键实现混频显示,按K8实现键A、B两信
号源分屏显示。
8、观察动态效果,调节信号源输出,观察滤波器输出
改变信号源输入的波形、频率参数,观察动态效果。
9、退出CCS。
程序算法分析:
①低通滤波器系数可滤掉1k以上的波形,保留1k一下的波形
FloatHn[IIRNUMBER]={0.126,0.085,0.000,-0.103,-0.189,-0.216,-0.155,-0.000,
0.233,0.504,0.756,0.935,1.000,0.935,0.756,0.504,0.233,-0.000,-0.155,-0.216,-0.189,-0.103,0.000,0.085,0.126}
这里是滤波器窗函数的参数,窗函数的长度为25,所以这是25个参数。
另外这里以1KHz作为分界点,如果需要滤出别的频率,就需要再计算参数了。
②floatIIR()
{
floatfSum;
fSum=0;
for(j=0;j{
fSum+=(fXn[j]*fHn[j]);
}
return(fSum);
}
这个是构造的IIR滤波器函数使用for循环输入波形与窗函数频域相乘,达到滤波效果。
硬件调试结果如下图(手机拍照):
按K8键:
A、B两信号源分别显示
按K7键:
混频显示
按K6键:
滤波显示
根据实验要求,改变信号源的频率:
这里高频信号为2KHz以上,所以需要选择相应的窗函数及滤波器。
按K8键:
A、B两信号源分别显示
按K7键:
混频显示
按K6键:
滤波显示
结果分析:
K8图显示的是高频和低频两个信号的波形,K7是他们叠加在一起的波形,K6则是通过低通滤波器后的波形。
通过无限冲激响应滤波器(IIR)算法的硬件实现与软件实现IIR算法相对比,所设计的IIR滤波器收到较好的效果,完成了设计要求。
这是用手机拍的图片,不是很清晰,但大致可以看得出来效果。
另外如果将软件实现结果与硬件实现结果相比较,基本是差不多的。
其实看起来实现起来简单,但还是费了些功夫的,首先是对信号发生器的调试,接着是对程序的修改,程序里面配有各种滤波器,所以需要找出我们需要的那个滤出1KHz以上的滤波器,由于我们对程序设计不是很专业,所以经过了多次修改调试,才对程序的大致框架有了一定的了解,最终才好不容易把程序调出来了。
学完《DSP原理与应用》课程的理论和实验后,自己的心得体会:
不觉间《DSP原理与应用》这门课程已经结束了,连实验也都上完了。
授课老师给了我很深的印象还有影响。
感觉老是上课很负责,也很会讲课,总能带着我们把握课程的主题框架,很多抽象难懂的知识老是都是很生动的给我们讲解,老是真的是用心良苦
还记得第一节课老是就讲了DSP这门课是我们专业的中心,把很多的课程都联系在了一起,现在觉得特别的有道理。
正是因为DSP涉及多门课程的相关知识,这就需要我们在课程的学习过程中,需要经常回顾一些基础理论知识,经过认真思考与分析,达到解决问题的目的。
在这个过程中,老是不断地给我们布置了很多课外作业,这些作业难度很大,所以我们花费了很多心思来做这些题目,我们不仅复习了以前的一些知识,并通过理论联系实际,对相关知识点有了更深层次的认识。
从课前复习相关实验内容、原理到课题论文的完成,此过程我收获特别多。
比如老师让我们用中断设计一个定时器,本来我们之前在《微机原理》和《单片机》都学过中断产生定时,但这一次才是应用,一到应用我们就发现很难了,在这期间对中断定时有了更加深刻的理解,还有C语言设计FFT算法的题目,本来学过了FFT算法,但要自己编程就很困难了。
老师这是在教我们要钻研知识,将知识学的活起来。
另外,在实验过程中,我们也深有体会。
带实验课的老师也很负责,每次都是按座位点名,确保每个人都按时到。
DSP开发板比单片机开发板复杂多了,用起来相对难些,实验过程中遇到很多问题老师都给我们耐心的解决了。
要感谢指导老师们,这些实验是在他们认真负责的态度下完成的。
他们在我们实验过程中给我们在软件操作和相关理论、算法上给了我们耐心的指导。
这门课结束了,确是我觉得大学所有课程中最精彩最重要的一门课程的,无论从课本还是从老师身上都学到了很多。
课本交给我许多DSP的理论知识,实验交给我如何简单的使用DSP开发板进行实验,而老师教给了我做事严谨认真、勤于实践的工作态度,做什么事情都是开头难,坚持学习的认真态度,这是非常重要的。
程序附录:
/********本实验可以滤掉650hz以后的信号,根据提供的滤波器参数,可以设置滤掉其他频率的波形******/
#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile
#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile
#include"f2812a.h"
#include"LCD.h"
#include"math.h"
#include"filter.h"
#defineADCNUMBER256
//定义指示灯寄存器地址和寄存器类型
#defineLBDS(*((unsignedint*)0xc0000))
//Prototypestatementsforfunctionsfoundwithinthisfile.
interruptvoidadc_isr(void);
voidDelay(unsignedintnDelay);
structstruLCDGraphstruGraph,struGraph1;
unsignedintnScreenBuffer[30*128];
//Globalvariablesusedinthisexample:
Uint16LoopCount;
Uint16ConversionCount;
//Uint16Voltage1[1024];
//Uint16Voltage2[1024];
Uint16Voltage_1,Voltage_2,flage=0;
Uint16nGraphBuf1[ADCNUMBER],nGraphBuf2[ADCNUMBER];
intnGraphBuf3[ADCNUMBER];
intci=0,keyflage,nAD;
Uint16nMixing[1024];
//液晶----------------------------------------------------------
#defineCTRLED(*(unsignedint*)0x108004)//port8004
#defineMCTRKEY(*(unsignedint*)0x108005)//port8005
#defineCTRCLKEY(*(unsignedint*)0x108006)//port8006
#defineCTRSTATUS(*(unsignedint*)0x108000)//port8000
#definepi3.1415926
intnModeAD;
Uint16ad1,ad2;
/*fir参数*/
#definePI3.1415926
//#defineFIRNUMBER25
/*低通滤波器系数可滤掉1k以上的波形,保留1k一下的波形*/
/*floatfHn[FIRNUMBER]={
0.126,0.085,0.000,-0.103,-0.189,-0.216,-0.155,
-0.000,0.233,0.504,0.756,0.935,1.000,0.935,0.756,
0.504,0.233,-0.000,-0.155,-0.216,-0.189,-0.103,
0.000,0.085,0.126
};*/
/*高通滤波器系数可滤掉1k以下的波形,保留1k以上的波形*/
/*floatfLn[FIRNUMBER]={
-0.031,-0.021,-0.000,0.025,0.047,0.054,
0.038,0.000,-0.058,-0.126,-0.189,-0.233,
1.000,-0.233,-0.189,-0.126,-0.058,0.000,
0.038,0.054,0.047,0.025,-0.000,
-0.021,-0.031
};*/
/*floatfXn[FIRNUMBER]={0.0};
floatfInput,fOutput;
floatfSignal1,fSignal2;
floatfStepSignal1,fStepSignal2;
floatf2PI;
floatfIn[ADCNUMBER],fOut[ADCNUMBER];
intnIn,nOut;
floatFIR();
floatFIR1();
floatInputWave();*/
intj=0,a=0;
/*低通滤波器系数,大约在2k以上的声音
被彻低率率调*/
#defineFIRNUMBER64
longfHn[FIRNUMBER]={
-26,
-26,
-24,
-18,
-8,
9,
33,
61,
91,
117,
132,
129,
99,
41,
-48,
-160,
-284,
-404,
-496,
-538,
-507,
-382,
-154,
180,
610,
1115,
1662,
2212,
2723,
3151,
3459,
3620,
3620,
3459,
3151,
2723,
2212,
1662,
1115,
610,
180,
-154,
-382,
-507,
-538,
-496,
-404,
-284,
-160,
-48,
41,
99,
129,
132,
117,
91,
61,
33,
9,
-8,
-18,
-24,
-26,
-26
};
//intfXn[FIRNUMBER]={0};
intfInput,fOutput;
intfIn[256];
//,fOut[256];
#defineFIR_ORDER50/*FilterOrder*/
/*CreateanInstanceofFIRFILT_GENmoduleandplacetheobjectin"firfilt"section*/
#pragmaDATA_SECTION(fir,"firfilt");
FIR16fir=FIR16_DEFAULTS;
/*DefinetheDelaybufferforthe50thorderfilterfilterandplaceitin"firldb"section*/
#pragmaDATA_SECTION(dbuffer,"firldb");
longdbuffer[(FIR_ORDER+2)/2];
/*DefineConstantCo-efficientArrayandplacethe.econst/.constsectionin
non-volatilememory*/
constlongcoeff[(FIR_ORDER+2)/2]=FIR16_LPF50;
voidinit(FIR16_handle);
voidcalc(FIR16_handle);
FIR16lpf,hpf;
FIR16lpf=FIR16_DEFAULTS;
FIR16hpf=FIR16_DEFAULTS;
main()
{intj,uWork,uWork1;
unsignedint*pWork;
InitSysCtrl();//初始化cpu
//InitPll(0x5);
DINT;//关中断
LCDTurnOff();
LCDSetScreenBuffer(nScreenBuffer);
for(uWork=0,pWork=nScreenBuffer;uWork<30*128;uWork++,pWork++)(*pWork)=0;
LCDSetDelay(0);
LCDTurnOn();//打开显示
LCDCLS();//清除显示内存
InitXintf();
InitPieCtrl();//初始化pie寄存器
IER=0x0000;//禁止所有的中断
IFR=0x0000;
InitPieVectTable();//初始化pie中断向量表
//Interruptsthatareusedinthisexamplearere-mappedto
//ISRfunctionsfoundwithinthisfile.
EALLOW;//ThisisneededtowritetoEALLOWprotectedregister
PieVectTable.ADCINT=&adc_isr;
EDIS;//Thisisneeded