为什么 kiss_fft 的正向和逆向 radix-4 计算不同?
Why is the kiss_fft's forward and inverse radix-4 calculation different?
我一直在花时间了解和实现我自己的混合基数实时抽取快速傅立叶变换。我主要使用 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 计算与正向和反向 ffts 的相同(就像 kiss_fft 的基数 2、3 和 5 实现一样).
为什么kiss_fftradix-4计算需要这样做?
如果您在 IFFT 计算之前使用向量复数共轭,则可以使用相同的 radix-4 计算内核。或者,您可以跳过单独执行前面的向量复数共轭操作,并使用具有内置共轭的不同 radix-4 计算内核。
使用内置共轭进行 Radix-4 可能会在某些处理器架构上提供更好的寄存器重用。
请注意,将 IFFT 与 FFT 相关联的方程式中包含 2 个复数共轭。反向旋转旋转因子只关注其中之一。
我一直在花时间了解和实现我自己的混合基数实时抽取快速傅立叶变换。我主要使用 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 计算与正向和反向 ffts 的相同(就像 kiss_fft 的基数 2、3 和 5 实现一样).
为什么kiss_fftradix-4计算需要这样做?
如果您在 IFFT 计算之前使用向量复数共轭,则可以使用相同的 radix-4 计算内核。或者,您可以跳过单独执行前面的向量复数共轭操作,并使用具有内置共轭的不同 radix-4 计算内核。
使用内置共轭进行 Radix-4 可能会在某些处理器架构上提供更好的寄存器重用。
请注意,将 IFFT 与 FFT 相关联的方程式中包含 2 个复数共轭。反向旋转旋转因子只关注其中之一。