gpt4 book ai didi

c# - 简单的就地离散傅立叶变换 (DFT)

转载 作者:太空狗 更新时间:2023-10-29 20:55:46 26 4
gpt4 key购买 nike

我正在编写一个非常简单的就地 DFT。我正在使用此处显示的公式: 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);
}

你应该用数据[n]替换数据[k]

编辑:

你也在破坏你的数据:

data[k] = Math.Sqrt(real[k] * real[k] + imag[k] * imag[k]);

您必须将复数的模数存储在其他地方或以后。如果模数就是你想要的,并且你想将它存储在 data[] 中,你必须在计算转换后编写另一个循环。整个 data[] 是计算每个 real[k] 和 imag[k] 所必需的。

关于c# - 简单的就地离散傅立叶变换 (DFT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2726398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com