用VHDL编写8点FFT,怎么写。。。

用VHDL编写8点FFT,怎么写。。。,第1张

你是要练习编程

还是要做具体应用啊

MegaCore里面有FFT模块

非常完善了已经

如果要是做实际应用 尽量用那个

但是 如果练习编程

FFT就大了去了 大工程 嗯嗯

我们再研究 讨论

C语言算法!!

// 快速傅立叶变换

// 入口参数:

// l: l=0, 傅立叶变换l=1, 逆傅立叶变换

// il: il=0,不计算傅立叶变换或逆变换模和幅角;il=1,计算模和幅角

// n: 输入的点数,为偶数,一般为32,64,128,...,1024等

// k: 满足n=2^k(k>0),实质上k是n个采样数据可以分解为偶次幂和奇次幂的次数

// pr[]: l=0时,存放N点采样数据的实部

// l=1时, 存放傅立叶变换的N个实部

// pi[]: l=0时,存放N点采样数据的虚部

// l=1时, 存放傅立叶变换的N个虚部

//

// 出口参数:

// fr[]: l=0, 返回傅立叶变换的实部

// l=1, 返回逆傅立叶变换的实部

// fi[]: l=0, 返回傅立叶变换的虚部

// l=1, 返回逆傅立叶变换的虚部

// pr[]: il=1,i=0 时,返回傅立叶变换的模

// il=1,i=1 时,返回逆傅立叶变换的模

// pi[]: il=1,i=0 时,返回傅立叶变换的辐角

// il=1,i=1 时,返回逆傅立叶变换的辐角

void fft(double pr[], double pi[], int n, int k, double fr[], double fi[], int l, int il){

int it,m,is,i,j,nv,l0

double p,q,s,vr,vi,poddr,poddi

for(it=0it<=n-1m=it++){

is=0

for(i=0i<=k-1i++){

j=m/2

is=2*is+(m-2*j)

m=j

}

fr[it]=pr[is]

fi[it]=pi[is]

}

//----------------------------

pr[0]=1.0

pi[0]=0.0

p=6.283185306/n

pr[1]=cos(p)

pi[1]=-sin(p)

if (l)

pi[1]=-pi[1]

for(i=2i<=n-1i++){

p=pr[i-1]*pr[1]

q=pi[i-1]*pi[1]

s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1])

pr=p-q

pi=s-p-q

}

for(it=0it<=n-2it+=2){

vr=fr[it]

vi=fi[it]

fr[it]=vr+fr[it+1]

fi[it]=vi+fi[it+1]

fr[it+1]=vr-fr[it+1]

fi[it+1]=vi-fi[it+1]

}

m=n/2

nv=2

for(l0=k-2l0>=0l0--){

m/=2

nv<<=1

for(it=0it<=(m-1)*nvit+=nv)

for(j=0j<=(nv/2)-1j++){

p=pr[m*j]*fr[it+j+nv/2]

q=pi[m*j]*fi[it+j+nv/2]

s=pr[m*j]+pi[m*j]

s*=(fr[it+j+nv/2]+fi[it+j+nv/2])

poddr=p-q

poddi=s-p-q

fr[it+j+nv/2]=fr[it+j]-poddr

fi[it+j+nv/2]=fi[it+j]-poddi

fr[it+j]+=poddr

fi[it+j]+=poddi

}

}

if(l)

for(i=0i<=n-1fr/=n,fi[i++]/=n)

if(il)

for(i=0i<=n-1i++){

pr=sqrt(fr*fr+fi*fi)

if(fabs(fr)<0.000001*fabs(fi))

pi=fi*fr>0?90.0-90.0

else

pi=atan(fi/fr)*360.0/6.283185306

}

return

}

试试在百度里找找!

如果有光碟那最好了!

也可以把ff show下载在你自己的文件夹里!

希望可以帮助你!

祝你成功!


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存