对于FFT函数,我需要以位反转的方式对数组中的元素进行置换或混洗。这是FFT的常见任务,因为两种大小的FFT函数的大多数功能都是以位反转的方式期望或返回其数据。

例如。假设数组有256个元素,我想用位反转模式交换每个元素。这是两个示例(二进制):

Element 00000001b should be swapped with element 10000000b
Element 00010111b should be swapped with element 11101000b

等等。

任何想法如何快速,更重要地做到这一点:就地吗?

我已经有一个执行此交换的功能。写一个不难。由于这是DSP中的常见操作,因此我觉得比我非常幼稚的循环有更多巧妙的方法来执行此操作。

所讨论的语言是C,但是任何一种语言都可以。

最佳答案

要通过一次传递就地交换,请对递增索引中的所有元素进行一次迭代。仅当索引小于反向索引时才执行交换-这将跳过双重交换问题,并且回文情况(元素00000000b,10000001b,10100101b)也将变为相同的值,并且不需要交换。

// Let data[256] be your element array
for (i=0; i<256; i++)
    j = bit_reverse(i);
    if (i < j)
    {
        swap(data[i],data[j]);
    }

bit_reverse()可以使用Nathaneil的位操作技巧。
bit_reverse()将被调用256次,而swap()将被调用少于128次。

关于c - 阵列上的原位反转混洗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/932079/

10-12 18:59