(快速傅里葉變換)C語言程序._第1頁
(快速傅里葉變換)C語言程序._第2頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、#i nclude #in elude vintrin sics.h/*快速傅立葉變換 C 函數(shù)函數(shù)簡介:此函數(shù)是通用的快速傅里葉變換C 語言函數(shù),移植性強,以下部分不依賴硬件。此函數(shù)采用聯(lián)合體的形式表示一個復(fù)數(shù),輸入為自然順序的復(fù) 數(shù)(輸入實數(shù)是可令復(fù)數(shù)虛部為0),輸出為經(jīng)過 FFT 變換的自然順序的復(fù)數(shù)使用說明:使用此函數(shù)只需更改宏定義FFT_N 的值即可實現(xiàn)點數(shù)的改變,F(xiàn)FT_N應(yīng)該為 2 的 N 次方,不滿足此條件時應(yīng)在后面補0函數(shù)調(diào)用:FFT(s);時間:2010-2-20版本:Ver1.0參考文獻:*#in clude#defi ne PI 3.141592653589793238

2、4626433832795028841971#define FFT_N 128變換的點數(shù)定義圓周率值/定義傅立葉struct compx float real,imag;struct compx sFFT_N;出:從 S1開始存放,根據(jù)大小自己定義/定義一個復(fù)數(shù)結(jié)構(gòu)/FFT 輸入和輸/*函數(shù)原型: struct compx EE(struct compx b1,struct compx b2) 函數(shù)功能:對兩個復(fù)數(shù)進行乘法運算輸入?yún)?shù):兩個以聯(lián)合體定義的復(fù)數(shù)a,b輸出參數(shù):a 和 b 的乘積,以聯(lián)合體的形式輸出*/struct compx EE(struct compx a,struct co

3、mpx b)struct compx c;c.real=a.real*b.real-a.imag*b.imag; c.imag=a.real*b.imag+a.imag*b.real;return(c);/*函數(shù)原型:void FFT(struct compx *xi n,int N)函數(shù)功能:對輸入的復(fù)數(shù)組進行快速傅里葉變換(FFT)輸入?yún)?shù):*xin 復(fù)數(shù)結(jié)構(gòu)體組的首地址指針,struct 型*/ void FFT(struct compx *xi n)int f,m, nv2,n m1,i,k,l,j=O;struct compx u,w,t;/變址運算,即把自然順序變成倒位序,采用雷德

4、算如果 ij,即進行變址/求 j 的下一個倒位序如果 k=j,表示 j 的最高位為 1/把最高位變成 0/k/2,比較次高位,依次類推,逐個比較,直到某個位為0/把 0 改為 1/FFT 運算核,使用蝶形運算完成FFT 運算/計算 I 的值,即計算蝶形級數(shù)/控制蝶形結(jié)級數(shù)/m 表示第 m 級蝶形,I 為蝶形級總數(shù)/le 蝶形結(jié)距離,即第 m 級蝶形的蝶形結(jié)/同一蝶形結(jié)中參加運算的兩點的距離/u 為蝶形結(jié)運算系數(shù),初始值為1/w 為系數(shù)商,即當(dāng)前系數(shù)與前一個系數(shù)的商 /控制計算不同種蝶形結(jié),即n v2=FFT_N/2;法n m 仁 FFT_N-1;for(i=0;i nm1;i+) if(ij)

5、t=xi nj;xi nj=xi n i;xin i=t;k=nv2;while(k=j)j=j-k;k=k/2;j=j+k;int le,lei,ip;f=FFT_N;for(l=1;(f=f/2)!=1;l+);for(m=1;m=l;m+)l=log ( 2)N le=2(m-1);相距 le 點lei=le/2;u.real=1.0;u.imag=0.0;w.real=cos(PI/lei);w.imag=-sin( PI/lei);for(j=0;j=lei-1;j+)計算系數(shù)不同的si.real=sqrt(si.real*si.real+si.imag*si.imag);while

