//#include "DSP281x_Device.h" // DSP281x Headerfile Include File
//#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define pi atan(1.0)*4 //计算PI的值
typedef struct //定义表示复数的结构体
{
float real
float imag
}FUSHU
FUSHU x[1024]
int w[1024]
FUSHU FUCHENG(FUSHU b1,FUSHU b2) //复数相乘函数
{
FUSHU b3
b3.real=b1.real*b2.real-b1.imag*b2.imag
b3.imag=b1.real*b2.imag+b1.imag*b2.real
return(b3)
}
void FFT(FUSHU *xin,int N) //FFT运算
{
int m,LH,I,k,J,M,K
float p,ps
int B,N1
FUSHU w,T
M=10//对应N值为
//下面腊察谈是倒序的程序
LH=N/2
J=LH
N1=N-2
/*变址运算*/
for(I=1I<=N1I++)
{
if(I<J)
{
T=xin[I]xin[I]=xin[J]xin[J]=T
}
K=LH
while(J>=K)
{
J=J-K
K=K/2
}
J=J+K
}
//下面是DIT-FFT运算程序
for(m=1m<=Mm++)
{
B=pow(2.0,m-1)
for(J=0J<=B-1J++)
{
p=pow(2.0,M-m)*J
ps=2*pi/N*p
w.real=cos(ps)
w.imag=-sin(ps)
for(k=Jk<=N-1k=k+pow(2.0,m))
{
T=FUCHENG(xin[k+B],w)
xin[k+B].real=xin[k].real-T.real
xin[k+B].imag=xin[k].imag-T.imag
xin[k].real=xin[k].real+T.real
xin[k].imag=xin[k].imag+T.imag
}
}
}
}
void IFFT(FUSHU *xin,int N) //IFFT运算
{
int m,LH,I,k,J,M,K
float p,ps
int B,N1
FUSHU w,T
M=10//对轮碰应N值为
//下面没耐是倒序的程序
LH=N/2
J=LH
N1=N-2
/*变址运算*/
for(I=1I<=N1I++)
{
if(I<J)
{
T=xin[I]xin[I]=xin[J]xin[J]=T
}
K=LH
while(J>=K)
{
J=J-K
K=K/2
}
J=J+K
}
for(m=1m<=Mm++)
{
B=pow(2.0,m-1)
for(J=0J<=B-1J++)
{
p=pow(2.0,M-m)*J
ps=2*pi/N*p
w.real=cos(ps)
w.imag=sin(ps)//与FFT符号相反
for(k=Jk<=N-1k=k+pow(2.0,m))
{
T=FUCHENG(xin[k+B],w)
xin[k+B].real=xin[k].real-T.real
xin[k+B].imag=xin[k].imag-T.imag
xin[k].real=xin[k].real+T.real
xin[k].imag=xin[k].imag+T.imag
}
}
}
for(k=0k<Nk++)//比FFT多乘了一个常数因子/N
{
xin[k].real=xin[k].real/N
xin[k].imag=xin[k].imag/N
}
}
int main()
{
int n
for(n=0n<1024n++) //输入波形x(t) = cos(2*pi* 100*t)
{
x[n].real=cos(2*pi*100*n/1024)//采样频率为kHz
x[n].imag=0
}
FFT(x,1024)//进行FFT运算
for ( n=0n<1024n++ )
{
w[n]=sqrt(x[n].real*x[n].real+x[n].imag*x[n].imag)//幅度谱
}
IFFT(x,1024)//进行IFFT运算
for(n=0n<1024n++)//比较逆变换之后的数据与原来的数据差
{
if(fabs(cos(2*pi*100*n/1024)-x[n].real)>0.001)
break
}
if(n<1024)
puts("FFT不正确\n")
if(n==1024)
puts("FFT正确\n")
return 0
}
用CCS编程软件,这是TI公1司DSP的程序编早念译环境,和C语言编译环境类似,容易上p手3。但是,你在编程的时候最好能找一y些例程来看,这样学起来比0较快,如果你有C语言编程的基础芹宏的话就更好了p。另外,硬件方6面需要编程器和开h发板,需要安装驱动。当然,也j可以6不h用硬件编程,CCS有模拟的功能,它利用计1算机的内3存作为8DSP存储器来实现,但是,这种方8法不s能验证你的程序能否在硬件上m正常工z作,是初学者入e门m的最好方4法。j郡kなwan∮m¢撷u薛écvёkな陆首困c54,c55, C6000以上的有库函数宏缺敏可以调用,不要看硬件的,直接用CCS就可蔽枝以了C6748的 扮态void DSPF_sp_fftSPxSP(int N, float *ptr_x, float *ptr_w, float *ptr_y, unsigned char *brev, int n_min, int offset, int n_max)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)