我使用np.fft在Python中实现了一个信号处理FFT算法(太简单了)。现在,我正在使用整数算法在C中进行此操作。经过一些研究,我发现互联网上最受欢迎的整数FFT库之一是Roberts,Slaney和Bouras,它们可以在许多地方找到,包括第二个条目here。fft,< / p>
有一些我不理解的概念,我希望得到指导。 具体来说,上面链接的库中包含的示例脚本通过将信号的所有偶数索引放在前半部分并将奇数索引放在信号的后半部分,将输入信号分成两个实部和虚部。 / p>
for (i=0; i<N; i++){
x[i] = AMPLITUDE*cos(i*FREQUENCY*(2*3.1415926535)/N);
if (i & 0x01) // only odd index
fx[(N+i)>>1] = x[i]; // N+i >> 1 is len(input)+i/2
else // only even index
fx[i>>1] = x[i];
}
fix_fftr(fx, log2N, 0);
信号阵列没有改变长度,但现在包含两个几乎相同的信号。然后FFT驱动函数(fix_fftr)将整个输入信号作为参数并完成相同的操作
if (inverse)
scale = fix_fft(fr, fi, m-1, inverse);
for (int i=1; i<n; i+=2) {
tt = f[n+i-1]; // even index
f[n+i-1] = f[i]; // odd index into the second half
f[i] = tt; // even index into the first half
}
if (!inverse)
scale = fix_fft(fr, fi, m-1, inverse);
return scale;
是什么原因?
答案 0 :(得分:0)
第一部分是计算旋转因子,它是给定长度FFT的常数,与数据无关。
第二部分似乎是基于递归位反转寻址的数据混洗的一部分,递归位反转寻址是就地FFT中的一个组件。