6、(1);蝶形結(jié)for(i=j;i=FFT_N-1;i=i+le)控制同一蝶形結(jié)運算,即計算系數(shù)相同蝶形ip=i+lei; t=EE(xi n ip,u);xi nip.real=xi n i.real-t.real;xin ip.imag=x ini.imag-t.imag; xi ni.real=xin i.real+t.real;xi ni.imag=xini.imag+t.imag; u=EE(u,w);/i,ip 分別表示參加蝶形運算的兩個節(jié)點 /蝶形運算,詳見公式/改變系數(shù),進行下一個蝶形運算/*函數(shù)原型 函數(shù)功能 輸入?yún)?shù) 輸出參數(shù)void mai n()測試 FFT 變換,演示函

7、數(shù)使用方法 無無*/void mai n()int i;for(i=0;iFFT_N;i+)si.real=si n(2*3.141592653589793*i/FFT_N); /si.imag=0;/給結(jié)構(gòu)體賦值實部為正弦波 FFT_N 點采樣,賦值為 1 虛部為 0FFT(s);/進行快速傅立葉變換for(i=0;iFFT_N;i+)部部分/求變換后結(jié)果的模值,存入復(fù)數(shù)的實#i nclude #in elude vintrin sics.h/*快速傅立葉變換 C 程序包函數(shù)簡介:此程序包是通用的快速傅里葉變換C 語言函數(shù),移植性強,以下部分不依賴硬件。此程序包采用聯(lián)合體的形式表示一個復(fù)數(shù),

8、輸入為自然順序的復(fù)數(shù)(輸入實數(shù)是可令復(fù)數(shù)虛部為0),輸出為經(jīng)過 FFT 變換的自然順序的復(fù)數(shù).此程序包可在初始化時調(diào)用create_sin_tab()函數(shù)創(chuàng)建正弦函數(shù)表,以后的可采用查表法計算耗時較多的sin 和 cos 運算,加快可計算速度使用說明:使用此函數(shù)只需更改宏定義FFT_N 的值即可實現(xiàn)點數(shù)的改變,F(xiàn)FT_N應(yīng)該為 2 的 N 次方,不滿足此條件時應(yīng)在后面補0。若使用查表法計算 sin 值和cos 值,應(yīng)在調(diào)用 FFT 函數(shù)前調(diào)用 create_sin_tab()函數(shù)創(chuàng)建正弦表函數(shù)調(diào)用:FFT(s);時間:2010-2-20版本:Ver1.1參考文獻:*/#in clude#def

9、ine FFT_N 128/ 定義傅立葉變換的點數(shù)#defi ne PI 3.1415926535897932384626433832795028841971/ 定義圓周率值struct compx float real,imag;/ 定義一個復(fù)數(shù)結(jié)構(gòu)struct compx sFFT_N;/FFT 輸入和輸出:從 S0開始存放,根據(jù)大小自己定義float SIN_TABFFT_N/2;/定義正弦表的存放空間/*函數(shù)原型: struct compx EE(struct compx b1,struct compx b2)函數(shù)功能:對兩個復(fù)數(shù)進行乘法運算輸入?yún)?shù):兩個以聯(lián)合體定義的復(fù)數(shù)a,b輸出參

10、數(shù):a 和 b 的乘積,以聯(lián)合體的形式輸出*/struct compx EE(struct compx a,struct compx b)struct compx c;c.real=a.real*b.real-a.imag*b.imag;c.imag=a.real*b.imag+a.imag*b.real;return(c);/*函數(shù)原型:void create_sin_tab(float *sin_t)函數(shù)功能:創(chuàng)建一個正弦采樣表,采樣點數(shù)與傅立葉變換點數(shù)相同 輸入?yún)?shù):*sin_t 存放正弦表的數(shù)組指針輸出參數(shù):無*/void create_s in _tab(float *sin_t)i

11、nt i;for(i=0;i=0&n =FFT_ N/2&n 2*PI)pi2-=2*PI;a=s in _tab(pi2);return a;*函數(shù)原型:void FFT(struct compx *xi n,int N)函數(shù)功能:對輸入的復(fù)數(shù)組進行快速傅里葉變換(FFT)輸入?yún)?shù):*xin 復(fù)數(shù)結(jié)構(gòu)體組的首地址指針,struct 型輸出參數(shù):無*/ void FFT(struct compx *xi n)int f,m, nv2,n m1,i,k,l,j=O;struct compx u,w,t;/變址運算,即把自然順序變成倒位序,采用雷德算法/求 j 的下一個倒位序如果

