找了很多資料,發現這個最有用,思路簡單清晰,結合自己的理解貼出來。徹底弄懂基2點流程之後,基4也就不難。下一次貼出基4fft程式設計實現。
蝶形公式:
x(k) = x』(k) + x』(k+b)w pn ,
x(k+b) = x』(k) - x』(k+b) w pn
其中w pn= cos(2πp/n)- jsin(2πp/n)。
設 x(k+b) = xr(k+b) + jxi(k+b),
x(k) = xr(k) + jxi(k) ,
有:xr(k)+jxi(k)= xr』(k)+jxi』(k)+[ xr』(k+b) + jxi』(k+b)]*[ cos(2πp/n)-jsin(2πp/n)];
繼續分解得到下列兩式:
xr(k)= xr』(k)+ xr』(k+b) cos(2πp/n)+ xi』(k+b) sin (2πp/n) (1)
xi(k)= xi』(k)-xr』(k+b) sin(2πp/n)+xi』(k+b)cos (2πp/n) (2)
需要注意的是: xr(k)、xr』(k)的儲存位置相同,所以經過(1)、(2)後,該位置上的值已經改變,而下面求x(k+b)要用到x』(k),因此在程式設計時要注意儲存xr』(k)和xi』(k)到tr和ti兩個臨時變數中。
同理: xr(k+b)+jxi(k+b)= xr』(k)+jxi』(k)- [ xr』(k+b)+jxi』(k+b)] *[ cos(2πp/n)-jsin(2πp/n)]繼續分解得到下列兩式:
xr(k+b)= xr』(k)-xr』(k+b) cos(2πp/n)- xi』(k+b) sin (2πp/n) (3)
xi(k+b)= xi』(k)+ xr』(k+b) sin(2πp/n)- xi』(k+b) cos (2πp/n) (4)
注意:
① 在程式設計時,。 式(3)、(4)中的xr』(k)和 xi』(k)分別用tr和ti代替。
② 經過式(3)後, xr(k+b)的值已變化,而式(4)中要用到該位置上的上一級值,所以在執行式(3)前要先將上一級的值xr』(k+b)儲存。
③ 在程式設計時, xr(k)和 xr』(k), xi(k)和 xi』(k)使用同乙個變數。
通過以上分析,我們只要將式(1)、(2)、(3)、(4)轉換成c語言語句即可。要注意變數的中間儲存,詳見以下程式段。
/* 蝶形運算程式段 ,datar存放實數部分,datai存放虛部*/
/* cos、sin函式做成**,直接查表加快運算速度 */
tr=datar[k]; ti=datai[k]; temp=datar[k+b];/*儲存變數,供後面語句使用*/
datar[k]=datar[k]+datar[k+b]*cos_tab[p]+datai[k+b]*sin_tab[p];
datai[k]=datai[k]-datar[k+b]*sin_tab[p]+datai[k+b]*cos_tab[p];
datar[k+b]=tr-datar[k+b]*cos_tab[p]-datai[k+b]*sin_tab[p];
datai[k+b]=ti+temp*sin_tab[p]-datai[k+b]*cos_tab[p];
3 dit fft 演算法的基本思想分析
我們知道n點fft運算可以分成logn2 級,
每一級都有n/2個碟形。dit fft的基本思想是用3層迴圈完成全部運算(n點fft)。
第一層迴圈:由於n=2^m需要m級計算,第一層迴圈對運算的級數進行控制。
第二層迴圈:由於第l級有2^(l-1)個蝶形因子wnp(乘數),第二層迴圈根據乘數進行控制,保證對於每乙個蝶形因子第三層迴圈要執行一次,這樣,第三層迴圈在第二層迴圈控制下,每一級要進行2^(l-1)次迴圈計算。
第三層迴圈:由於第l級共有n/2^l個群,並且同一級內不同群的乘數即蝶形因子wnp分布相同,當第二層迴圈確定某一乘數後,第三層迴圈要將本級中每個群中具有這一乘數的蝶形計算一次,即第三層迴圈每執行完一次要進行n/2^l個碟形計算。
可以得出結論:在每一級中,第三層迴圈完成n/2^l個碟形計算;第二層迴圈使得第三層迴圈進行 2^(l-1)次,因此,第二層迴圈完成時,共進行2^(l-1) *n/2^l=n/2個碟形計算。實質是:第
二、第三層迴圈完成了第l級的計算。
幾個要注意的資料:
① 在第l級中,每個碟形的兩個輸入端相距b=2^(l-1)個點。
② 同一乘數蝶形因子wnp對應著相鄰間隔為2^l個點的n/2^l個碟形。
③ 第l級的2^(l-1)個碟形因子wpn 中的p,可表示為p = j*2^(m-l),其中j = 0,1,2,...,(2l-1-1)。
128點dit fft函式:
/* 取樣來的資料放在datar[ ]陣列中,運算前datai[ ]陣列初始化為0 */
void fft(float datar,float datai)
for(i=0;i<128;i++)
/************** following code fft * ******************/
for(l=1;l<=7;l++) /* b= 2^(l-1) */
for(j=0;j<=b-1;j++) /* for (2) */
p=p*j;// finish wnp=j*2^(m-l)
for(k=j;k<128;k=k+2*b) /* for (3),2b is the distance between groups */
/* end for (3) */
} /* end for (2) */
} /* end for (1) */
for(i=0;i<32;i++)
w[0]=w[0]/2;
} /* end fft */
///
快速傅利葉變換的基2FFT演算法的C 實現
快速傅利葉變換的基2fft演算法的c 實現 2011 01 19 05 26 快速傅利葉變換的基本原理由於公式不好顯示請讀者參考其它文章或書籍,本文重點給出了時域抽取法fft的c 實現。下面是演算法的流程圖 倒序的流程圖 c 實現 1.fft.h pragma once ifndef fft h d...
2 FFT演算法的實現
最近有乙個專案,要開始用資料訊號處理的一些知識,今天開始寫出自己的軌跡,有興趣的朋友可以關注一下!m 已經完成!本週內完成2 fft演算法實現的c 要求動態輸入長度值!1116 今天進展紀錄 完成了框架設計 完成了一些複數操作相關的子函式 在動態分配完結構體陣列記憶體空間操作的時候出現了一些問題 無...
頻率抽取(DIF)基2FFT演算法的MATLAB實現
頻率抽取 dif 基2fft演算法的matlab實現 頻率抽取 dif 基2fft演算法和時間抽取 dit 基2fft演算法是兩種等價的fft演算法,其 相同之處 1 dif 與dit 兩種演算法均為原位運算。2 dif 與dit 運算量相同。不同之處 1 dif 的演算法結構是將 dit演算法結構...