C FFT重排序相位

C FFT重排序相位,c,algorithm,fft,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(

我有一些代码给你们。 这是快速傅里叶变换分裂算法的第一步

该算法应该做的是对数组重新排序,这样输入上的每个元素都将在输出的“二进制镜像”位置被替换

例如,元素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;
   }

}
//N是数组的长度
//p是表示索引所需的位数

对于(int n=0;n每次迭代,我们将
j
乘以2(这与左移1相同),然后将
m
的奇偶校验相加。然后我们将
m
整除2(这与右移1相同).
m
n
的值开始。因此,我们基本上是反转
n
中的位,并将其存储在
j

将整数视为一个位序列

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

这样,所有的操作都是从代码< M >代码的右边弹出,并把它们推到代码“j>代码> >的右边。< /p>你把这个标记为C,但是使用复杂的C++类型。我们用这一个方法来做什么?这是一个特别令人厌恶的方法来反转这里的问题:<代码> 1 < /C>,<代码> 2 < /C>nd

4
当“二进制镜像”都变成
1
@WeatherVane不同类型的镜像时,索引据说有
p
位,这些位镜像在
p
位的中间(而不是输入的中间)Michael Dorgan,我希望你能原谅我,我真的很抱歉。