需要帮助理解 FFT 算法中的这一行
Need help understanding this line in an FFT algorithm
在我的程序中,我有一个执行快速傅立叶变换的函数。我知道有非常好的免费实现,但这是一个学习的东西,所以我不想使用它们。我最终通过以下实现找到 this comment(它源自 FFT 的意大利条目):
void transform(complex<double>* f, int N) //
{
ordina(f, N); //first: reverse order
complex<double> *W;
W = (complex<double> *)malloc(N / 2 * sizeof(complex<double>));
W[1] = polar(1., -2. * M_PI / N);
W[0] = 1;
for(int i = 2; i < N / 2; i++)
W[i] = pow(W[1], i);
int n = 1;
int a = N / 2;
for(int j = 0; j < log2(N); j++) {
for(int k = 0; k < N; k++) {
if(!(k & n)) {
complex<double> temp = f[k];
complex<double> Temp = W[(k * a) % (n * a)] * f[k + n];
f[k] = temp + Temp;
f[k + n] = temp - Temp;
}
}
n *= 2;
a = a / 2;
}
free(W);
}
我现在已经做了很多改变,但这是我的起点。我所做的其中一项更改是不缓存旋转因子,因为我决定先看看是否需要它。现在我决定我确实要缓存它们。这个实现的方式似乎是它有一个长度为 N/2
的数组 W
,其中每个索引 k
都有值 。我不明白的是这个表达式:
W[(k * a) % (n * a)]
请注意 n * a
始终等于 N/2
。我知道这应该等于 , and I can see that ,这是它所依赖的。我还知道可以在这里使用模数,因为旋转因子是循环的。但有一件事我不明白:这是一个长度为 N 的 DFT,但只计算了 N/2
个旋转因子。数组长度不应该是N,取模应该是N吗?
But there's one thing I don't get: this is a length-N DFT, and yet only N/2 twiddle factors are ever calculated. Shouldn't the array be of length N, and the modulo should be by N?
旋转因子是单位圆上等距的点,由于N是power-of-two所以点数是偶数。绕过半圈后(从 1 开始,逆时针在 X-axis 上方),下半圈是上半圈的重复,但这次在 X-axis 下方(点可以是通过原点反映)。这就是第二次减去 Temp
的原因。该减法是旋转因子的否定。
在我的程序中,我有一个执行快速傅立叶变换的函数。我知道有非常好的免费实现,但这是一个学习的东西,所以我不想使用它们。我最终通过以下实现找到 this comment(它源自 FFT 的意大利条目):
void transform(complex<double>* f, int N) //
{
ordina(f, N); //first: reverse order
complex<double> *W;
W = (complex<double> *)malloc(N / 2 * sizeof(complex<double>));
W[1] = polar(1., -2. * M_PI / N);
W[0] = 1;
for(int i = 2; i < N / 2; i++)
W[i] = pow(W[1], i);
int n = 1;
int a = N / 2;
for(int j = 0; j < log2(N); j++) {
for(int k = 0; k < N; k++) {
if(!(k & n)) {
complex<double> temp = f[k];
complex<double> Temp = W[(k * a) % (n * a)] * f[k + n];
f[k] = temp + Temp;
f[k + n] = temp - Temp;
}
}
n *= 2;
a = a / 2;
}
free(W);
}
我现在已经做了很多改变,但这是我的起点。我所做的其中一项更改是不缓存旋转因子,因为我决定先看看是否需要它。现在我决定我确实要缓存它们。这个实现的方式似乎是它有一个长度为 N/2
的数组 W
,其中每个索引 k
都有值
W[(k * a) % (n * a)]
请注意 n * a
始终等于 N/2
。我知道这应该等于 N/2
个旋转因子。数组长度不应该是N,取模应该是N吗?
But there's one thing I don't get: this is a length-N DFT, and yet only N/2 twiddle factors are ever calculated. Shouldn't the array be of length N, and the modulo should be by N?
旋转因子是单位圆上等距的点,由于N是power-of-two所以点数是偶数。绕过半圈后(从 1 开始,逆时针在 X-axis 上方),下半圈是上半圈的重复,但这次在 X-axis 下方(点可以是通过原点反映)。这就是第二次减去 Temp
的原因。该减法是旋转因子的否定。