頻率抽取(dif)基2fft演算法的matlab實現
頻率抽取(dif)基2fft演算法和時間抽取(dit)基2fft演算法是兩種等價的fft演算法,其
相同之處:(1
)dif
與dit
兩種演算法均為原位運算。(2
)dif
與dit
運算量相同。
不同之處:(1
)dif
的演算法結構是將
dit演算法結構倒過來。
· dif
為輸入順序,輸出亂序。運算完畢再執行「二進位制倒讀」程式。
· dit
為輸入亂序,輸出順序。先執行「二進位制倒讀」程式,再進行求
dft。(2
)dif
與dit
根本區別:在於蝶形結不同。
· dit
的複數相乘出現在減法之前。
· dif
的複數相乘出現在減法之後。
下圖[ref1]是在n=8時,頻率抽取(dit)基2fft演算法的流圖。
最後給出matlab實現的**:
function [xk]=dif_fft_2(xn,n);
%蝶形運算開始
m=log2(n);%「級」的數量
for m=0:m-1 %「級」迴圈開始
num_of_group=2^m;%每一級中組的個數
interval_of_group=n/2^m;%每一級中組與組之間的間距
interval_of_unit=n/2^(m+1);%每一組中相關運算單元之間的間距
cycle_count=n/2^(m+1)-1;%每一組內的迴圈次數
wn=exp(-j*2*pi/interval_of_group);%旋轉因子
for g=1:num_of_group %「組」迴圈開始
interval_1=(g-1)*interval_of_group;%第g組中蝶形運算變數1的偏移量
interval_2=(g-1)*interval_of_group+interval_of_unit;%第g組中蝶形運算變數2的偏移量
for r=0:cycle_count;%「組內」迴圈開始
k=r+1;%「組內」序列的下標
xn(k+interval_1)=xn(k+interval_1)+xn(k+interval_2);%第m級,第g組的蝶形表示式1
xn(k+interval_2)=[xn(k+interval_1)-xn(k+interval_2)-xn(k+interval_2)]*wn^r;%第m級,第g組的蝶形表示式2,注:1和2為同址運算
endend
end %序列排序開始
n1=fliplr(dec2bin([0:n-1]));%碼位倒置步驟1:將碼位轉換為二進位制,再進行倒序
n2=[bin2dec(n1)];%碼位倒置步驟2:將碼位轉換為十進位制後翻轉
for i=1:n
xk(i)=xn(n2(i)+1);%根據碼位倒置的結果,將xn重新排序,存入xk中
end
基2FFT時間抽取和頻域抽取演算法比較
基二fft演算法 include math.h include stdio.h struct compx compx struct compx ee struct compx b1,struct compx b2 複數相乘 void fft struct compx xin,int n 求出m為lo...
2 FFT演算法的實現
最近有乙個專案,要開始用資料訊號處理的一些知識,今天開始寫出自己的軌跡,有興趣的朋友可以關注一下!m 已經完成!本週內完成2 fft演算法實現的c 要求動態輸入長度值!1116 今天進展紀錄 完成了框架設計 完成了一些複數操作相關的子函式 在動態分配完結構體陣列記憶體空間操作的時候出現了一些問題 無...
快速傅利葉變換的基2FFT演算法的C 實現
快速傅利葉變換的基2fft演算法的c 實現 2011 01 19 05 26 快速傅利葉變換的基本原理由於公式不好顯示請讀者參考其它文章或書籍,本文重點給出了時域抽取法fft的c 實現。下面是演算法的流程圖 倒序的流程圖 c 實現 1.fft.h pragma once ifndef fft h d...