我一直在花时间理解并实施我自己的混合基数抽取时间快速傅立叶变换。我主要使用kiss_fft和http://www.briangough.com/fftalgorithms.pdf来了解发生了什么。
从我所读过的内容来看,我可以通过使用共轭旋转因子来反转fft。
然而,当我阅读kiss_fft源代码时,radix-4实现实际上测试我们是在进行正向变换还是反向变换,并使用稍微不同的数学。
https://github.com/itdaniher/kissfft/blob/master/kiss_fft.c#L77
if(st->inverse) {
Fout[m].r = scratch[5].r - scratch[4].i;
Fout[m].i = scratch[5].i + scratch[4].r;
Fout[m3].r = scratch[5].r + scratch[4].i;
Fout[m3].i = scratch[5].i - scratch[4].r;
}else{
Fout[m].r = scratch[5].r + scratch[4].i;
Fout[m].i = scratch[5].i - scratch[4].r;
Fout[m3].r = scratch[5].r - scratch[4].i;
Fout[m3].i = scratch[5].i + scratch[4].r;
}
我认为所使用的fft计算是前向和反向fft的相同(就像kiss_fft&#26的基数-2,3和5实现一样)。
为什么kiss_fft radix-4计算需要这样做?
答案 0 :(得分:1)
如果您通过向量复数共轭在该计算之前,则可以对IFFT使用相同的radix-4计算内核。或者您可以跳过执行单独的先前向量复合共轭操作,并使用具有内置共轭的不同radix-4计算内核。
使用内置的共轭执行Radix-4可以在某些处理器体系结构上提供更好的寄存器重用。
注意,在将IFFT与FFT相关的等式中包括2个复共轭。反向旋转旋转因子只关注其中一个因素。