c - 数组上的就地位反转随机播放

标签 c signal-processing fft

对于 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/

相关文章:

c - 在 Windows 平台上使用 ANSI-C 可以获得精确到毫秒的系统时间吗?

matlab - MATLAB 中的二维自反卷积

algorithm - 什么是快速傅立叶变换?

c++ - 为什么 cufft 的输入和输出与传统的 fft 有很大不同?

python - 理解 python 中的 FFT 输出

c++ - 预处理器 : generate functions with dynamic name. 多重定义问题

c - 在父进程恢复执行之前等待所有子进程 UNIX

根据 C 中的宏参数调用特定函数

c# - 音符持续时间

具有 Matlab 生成系数的滤波器的 C 实现