DSP实验报告.docx
《DSP实验报告.docx》由会员分享,可在线阅读,更多相关《DSP实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
DSP实验报告
实验名:
对模拟信号进行A/D转换和FFT变换
专业班级:
电子信息工程0802
姓名:
学号:
指导老师:
信息科学与工程学院
二零一一年六月
目录
1实验目的3
2实验开发环境3
3实验设备3
4实验原理4
5实验源程序5
6实验结果及分析10
7实验总结13
一、实验目的
在数字信号处理系统中,FFT作为一个非常重要的工具经常使用,甚至成为DSP运算能力的一个考核因素。
FFT是一种高效实现离散傅里叶变换算法。
离散傅式变换的目的是吧信号由时域变换到频域,从而在频域分析处理信息,得到的结果再由傅式变换到时域。
本实验的目的在于学习FFT算法,及其在TMS320C55X上的实现,并通过编程掌握C55X的存储管理、辅助寄存器的使用、位倒序寻址方式等技巧,同时联系使用CCS的探针和图形工具,你可以使用DSP/BIOS提供的分析工具评估FFT代码执行情况。
本实验通过AD转换把信号进行转换,对转换的信号进行FFT处理。
1.掌握VC5509A片内AD的控制方法。
2.掌握用窗函数法设计FFT快速傅里叶的原理和方法。
3.熟悉FFT快速傅里叶特性。
4.了解各种窗函数对快速傅里叶特性的影响。
二、实验开发环境
1.通用PC机一台,安装Windows2000或WindowsXP操作系统且已安装常用软件(如:
WinRAR等)。
2.TMS320C55xx评估板及相关电源。
本实验采用ICETEK-VC5509-A评估板。
3.通用DSP仿真器一台及相关连线。
本实验采用ICETEK-5100USB仿真器。
4.控制对象(选用)。
本实验采用ICETEK-CTR控制板。
5.TI的DSP开发集成环境CodeComposerStudio。
本实验采用CCS2.21for’C5000。
6.仿真器驱动程序。
7.实验程序及相关文档。
三、实验设备
通用计算机一台,ICETEK-VC5509-EDU实验箱。
四、实验原理
1.将从信号源获取的模拟信号经过A/D转换后,再进行FFT变换,然后输出。
2.TMS320VC5509A模数转换模块特性:
内置采样和保持的10位模数转换模块ADC,最小转换时间为500ns,最大采样率为21.5kHz。
有2个模拟输入通道(AIN0—AIN1)。
采样和保持获取时间窗口有单独的预定标控制。
3.模数转换工作过程:
模数转换模块接到启动转换信号后,开始转换第一个通道的数据。
经过一个采样时间的延迟后,将采样结果放入转换结果寄存器保存。
转换结束,设置标志。
等待下一个启动信号。
4.模数转换的程序控制:
模数转换相对于计算机来说是一个较为缓慢的过程。
一般采用中断方式启动转换或保存结果,这样在CPU忙于其他工作时可以少占用处理时间。
设计转换程序应首先考虑处理过程如何与模数转换的时间相匹配,根据实际需要选择适当的触发转换的手段,也要能及时地保存结果。
由于TMS320VC5509ADSP芯片内的A/D转换精度是10位的,转换结果的低10位为所需数值,所以在保留时应注意将结果的高6位去除,取出低10位有效数字。
5.FFT的原理和参数生成公式:
FFT并不是一种新的变换,它是离散傅立叶变换(DFT)的一种快速算法。
由于我们在计算DFT时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。
每运算一个X(k)需要4N次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。
所以整个DFT运算总共需要4N^2次实数乘法和N*2(2N-1)=2N(2N-1)次实数加法。
如此一来,计算时乘法次数和加法次数都是和N^2成正比的,当N很大时,运算量是可观的,因而需要改进对DFT的算法减少运算速度。
根据傅立叶变换的对称性和周期性,我们可以将DFT运算中有些项合并。
我们先设序列长度为N=2^L,L为整数。
将N=2^L的序列x(n)(n=0,1,……,N-1),按N的奇偶分成两组,也就是说我们将一个N点的DFT分解成两个N/2点的DFT,他们又重新组合成一个如下式所表达的N点DFT:
一般来说,输入被假定为连续的。
当输入为纯粹的实数的时候,我们就可以利用左右对称的特性更好的计算DFT。
我们称这样的RFFT优化算法是包装算法:
首先2N点实数的连续输入称为“进包”。
其次N点的FFT被连续运行。
最后作为结果产生的N点的合成输出是“打开”成为最初的与DFT相符合的2N点输入。
使用这一思想,我们可以划分FFT的大小,它有一半花费在包装输入O(N)的操作和打开输出上。
这样的RFFT算法和一般的FFT算法同样迅速,计算速度几乎都达到了两次DFT的连续输入。
6.程序流程图:
A/D转换模型流程图
FFT变换流程图
五、实验源程序
实验相关文档处有以下文件的源代码:
5509.h、C5509.h、c55xxdefs.h、func.h、myapp.h、ICETEK-VC5509-EDU.h、peripherals.h、scancode.h、util.h、sdram_init.c、util.c、ICETEK-VC5509-A.cmd。
ad.h的源代码:
voidInitADC();
voidwait(unsignedintcycles);
voidInitADC()
{
ADCCLKCTL=0x23;//4MHzADCLK
ADCCLKDIV=0x4f00;
}
voidwait(unsignedintcycles)
{
inti;
for(i=0;i}
AD_FFT.h的源代码
#include
#definePI3.1415926
#defineSAMPLENUMBER128
floatw[SAMPLENUMBER];
floatsin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER];
voidFFT(floatdataR[SAMPLENUMBER],floatdataI[SAMPLENUMBER]);
voidInitForFFT();
voidFFT(floatdataR[SAMPLENUMBER],floatdataI[SAMPLENUMBER])
{
intx0,x1,x2,x3,x4,x5,x6,xx;
inti,j,k,b,p,L;
floatTR,TI,temp;
/**********followingcodeinvertsequence************/
for(i=0;i{
x0=x1=x2=x3=x4=x5=x6=0;
x0=i&0x01;x1=(i/2)&0x01;x2=(i/4)&0x01;x3=(i/8)&0x01;x4=(i/16)&0x01;x5=(i/32)&0x01;x6=(i/64)&0x01;
xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;
dataI[xx]=dataR[i];
}
for(i=0;i{
dataR[i]=dataI[i];dataI[i]=0;
}
/**************followingcodeFFT*******************/
for(L=1;L<=7;L++)
{/*for
(1)*/
b=1;i=L-1;
while(i>0)
{
b=b*2;i--;
}/*b=2^(L-1)*/
for(j=0;j<=b-1;j++)/*for
(2)*/
{
p=1;i=7-L;
while(i>0)/*p=pow(2,7-L)*j;*/
{
p=p*2;i--;
}
p=p*j;
for(k=j;k<128;k=k+2*b)/*for(3)*/
{
TR=dataR[k];TI=dataI[k];temp=dataR[k+b];
dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];
dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];
dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];
dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];
}/*ENDfor(3)*/
}/*ENDfor
(2)*/
}/*ENDfor
(1)*/
for(i=0;i{
w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);
}
}/*ENDFFT*/
voidInitForFFT()
{
inti;
for(i=0;i{
sin_tab[i]=sin(PI*2*i/SAMPLENUMBER);
cos_tab[i]=cos(PI*2*i/SAMPLENUMBER);
}
}
clk_init.c的源代码:
#include"myapp.h"
voidCLK_init()
{
ioportunsignedint*clkmd;
clkmd=(unsignedint*)0x1c00;
*clkmd=0x2033;//0x2033;//0x2413;//200MHz=0x2513
}
voidSetDSPPLL(unsignedintuPLL)
{
ioportunsignedint*clkmd;
clkmd=(unsignedint*)0x1c00;
*clkmd=uPLL;
}
voidTMCR_reset(void)
{
ioportunsignedint*TMCR_MGS3=(unsignedint*)0x07FE;
ioportunsignedint*TMCR_MM=(unsignedint*)0x07FF;
*TMCR_MGS3=0x510;
*TMCR_MM=0x000;
}
FFT.c的源代码:
#include"myapp.h"
#include"ICETEK-VC5509-EDU.h"
#include"scancode.h"
#include
#include"ad.h"
#include"AD_FFT.h"
#definePI3.1415926
#defineSAMPLENUMBER128
//voidInitForFFT();
//voidMakeWave();
//voidFFT(floatdataR[SAMPLENUMBER],floatdataI[SAMPLENUMBER]);
intINPUT[SAMPLENUMBER],DATA[SAMPLENUMBER];
floatfWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER];
intnADC0[256],nADC1[256];
floatw[SAMPLENUMBER];
main()
{
inti;
intuWork;
//EnableAPLL();
//SDRAM_init();
InitADC();
PLL_Init(144);
while
(1)
{
for(i=0;i<256;i++)
{
ADCCTL=0x8000;//启动AD转换,通道0
do
{
uWork=ADCDATA;
}while(uWork&0x8000);
nADC0[i]=uWork&0x0fff;
}
for(i=0;i<128;i++)
{
INPUT[i]=nADC0[i];
//INPUT[i]=(float)INPUT[i];
}
//asm("nop");//breakpoint
//FFT
InitForFFT();
for(i=0;i{
fWaveR[i]=(float)INPUT[i];
fWaveI[i]=0.0f;
w[i]=0.0f;
}
FFT(fWaveR,fWaveI);
for(i=0;i{
DATA[i]=w[i];
}
//while
(1);//breakpoint
}
}
六、实验结果及分析
图一三角波输出波形与FFT变换图
图二三角波输出波形的FFT输出与FFT变换图对比
这是输入信号,由实验箱中信号源提供,信号源连线是由“波形输出”插座的“3”和“A/D输入”,模块“ADCIN2”插座获得。
通过调节我们获得“三角形”波,该波在图一中捕获的可以清楚看到是一个三角形的波,通过FFT原理我们获得图一右,在图二我们把图一作输出改为FFTMagnitude输出进行对比,通过图二左右对比就可发现图形一样。
接下来也是按照这个功能逐个测试,会有“方波”,“正弦波”进行测试。
图三方波输出波形的信号输出
图四方波输出波形与FFT变换图
图五方波输出波形的FFT输出与FFT变换图对比
图六正弦波输出波形与FFT变换图
图七正弦波输出波形的FFT输出与FFT变换图对比
七、实验总结
通过此次实验,不仅令我熟悉了CCS开发环境及步骤,而且使我对DSP硬件系统有了一定的接触和了解,使我掌握及更好地理解了FFT的DSP实现。
掌握了用窗函数法设计FFT快速傅里叶的原理和方法。