让 Math.NET 傅里叶工作

本文关键字:工作 傅里叶 NET Math | 更新日期: 2023-09-27 18:35:39

我正在尝试寻找解决方案几个星期,我真的已经阅读了与此主题相关的所有线程,所以我真的希望有人可以帮助我解决这个问题。

我想做的是使用波形文件作为输入,对其进行傅里叶变换,并获取这些值将它们与另一个文件进行比较并获得差异。

我一直在研究的挑战是让傅里叶变换发挥作用。

我没有给我合理的结果,我只得到 NaN 值。

我有以下代码:

public FFTPerformer(float[] soundvalues)
    {
        buffer = new System.Numerics.Complex[4096];
        try {
            for (int i = 0; i < 4096; i++)
            {
                System.Numerics.Complex tmp = new System.Numerics.Complex(soundvalues[i], 0);
                buffer[i] = tmp;
            }
        }
        catch(Exception ex)
        {
            System.Windows.MessageBox.Show("Es ist ein Fehler bei der Konvertierung des float arrays zum Complex-Array aufgetreten; " + ex.Message);
        }
    }

4096 通常被一个更高的数字取代,它仍然是 2 的幂,但它甚至不适用于那个数字。

public void performFFT()
    {
        try
        {
            MathNet.Numerics.IntegralTransforms.Fourier.Forward(buffer, MathNet.Numerics.IntegralTransforms.FourierOptions.Matlab);
        }
        catch(Exception ex)
        {
            System.Windows.MessageBox.Show("Fehler: " + ex.Message);
        }
    }

更详细的描述:我为 4096 个值设置了长度,因为这是 2 的倍数,并且此长度仅用于测试目的,因此检查速度比使用数百万个值的原始声音文件要快一些;)所以这只是这样,只要算法没有被证明有效。这也是奇怪的for循环的原因。即使是强悍的 Math.Net 也使用Bluestein的算法进行计算,无论如何都要尝试使用两个数组的因子,因为即使它们使用任何其他算法atm,它们也应该工作。

由于浮点十进制转换,试图通过该 try-catch 获取错误消息,但它没有引发任何错误消息。

我的问题是,我在那个 fft 中发送了 4096 个复数,它们都有 Y=0,但 X 取决于音频文件(在另一个线程中读到 Y 值不需要 audio-fft 所以你应该将它们设置为 0)。所有 X 值都是正常的浮点数,没有 NaN。但是,FFT仍然只是返回了一个充满NaN的阵列。

我首先尝试将转换为 System.Numerics.Complex 隐式,但没有成功,所以我使用 tmp 变量构造。

编辑:我最终阅读了更多关于FFT算法的文章。现在我仍然让我的声音值 als 浮点并将它们转换为复数组。我检查了所有转换步骤以保持一致性,在这方面很好。所以我的问题是我是否真的只需要使用它

MathNet.Numerics.IntegralTransforms.Fourier.Forward(buffer, MathNet.Numerics.IntegralTransforms.FourierOptions.Matlab);

或者如果我在此之前需要一些东西来做一个干净的 FFT Math.NET

让 Math.NET 傅里叶工作

为什么首先分配具有 4096 个元素的buffer,然后为每个元素分配一个复合体?这看起来不对劲。

只需设置 buffer[i].real = soundvalues[i].imag=0(从某种意义上说,不是字面意思。我不"说"C#)。

编辑

https://msdn.microsoft.com/en-us/library/ee259559%28v=vs.110%29.aspx 解释了从 Decimal 到 Complex 的隐式转换,将生成的 Complex 设置为 (Decimal + 0i); 这意味着您应该只

for (int i = 0; i < 4096; i++)
{
    buffer[i] = soundvalues[i];
}

我怀疑你的音值仍然包含NaN;也许你的输入有问题?