FFT重新排序阶段

时间:2015-04-21 18:29:32

标签: c algorithm fft

我为你们准备了一些代码。 这是快速傅立叶变换分裂算法的第一步。

算法应该做的是重新排序数组,使输入上的每个元素都在输出的“二进制镜像”位置移位。

例如,元素X [4]将位于位置X [1],因为100的镜像表示为001.

直到这里,一切都很清楚。但是,执行此类重新排序的算法不是。至少我很难理解。

第二个内循环有什么作用?

// N is the length of the array
// p is the number of bits needed to represent the index

for(int n=0; n<N; n++) {

   int j=0; 
   int m=n;
   for(int i=0; i<p; i++) {
     j = 2∗j + m%2; m = m/2;
   }

   if ( j>n) { 
     complex<double> h;
     h = X[j]; 
     X[j] = X[n]; 
     X[n] = h;
   }

}

2 个答案:

答案 0 :(得分:2)

将整数视为位序列。

  • j = 2j这会弹出左侧的位并将零推入右侧
  • m % 2获得正确的位
  • m = m / 2弹出右侧的位并按下左侧最左侧位的副本
  • j + xj的最右位设置为x,假设该位当前为零且x01

所以这样做就是从m的右侧弹出一些位并将它们推到j的右侧。

答案 1 :(得分:0)

每次迭代,我们将j乘以2(与左移1相同),然后加上m的奇偶校验。然后我们将m的整数除以2(与向右移1相同)。 mn的值开头。因此,我们基本上将n中的位反转,并将其存储在j