我正在编写一个处理音频文件的应用程序,我需要分析我的新文件,获取其频谱并在其计算中进行更改。
我想使用快速傅里叶变换(FFT)来实现这一点。以下是我的递归C# FFT:
我想使用快速傅里叶变换(FFT)来实现这一点。以下是我的递归C# FFT:
void ft(float n, ref Complex[] f)
{
if (n > 1)
{
Complex[] g = new Complex[(int) n / 2];
Complex[] u = new Complex[(int) n / 2];
for (int i = 0; i < n / 2; i++)
{
g[i] = f[i * 2];
u[i] = f[i * 2 + 1];
}
ft(n / 2, ref g);
ft(n / 2, ref u);
for (int i = 0; i < n / 2; i++)
{
float a = i;
a = -2.0f * Mathf.PI * a / n;
float cos = Mathf.Cos(a);
float sin = Mathf.Sin(a);
Complex c1 = new Complex(cos, sin);
c1 = Complex.Multiply(u[i], c1);
f[i] = Complex.Add(g[i], c1);
f[i + (int) n / 2] = Complex.Subtract(g[i], c1);
}
}
}
这个鼓舞人心的例子来自于
接着,我将我的结果与wolframalpha使用相同的输入参数0.6,0.7,0.8,0.9
进行比较,但结果不相同。我的结果是Wolfram的两倍,虚部是Wolfram的负二倍。
此外,维基百科表明可以使用以下方法计算FFT的逆变换:
但是我比较输入和输出,它们是不同的。
有人知道问题出在哪里吗?