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;