这种朴素的离散傅立叶变换实现
std::vector<Complex> dft(const std::vector<Complex>& f) {
const int fSize = f.size();
const double invSize = 1.0 / fSize;
constexpr double pi2 = 2.0 * M_PI;
double angle, sine, cosine;
std::vector<Complex> dft(fSize, {0, 0});
for (int i = 0; i < fSize; ++i) {
for (int j = 0; j < fSize; ++j) {
angle = pi2 * i * j * invSize;
sine = sin(angle);
cosine = cos(angle);
dft[i].re += f[j].re * cosine + f[j].im * sine;
dft[i].im += -f[j].re * sine + f[j].im * cosine;
}
}
return dft;
}
对某些数据给出以下结果(不重要)
1. {-0.00000038201086502 0.00000000000000000},
2. {-0.00000040302553015 -0.00000001563922637},
3. {-0.00000043769125518 -0.00000003402005333},
4. {-0.00000164761818487 -0.00000019257894896}
但是如果我们不使用invSize常量并将角度定义为
angle = pi2 * i * j / fSize;
对于相同的数据,我们将获得以下结果
1. {-0.00000038201086502 0.00000000000000000},
2. {-0.00000040302553033 -0.00000001563922643},
3. {-0.00000043769125391 -0.00000003402005341},
4. {-0.00000164761818622 -0.00000019257895092}
为什么会发生这种情况,更精确的结果是什么?