需要帮助理解 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 的原因。该减法是旋转因子的否定。