4

私はしばらく訪問しているのに初めて尋ねます。

ここに問題があります:

私は現在、次のプロパティを使用してWAVEデータファイルに含まれる信号の基本周波数を分離しようとしています。

  • PCMオーディオフォーマット、すなわちライナーの量子化
  • 8000Hzサンプルレート
  • サンプルあたり16ビット
  • 16000バイトレート

1つのチャネルのみインターリーブはありません。

バイト値の取得:

System.IO.FileStream WaveFile = System.IO.File.OpenRead(@"c:\tet\fft.wav");
        byte[] data = new byte[WaveFile.Length];
        WaveFile.Read(data,0,Convert.ToInt32(WaveFile.Length));

これをDoubleの配列に変換します。

 for (int i = 0; i < 32768; i++)//this is only for a relatively small chunk of the file 
        {
           InReal[i] =BitConverter.ToDouble(data, (i + 1) * 8 + 44);
        }

そしてそれを変換関数に最終的に渡します。

       FFT FftObject = new FFT();
       FftObject.Transform(InReal, InImg, 0, 32768, out outReal, out outImg, false);

最初の質問は、wavファイルのPCM値が-1と1の境界にある必要があることを理解しているためですが、Doubleに変換すると、次の値が得られます。

 2.65855908666825E-235
 2.84104982662944E-285
-1.58613492930337E+235
-1.25617351166869E+264
 1.58370933499389E-242
 6.19284549187335E-245
-2.92969500042228E+254
-5.90042665390976E+226
 3.11954507295188E-273
 3.06831908609091E-217
 NaN
 2.77113146323761E-302
 6.76597919848376E-306
-1.55843653898344E+291

これらは、これらの制限内のアレイの最初のいくつかであり、残りのアレイでもあります。

私の結論は、ある種のコードの誤動作がありますが、それを見つけることができるようです。どんな助けでもいただければ幸いです。

そして2番目の質問は、応答ベクトルでFFTアルゴリズムに実際のデータのみを提供しているため、実際の部分のデータのみを期待する必要がありますか?

どうもありがとうございます。

4

1 に答える 1

2

私はついに何が悪いのかを知ることができました。データ表現で信号のパルス符号変調を考慮していなかったようです。ここでフーリエ変換の準備をしているウェーブファイルで多くの未回答の質問を見つけたので、ウェーブファイルを準備する関数のコード。

public static Double[] prepare(String wavePath, out int SampleRate)

    {
        Double[] data;
        byte[] wave;
        byte[] sR= new byte[4];
        System.IO.FileStream WaveFile = System.IO.File.OpenRead(wavePath);
        wave = new byte[WaveFile.Length];
        data = new Double[(wave.Length - 44) / 4];//shifting the headers out of the PCM data;
        WaveFile.Read(wave,0,Convert.ToInt32(WaveFile.Length));//read the wave file into the wave variable
        /***********Converting and PCM accounting***************/
        for (int i = 0; i < data.Length - i * 4; i++)
        {
            data[i] = (BitConverter.ToInt32(wave, (1 + i) * 4)) / 65536.0;
            //65536.0.0=2^n,       n=bits per sample;
        }
        /**************assigning sample rate**********************/
        for (int i = 24; i < 28; i++)
        {
            sR[i-24]= wave[i];
        }
        SampleRate = BitConverter.ToInt32(sR,0);
        return data;
    }

ここで行う必要があるのは、サンプルレートと返された結果をFFTアルゴリズムに送信することだけです。コードは処理されないため、必要に応じて独自に処理してください。私は、忙しい、呼び出し中の、そしてスピーチの電話録音についてテストされました、それは正しく機能します。

于 2012-12-01T17:12:21.330 に答える