日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C语言实现傅里叶变换函数dft,idft,fft,ifft

發(fā)布時(shí)間:2023/11/27 生活经验 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现傅里叶变换函数dft,idft,fft,ifft 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

自定義結(jié)構(gòu)體complex(復(fù)數(shù))

typedef struct{double re; //實(shí)部 double im; //虛部 
}complex;

用于為離散序列倒碼排序的函數(shù)

int  reverse(int n,int M){int i,m,dev,temp=0;for(i=0,m=1,dev=1;i<M;i++,m*=2,dev*=2){temp=(temp<<1)+(n&m)/dev;}return temp;
}void reSequence(complex*src, complex*dst,int N){int i,M=(int)log2(N);for(i=0;i<N;i++){dst[i].re=src[reverse(i,M)].re;dst[i].im=src[reverse(i,M)].im;}
}

dft、idft、fft、ifft實(shí)現(xiàn)代碼

void dft(complex*src,complex*dst,int N){int i,j; double temp;for(i=0;i<N;i++){dst[i].re=0;dst[i].im=0;for(j=0;j<N;j++){temp=-2*pi*j*i/N;dst[i].re+=src[j].re*cos(temp)-src[j].im*sin(temp);dst[i].im+=src[j].re*sin(temp)+src[j].im*cos(temp);}}
}void idft(complex*src,complex*dst,int N){int i,j;double temp;for(i=0;i<N;i++){dst[i].re=0;dst[i].im=0;for(j=0;j<N;j++){temp=2*pi*i*j/N;dst[i].re+=(src[j].re*cos(temp)-src[j].im*sin(temp))/N;dst[i].im+=(src[j].re*sin(temp)+src[j].im*cos(temp))/N;}}
}void fft(complex*src,complex*dst,int N){int i,j;double temp;int g,n,gap;complex x1,x2;reSequence(src,dst,N);for(g=N/2;g>0;g/=2){	//g為蝴蝶單元群的數(shù)量 n=N/g;                 //n為每一蝴蝶單元群中蝴蝶單元的數(shù)量 gap=n/2;			//gap為蝴蝶單元上兩個(gè)節(jié)點(diǎn)的間距 for(i=0;i<N;i+=n){for(j=i;j<i+n/2;j++){temp=-2*pi*g*(j-i)/double(N);x1.re=dst[j].re+dst[j+gap].re*cos(temp)-dst[j+gap].im*sin(temp);x1.im=dst[j].im+dst[j+gap].re*sin(temp)+dst[j+gap].im*cos(temp);x2.re=dst[j].re-dst[j+gap].re*cos(temp)+dst[j+gap].im*sin(temp);x2.im=dst[j].im-dst[j+gap].re*sin(temp)-dst[j+gap].im*cos(temp);dst[j].re=x1.re;dst[j].im=x1.im;dst[j+gap].re=x2.re;dst[j+gap].im=x2.im;}}}
}void ifft(complex*src,complex*dst,int N){int i,j;double temp;int g,n,gap;complex x1,x2;reSequence(src,dst,N);for(g=N/2;g>0;g/=2){	//g為蝴蝶單元群的數(shù)量 n=N/g;                 //n為每一蝴蝶單元群中蝴蝶單元的數(shù)量 gap=n/2;			//gap為蝴蝶單元上兩個(gè)節(jié)點(diǎn)的間距 for(i=0;i<N;i+=n){for(j=i;j<i+n/2;j++){temp=2*pi*g*(j-i)/double(N);x1.re=(dst[j].re+dst[j+gap].re*cos(temp)-dst[j+gap].im*sin(temp));x1.im=(dst[j].im+dst[j+gap].re*sin(temp)+dst[j+gap].im*cos(temp));x2.re=(dst[j].re-dst[j+gap].re*cos(temp)+dst[j+gap].im*sin(temp));x2.im=(dst[j].im-dst[j+gap].re*sin(temp)-dst[j+gap].im*cos(temp));dst[j].re=x1.re;dst[j].im=x1.im;dst[j+gap].re=x2.re;dst[j+gap].im=x2.im;}}}for(i=0;i<N;i++){dst[i].re/=N;dst[i].im/=N;}
}

總結(jié)

以上是生活随笔為你收集整理的C语言实现傅里叶变换函数dft,idft,fft,ifft的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。