12、k=j,表示 j 的最高位為 1/把最高位變成 0/k/2,比較次高位,依次類推,逐個比較,直到某個位為把 0 改為 1n v2=FFT_N/2; nm 仁 FFT_N-1;for(i=0;i nm1;i+) if(ij)t=xi nj;xi nj=xi n i;xin i=t;k=nv2;while(k=j)j=j-k;k=k/2;j=j+k;如果 ij,即進行變址int le,lei,ip;f=FFT_N;for(l=1;(f=f/2)!=1;l+)Jfor(m=1;m=l;m+) le=2(m-1);lei=le/2;u.real=1.0;u.imag=0.0;w.real=cos(PI

13、/lei);/ w.imag=-si n( PI/lei);w.real=cos_tab(PI/lei);w.imag=-sin_tab(PI/lei);/FFT 運算核,使用蝶形運算完成FFT計算 I 的值,即計算蝶形級數(shù)/控制蝶形結(jié)級數(shù)/m 表示第 m 級蝶形,I 為蝶形級總數(shù) l=log/le 蝶形結(jié)距離,即第m 級蝶形的蝶形結(jié)相距同一蝶形結(jié)中參加運算的兩點的距離/u 為蝶形結(jié)運算系數(shù),初始值為1不適用查表法計算 sin 值和 cos 值/w 為系數(shù)商,即當(dāng)前系數(shù)與前一個系數(shù)的商運算(2) Nle 點for(j=0;j=lei_1;j+)for(i=j;i=FFT_N-1;i=i+le)

14、ip=i+lei;t=EE(xi n ip,u);xi nip.real=xi n i.real-t.real;xin ip.imag=x in i.imag-t.imag;xi ni.real=xi n i.real+t.real;xi ni.imag=xi ni.imag+t.imag;u=EE(u,w);/*函數(shù)原型:void mai n()函數(shù)功能:測試 FFT 變換,演示函數(shù)使用方法輸入?yún)?shù):無輸出參數(shù):無*/void mai n()int i;create_sin_tab(SIN_TAB);for(i=0;iFFT_N;i+)/ 給結(jié)構(gòu)體賦值si.real=sin(2*3.1415

15、92653589793*i/FFT_N); /實部為正弦波 FFT_N 點采樣,賦值為 1si.imag=0;/虛部為 0FFT(s);/進行快速傅立葉變換for(i=0;iFFT_N;i+)求變換后結(jié)果的模值,存入復(fù)數(shù)的實部部分si.real=sqrt(si.real*si.real+si.imag*si.imag);while(1);/控制計算不同種蝶形結(jié),即計算系數(shù)不同的蝶形結(jié)控制同一蝶形結(jié)運算,即計算系數(shù)相同蝶形結(jié)i, ip 分別表示參加蝶形運算的兩個節(jié)點/蝶形運算,詳見公式/改變系數(shù),進行下一個蝶形運算#i nclude #in elude vintrin sics.h/*快速傅立葉

16、變換 C 程序包函數(shù)簡介:此程序包是通用的快速傅里葉變換C 語言函數(shù),移植性強,以下部分不依賴硬件。此程序包采用聯(lián)合體的形式表示一個復(fù)數(shù),輸入為自然順序的復(fù) 數(shù)(輸入實數(shù)是可令復(fù)數(shù)虛部為0),輸出為經(jīng)過 FFT 變換的自然順序的復(fù)數(shù).此程序包可在初始化時調(diào)用create_sin_tab()函數(shù)創(chuàng)建正弦函數(shù)表,以后的可采用查表法計算耗時較多的sin 和 cos 運算,加快可計算速度.與Ver1.1 版相比較,Ver1.2 版在創(chuàng)建正弦表時只建立了1/4 個正弦波的采樣值,相比之下節(jié)省了FFT_N/4 個存儲空間使用說明:使用此函數(shù)只需更改宏定義FFT_N 的值即可實現(xiàn)點數(shù)的改變,F(xiàn)FT_N 的應(yīng)

