我包含了来自 Sergey Chernenko 的 FFT 文章中的 C 函数。此函数通过执行奇偶分解来重新排列数据。但是不是使用位反转,而是通过以镜像方式添加 1 来实现,这比我测试过的其他反转代码要快得多。
/*
http://www.librow.com/articles/article-10 (Sergey Chernenko)
*/
void rearrange(float* Data, const unsigned int N) {
// Swap position
unsigned int Target = 0;
// Process all positions of input signal
for (unsigned int Position = 0; Position < N; ++Position)
{
// Only for not yet swapped entries
if (Target > Position)
{
// Swap entries
const float Temp = Data[Target];
Data[Target] = Data[Position];
Data[Position] = Temp;
}
// Bit mask
unsigned int Mask = N;
// While bit is set
while (Target & (Mask >>= 1))
// Drop bit
Target &= ~Mask;
// The current bit is 0 - set it
Target |= Mask;
}
}
我感兴趣的部分是镜像递增代码。我了解 C 中的按位操作,我可以在脑海中仔细阅读这个片段并验证它是否有效。我还不明白为什么它会起作用。我该如何想出这个解决方案?
// Bit mask
unsigned int Mask = N;
// While bit is set
while (Target & (Mask >>= 1))
// Drop bit
Target &= ~Mask;
// The current bit is 0 - set it
Target |= Mask;