我正在编写一个非常简单的原地离散傅里叶变换。我使用这里显示的公式,以及欧拉公式来避免仅为此目的使用复数类。到目前为止,我的代码如下:
private void fft(double[] data)
{
double[] real = new double[256];
double[] imag = new double[256];
double pi_div_128 = -1 * Math.PI / 128;
for (int k = 0; k < 256; k++)
{
for (int n = 0; n < 256; n++)
{
real[k] += data[k] * Math.Cos(pi_div_128 * k * n);
imag[k] += data[k] * Math.Sin(pi_div_128 * k * n);
}
data[k] = Math.Sqrt(real[k] * real[k] + imag[k] * imag[k]);
}
}
但是Math.Cos和Math.Sin术语最终会变成正数和负数,所以当我将这些术语乘以data [k]并加起来时,它们会互相抵消,而我只得到一些非常小的值。我知道它是如何发生的,但我无法理解我的代码可能如何歪曲数学。任何帮助都将不胜感激。顺便说一下,我必须自己编写代码,我意识到我可以获得现成的FFT。