17、該為 2 的 N 次方,不滿足此條件時應(yīng)在后面補0。若使用查表法計算sin 值和cos 值,應(yīng)在調(diào)用 FFT 函數(shù)前調(diào)用 create_sin_tab()函數(shù)創(chuàng)建正弦表函數(shù)調(diào)用:FFT(s);時間:2010-2-20版本:Ver1.2參考文獻:*/#in clude#define FFT_N 128/ 定義傅立葉變換的點數(shù)#defi ne PI 3.1415926535897932384626433832795028841971/ 定義圓周率值struct compx float real,imag;/ 定義一個復(fù)數(shù)結(jié)構(gòu)struct compx sFFT_N;/FFT 輸入和輸出:從 S0開始

18、存放,根據(jù)大小自己定義float SIN_TABFFT_N/4+1;/定義正弦表的存放空間/*函數(shù)原型: struct compx EE(struct compx b1,struct compx b2)函數(shù)功能:對兩個復(fù)數(shù)進行乘法運算輸入?yún)?shù):兩個以聯(lián)合體定義的復(fù)數(shù)a,b輸出參數(shù):a 和 b 的乘積,以聯(lián)合體的形式輸出*/struct compx EE(struct compx a,struct compx b)struct compx c;c.real=a.real*b.real-a.imag*b.imag;c.imag=a.real*b.imag+a.imag*b.real;return(

19、c);/*函數(shù)原型:void create_sin_tab(float *sin_t)函數(shù)功能:創(chuàng)建一個正弦采樣表,采樣點數(shù)與傅立葉變換點數(shù)相同輸入?yún)?shù):*sin_t 存放正弦表的數(shù)組指針 輸出參數(shù):無*/void create_s in _tab(float *sin_t)int i;for(i=0;i=0&nFFT_N/ 4&* FFT_N/2)n-=FFT_N/4;a=SIN_TABFFT_N/4-n;else if(n =FFT_N/2&n=3*FFT_N/4&n2*PI)pi2-=2*PI;a=s in _tab(pi2);return a;/*函數(shù)原

20、型:void FFT(struct compx *xi n,int N)函數(shù)功能:對輸入的復(fù)數(shù)組進行快速傅里葉變換( FFT) 輸入?yún)?shù):*xin 復(fù)數(shù)結(jié)構(gòu)體組的首地址指針,struct 型輸出參數(shù):無*/void FFT(struct compx *xi n)int f,m, nv2,n m1,i,k,l,j=0;struct compx u,w,t;/變址運算,即把自然順序變成倒位序,采用雷德算如果 ij,即進行變址/求 j 的下一個倒位序如果 k=j,表示 j 的最高位為 1/把最高位變成 0/k/2,比較次高位,依次類推,逐個比較,直到某個位為 0n v2=FFT_N/2;法n m 仁

21、 FFT_N-1;for(i=0;i nm1;i+) if(ij)t=xi nj;xi nj=xi n i;xin i=t;k=nv2;while(k=j)j=j-k;k=k/2;j=j+k;/*把 0 改為 1/FFT 運算核,使用蝶形運算完成FFT 運算/計算 I 的值,即計算蝶形級數(shù)/控制蝶形結(jié)級數(shù)/m 表示第 m 級蝶形,I 為蝶形級總數(shù)/le 蝶形結(jié)距離,即第m 級蝶形的蝶形結(jié)/同一蝶形結(jié)中參加運算的兩點的距離/u 為蝶形結(jié)運算系數(shù),初始值為 1/不適用查表法計算 sin 值和 cos 值/w 為系數(shù)商,即當(dāng)前系數(shù)與前一個系數(shù)的商控制計算不同種蝶形結(jié), 即計算系數(shù)不同的蝶控制同一蝶形結(jié)運算,即計算系數(shù)相同蝶形/i,ip 分別表示參加蝶形運算的兩個節(jié)點/蝶形運算,詳見公式/改變系數(shù),進行下一個蝶形運算 /*函數(shù)原型:void mai n()函

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論