我实现下面一个简单的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