}
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]=(floatINPUT[i];
}
//asm("nop";//breakpoint
//FFT
InitForFFT(;
for(i=0;i
{
fWaveR[i]=(floatINPUT[i];
fWaveI[i]=0.0f;
w[i]=0.0f;
}
FFT(fWaveR,fWaveI;
for(i=0;i
{
DATA[i]=w[i];
}
//while(1;//breakpoint
}
}
六、实验步骤
1.实验准备:
⑴连接实验设备:
⑵准备信号源进行AD输入。
1取出2根实验箱附带的信号线(两端均为单声道语音插头的信号线。
②用1根信号线连接实验箱底板上信号源I模块的“波形输出”插座和“A/D输入”模块的“ADCIN2”插座,注意插头要插牢、到底。
这样,信号源I的输出波形即可送到ICETEK-VC5509-A板的AD输入通道0。
③用1根信号线连接实验箱底板上信号源II模块的“波形输出”插座和“A/D输入”模块的“ADCIN3”插座,注意插头要插牢、到底。
这样,信号源Ⅱ的输出波形即可送到ICETEK-VC5509-A板的AD输入通道1。
④设置信号源I:
-调整拨动开关“频率选择”拨到“100Hz-1KHz”档。
-将“频率微调”顺时针调到头(最大。
-调整拨动开关“波形选择”拨到“正弦波”档。
-将“幅值微调”顺时针调到头(最大。
⑤设置信号源Ⅱ:
-调整拨动开关“频率选择”拨到“10Hz-100Hz”档。
-将“频率微调”顺时针调到头(最大。
-调整拨动开关“波形选择”拨到“正弦波”档。
-将“幅值微调”顺时针调到头(最大。
⑥将两个信号源的电源开关拨到“开”的位置。
2.设置CodeComposerStudio2.21在硬件仿真(Emulator方式下运行。
3.启动CodeComposerStudio2.21:
选择菜单Debug→ResetCPU。
4.打开工程文件:
-在项目浏览器中,双击main.c,打开main.c文件,浏览该文件的内容,理解各语句作用。
5.编译、下载程序。
6.打开观察窗口:
-选择菜单View->Graph->Time/Frequency…设置好波形观察参数。
7运行程序,观察结果:
观察经D转换和FFT变换后的波形,调整信号源可调部分,观察实时波形随之变化。
8选择菜单File→workspace→saveworkspacsAs…,输入文件名SY.wks。
9退出CCS:
七、实验结果及分析
实验输入的模拟信号如下图所示:
实验所输入模拟信号经FFT变换后的输出:
实验所输入模拟信号经AD转换后的输出:
实验所输入模拟信号经AD转换后的信号经FFT变换后的输出:
八、实验总结
通过本次CCS环境下对模拟信号进行A/D转换和FFT变换的硬件仿真实验,让我掌握了CodeComposerStudio2.21的安装和配置步骤过程;了解了DSP开发系统和计算机与目标系统的连接方法,CodeComposerStudio2.21软件的操作环境和基本功能,TMS320C55xx软件开发过程以及CCS环境下DSP的C语言程序编写方法;学会了创建工程和管理工程的方法,基本的编译和调试功能,以及观察窗口和图形窗口的使用;熟悉了VC5509A的定时器的使用和片内AD的控制方法;更深一步的理解了用窗函数设计FFT快速傅立叶变换的原理和方法,FFT快速傅立叶的特性和各种窗函数对快速傅立叶特性的影响。
为我今后对DSP的进一步学习奠定了更好理论基础和应用基础。
参考资料
[1]赵洪亮等编著.TMS320C55xDSP应用系统设计.北京:
北京航空航天大学出版社,2008.
[2]胡庆钟等编著.TMS320C55xDSP原理、应用和设计.北京:
机械工业出版社,2005.
[3]ICETEK-VC5509-A-USB-EDU_V2.1(ICETEK-VC5509-A-USB-EDU教学实验系统软件实验指导书.