C FFT重排序相位
我有一些代码给你们。 这是快速傅里叶变换分裂算法的第一步 该算法应该做的是对数组重新排序,这样输入上的每个元素都将在输出的“二进制镜像”位置被替换 例如,元素X[4]将位于位置X[1],因为100的镜像表示为001 在这里,一切都很清楚。然而,进行这种重新排序的算法并不适用。至少我很难理解 第二个内循环做什么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(
// 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,我希望你能原谅我,我真的很抱歉。