C# C语言中的逆FFT#

C# C语言中的逆FFT#,c#,fft,ifft,C#,Fft,Ifft,我正在写一个程序音频文件的应用程序,我必须分析我的新文件,得到它的频谱,并改变它的计算结果 我想用快速傅立叶变换(FFT)来实现这一点。这是我的递归C#FFT: void ft(浮点数n,参考复数[]f) { 如果(n>1) { 复合物[]g=新复合物[(int)n/2]; 复合物[]u=新复合物[(int)n/2]; 对于(int i=0;i

我正在写一个程序音频文件的应用程序,我必须分析我的新文件,得到它的频谱,并改变它的计算结果

我想用快速傅立叶变换(FFT)来实现这一点。这是我的递归C#FFT:

void ft(浮点数n,参考复数[]f)
{
如果(n>1)
{
复合物[]g=新复合物[(int)n/2];
复合物[]u=新复合物[(int)n/2];
对于(int i=0;i
鼓舞人心的例子是

然后,我将我的结果与相同输入的结果进行了比较
0.6,0.7,0.8,0.9
,但结果并不相同。我的结果是Wolfram的两倍,虚部是Wolfram的-2倍

此外,wiki指出,FFT的逆运算可以用

但是我比较了输入和输出,它们是不同的


有人知道怎么了吗

不同的实现通常使用不同的离散傅里叶变换(DFT)定义,结果也相应不同。实现之间的对应关系通常相当简单(例如比例因子)

更具体地说,您的实现基于DFT的以下定义:

另一方面,Wolfram alpha默认使用,调整为基于0的索引后,如下所示:

相应地,可以将实现的结果转换为与Wolfram alpha匹配的结果:

void toWolframAlphaDefinition(ref Complex[] f)
{
  float scaling = (float)(1.0/Math.Sqrt(f.Length));
  for (int i = 0; i < f.Length; i++)
  {
    f[i] = scaling * Complex.Conjugate(f[i]);
  }
}
void toholframalphadeinition(ref Complex[]f)
{
浮点缩放=(浮点)(1.0/Math.Sqrt(f.Length));
对于(int i=0;i
现在,关于使用正变换计算逆DFT,该公式的直接实现

你所提供的将是:

void inverseFt(ref Complex[] f)
{
  for (int i = 0; i < f.Length; i++)
  {
    f[i] = Complex.Conjugate(f[i]);
  }
  ft(f.Length, ref f);
  float scaling = (float)(1.0 / f.Length);
  for (int i = 0; i < f.Length; i++)
  {
    f[i] = scaling * Complex.Conjugate(f[i]);
  }
}
void inverseFt(ref Complex[]f)
{
对于(int i=0;i
因此,对原始序列调用
ft
可以得到转换后的序列
3,-0.2+0.2j,-0.2,-0.2-0.2j


在此转换序列上进一步调用
inverseFt
,将使您返回原始序列
0.6、0.7、0.8、0.9
(在合理的浮点误差范围内),如所示。

查找处理FFT的现有库。我不确定你希望从其他人为你调试代码中得到什么。我想要有fft经验的人,如何向我解释如何获得fft的逆函数?例如,使用其他算法,或者这是不可能的。我的代码工作正常。我尝试用正弦和余弦输入,得到正确的输出。那么这个反函数只适用于wolfram定义吗?如果是,第一个DFT定义的函数是什么?@WDUK
inverseFt
适用于OP的原始
ft
实现(以及DFT的相应定义),如
ideone
演示所示。
void inverseFt(ref Complex[] f)
{
  for (int i = 0; i < f.Length; i++)
  {
    f[i] = Complex.Conjugate(f[i]);
  }
  ft(f.Length, ref f);
  float scaling = (float)(1.0 / f.Length);
  for (int i = 0; i < f.Length; i++)
  {
    f[i] = scaling * Complex.Conjugate(f[i]);
  }
}