#define SAMPLENUMBER 128 ///2^7 void InitForFFT(); void MakeWave();
int INPUT[SAMPLENUMBER],DATA[SAMPLENUMBER];
float fWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER]; float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER]; //主函数 main() { int i; InitForFFT(); MakeWave(); for ( i=0;i void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]) { int x0,x1,x2,x3,x4,x5,x6,xx; int i,j,k,b,p,L; float TR,TI,temp; /********** 代码转化序列,实现比特反转************/ for ( i=0;i xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6; dataI[xx]=dataR[i]; }//这里应该是倒序位处理,以便于进行蝶形运算、 for ( i=0;i 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]; } /* END for (3) 一个蝶形*/ } /* END for (2) */ } /* END for (1) */ for ( i=0;i } /* END FFT */ void InitForFFT()///把离散因子表示出来 { int i; for ( i=0;i void MakeWave()//输入,三个周期的正弦波,按照128点抽样后的数据 { int i; for ( i=0;i } 实验现象:如图所示: INPUT[i]=sin(PI*2*i/SAMPLENUMBER*3)*1024; } 上图为时域中FFT前图形 上图为时域中FFT后图形 上图为频域中FFT后的波形(上为幅度,下为相位) 7、串口通信实验 5509A有3个多通道缓冲串口mcbsp,有7个管脚分布在dsp的外围针脚上,有1个发送端,1个接收端,还有接收和发送的时钟信号,帧同步信号,各一对。mcbsp内部有一个采样速率发生器,可以产生时钟和帧同步信号,这两个信号可用于发送和接收的时钟和帧同步信号。 要将McBSP的配置为GPIO模式,只需配置的寄存器:PCR(引脚控制寄存器)和SPCR(串口控制寄存器),而mcbsp的其他寄存器在GPIO配置模式下都不用管 PC机与C5509A串行通信必须遵循起止式异步协议,它的特点是一个字符一个字符传输,并且传送一个字符总是以起始比特开始,以停止位结束,字符之间没有固定的时间间隔要求。起始比特位始终为低电平, 1比特;字符位可以选择4~8比特;奇偶校验位可以为无、奇、偶、空格、标志;停止位为1、1. 5或2比特。理论上,发送过程和接收过程可选择不同的数据格式进行通信,但通常我们为了开发程序的简化和通信方便都采用统一的数据格式(如: 1个起始位+ 8个数据位) 。 主要程序为(由于程序过长,在这里只介绍main函数,重要语句已作注释): void main(void) { CSL_init();/*初始化CSL库*/ PLL_config(&myConfig); /*设置系统的运行速度为144MHz*/ hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET); /*初始化McBSP1*/ MCBSP_config(hMcbsp,&Mcbsp1Config); /*设置McBSP1*/ MCBSP_getConfig(hMcbsp,&Mcbsptest);//读里面的内容,可以在watch window里查看 settimer();//设定定时器timer0 //以下程序实现软件Uart while(TRUE)//while的作用是查询收发状态 { if(uart_recflag==1) { uart_recflag = 0; if(uart_sendflag==0) { uart_bitsendcnt = 0;//一个比特需要的次数 uart_sendend = 0;//发送结束 uart_sendcnten = 0; uart_bitsend = 0; uart_send = uart_rec; uart_sendflag = 1; uart_sendbitcnt = 0;//发送bit位数 } } }; } interrupt void timer0Isr(void)//这个中断中所作的就是先解码再发送出去 { temp = REG_PCR1; //发送 if(uart_sendflag==1) { if(uart_sendcnten==0) { REG_PCR1 &= 0xffdf;//写PCR寄存器的第五位,即DXSTAT域清零 uart_bitsend = 1; uart_sendcnten = 1; } if(uart_sendcnten==1) { uart_bitsendcnt++; if(uart_bitsendcnt==10) { uart_sendbitcnt++; if(uart_sendend==1) { uart_sendflag = 0; } else { if(uart_sendbitcnt<9) { if((uart_send & uart_bitsend)==0) { REG_PCR1 &= 0xffdf; } else { REG_PCR1 |= 0x0020;//读PCR寄存器的第五位DXSTAT域置1 } uart_bitsend <<= 1; } else { REG_PCR1 |= 0x0020; uart_sendflag = 0; } } uart_bitsendcnt = 0; } } } //接收 if((uart_bitcnt==0)&&(uart_recstart==0))