2

私は数週間解決策を見つけようとしていますが、このトピックに関連するすべてのスレッドを実際に読んだので、誰かが私を助けてくれることを本当に願っています.

私がやりたいことは、ウェーブファイルを入力として使用し、それをフーリエ変換し、これらの値を取得して別のファイルと比較し、違いを取得することです。

私が長い間取り組んできた課題は、そのフーリエ変換を機能させることです。

妥当な結果が得られる代わりに、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 を使用しても機能するはずなので、とにかく 2 の因数で試してみてください。

Float-Decimal 変換のため、その try-catch でエラー メッセージを取得しようとしましたが、何も発生しません。

私の問題は、その fft で 4096 複素数を送信することです。それらはすべて Y=0 ですが、X はオーディオ ファイルに依存します (オーディオ fft には Y 値は必要ないことを別のスレッドで読んでください。 0 に設定する必要があります)。すべての X 値は通常の浮動小数点数であり、NaN ではありません。それでも、FFT は NaN でいっぱいの配列を返すだけです。

最初に System.Numerics.Complex の暗黙的な変換を試みましたが、うまくいきませんでした。

編集:FFTアルゴリズムに関するさらに多くの記事を読むことになりました。今でも、soundvalues als float を取得し、Complex-Array に変換しています。すべての変換ステップを一貫性があるようにチェックしましたが、その領域では問題ありません。だから私の質問は、私が本当にこれを使用するだけでよいかどうかです

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

または、Math.NET できれいな FFT を実行するためにその前に何かが必要な場合

4

1 に答える 1

0

buffer最初に 4096 要素を割り当ててから、すべての要素に Complex を割り当てるのはなぜですか? それは間違っているようです。

buffer[i].real = soundvalues[i],を設定するだけです.imag=0(文字通りではありません。私はC#を「話せません」)。

編集

https://msdn.microsoft.com/en-us/library/ee259559%28v=vs.110%29.aspxは、10 進数から複素数への暗黙的な変換があり、結果の複合体を (10 進数 + 0i) に設定することを説明しています。つまり、あなたはただすべきです

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

私の疑いは、あなたのサウンド値にはまだ NaN が含まれているということです。入力に問題があるのではないでしょうか?

于 2016-02-21T18:37:55.030 に答える