這學期在學matlab
大學完全沒用過...
因此以下若有錯誤可以提出糾正
日前
在網路上都找不太到用matlab寫的cooley-tukey快速傅立葉演算法(其實是作業寫不出來上網查)
搞了半天就寫出來了
這邊是設定輸入序列的長度需為2的次方(因為沒做零填補運算)
並以時域間取法來做計算
具體的流程與公式可參考wiki
程式碼如下:
(輸入序列A輸出轉換過的序列X)
簡單的說
就是先將輸入的序列做排序
排序的方式為
先將索引轉成2進制然後反轉
再轉回十進制
產生新的索引序列
接著再依照公式做利用規則與對稱性做運算
大學完全沒用過...
因此以下若有錯誤可以提出糾正
日前
在網路上都找不太到用matlab寫的cooley-tukey快速傅立葉演算法
搞了半天就寫出來了
這邊是設定輸入序列的長度需為2的次方(因為沒做零填補運算)
並以時域間取法來做計算
具體的流程與公式可參考wiki
程式碼如下:
(輸入序列A輸出轉換過的序列X)
clear all;
A=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
% Fa=fft(A); %檢查用
L=length(A);
%先對序列做排序
inx=swap_index(L);
for i=1:L
X(i)=A(inx(i)+1);
end
K=0;
index=1;
for d=1:log2(L) %d代表流程數
for e=1:L/(2^d) %每流程的對稱點數
for g=1:2^(d-1) %上群
W(index)=X(index)+exp((-1i*2*pi*K)/L)*X(index+(2^(d-1)));
index=index+1;
K=K+(L/(2^d));
end
for g=1:2^(d-1) %下群
W(index)=X(index-(2^(d-1)))+exp((-1i*2*pi*K)/L)*X(index);
index=index+1;
K=K+(L/(2^d));
end
K=0;
end
for t=1:L %更新
X(t)=W(t);
end
index=1;
end
swap_index()function [ inx ] = swap_index( L )
dep=log2(L);
for i=0:L-1
temp=dec2bin(i,dep)-48;
a=0;
for j=dep-1:-1:0
a=a+((2^j)*temp(j+1));
end
inx(i+1)=a;
end
end
簡單的說
就是先將輸入的序列做排序
排序的方式為
先將索引轉成2進制然後反轉
再轉回十進制
產生新的索引序列
接著再依照公式做利用規則與對稱性做運算
留言
張貼留言