我實現下面一個簡單的FFT(最終變被忽略):如何更改遞歸碼迭代形式
typedef complex<double> base;
vector<base> w;
int FFTN = 1024;
void fft(vector<base> &fa){
int n = fa.size();
if (n==1) return;
int half = (n>>1);
vector<base> odd(half),even(half);
for(int i=0,j = 0;i<n;i+=2,j++) {
even[j] = fa[i];
odd[j] = fa[i+1];
}
fft(odd);
fft(even);
int fact = FFTN/n;
for (int i=0;i<half;i++){
fa[i] = even[i] + odd[i] * w[i * fact];
fa[i + half] = even[i] - odd[i] * w[i * fact];
}
}
它運作良好。但我堅持將其轉換爲迭代形式。我已經嘗試到目前爲止:
int n = fa.size();
int fact = (FFTN>>1);
int half = 1;
while(half<n){
for(int i=0;i<n/half;i+=2){
base even = fa[i], odd = fa[i+1];
fa[i] = even + odd * w[i*fact];
fa[i+half] = even - odd*w[i*fact];
}
for(int j=0;j<n/half;j++)
fa[j] = fa[j+half];
fact >>= 1;
half <<= 1;
}
有人可以幫助我的轉換技巧嗎?
作爲一個好處,你可以使用更少的逗號運算符嗎?和更多的括號?其次,你爲什麼要一個迭代版本? – Yakk 2015-01-15 16:29:09
@Yakk感謝您的建議。我改變了編碼格式。我想比較速度的確如此,因爲據說遞歸由於被稱爲子函數在堆棧中的存儲而有時較慢。 – ChuNan 2015-01-15 16:33:54
主要問題是您將迭代調用兩次,使得難以在迭代版本中轉換此實現。它可能不會回答你的問題,但我正在使用這個簡單的FFT實現,結果非常快(算法第1章 - 附錄B):http://paulbourke.net/miscellaneous/dft/ – oddstar 2015-01-15 16:40:11