fft在dsp芯片上的实现

fft在dsp芯片上的实现,第1张

2、 DSP实现的方法

//#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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12295642.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存