我正在编写一个非常简单的就地 DFT。我正在使用此处显示的公式:http://en.wikipedia.org/wiki/Discrete_Fourier_transform#Definition http://en.wikipedia.org/wiki/Discrete_Fourier_transform#Definition与欧拉公式一起避免为此使用复数类。到目前为止我有这个:
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。
我相信您在这一部分有一个错误
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] 替换为 data[n]
EDIT:
您还破坏了您的数据:
data[k] = Math.Sqrt(real[k] * real[k] + imag[k] * imag[k]);
您必须将复数的模数存储在其他地方或稍后。如果模数就是您想要的,并且您想将其存储在 data[] 中,则必须在计算变换后编写另一个循环。,整个 data[] 对于计算每个 real[k] 和 imag [k] 是必要的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)