怎样用verilog实现表达式

怎样用verilog实现表达式,第1张

首先,你用的是FPGA,就不能算非基2的除法。具体除法,有两种方法,一个用减法,一个用查找表(lookup table)。

至陆或于pi,你只能先存在RAM里面,取一个大概值。(具体精度看你自己)

至于向负无穷大取简察整,自己估计一个精度,取吧拦悉茄~~

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

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存