1

私は .wav モノラル ファイル (16 ビット、44.1kHz) を持っており、以下のコードを使用しています。私が間違っていなければ、これは私がFFTを適用できる-1と1の間の値の出力を私に与えるでしょう(後でスペクトログラムに変換されます)。ただし、私の出力は -1 と 1 の近くにはありません。

これは私の出力の一部です

7.01214599609375  
17750.2552337646  
8308.42733764648  
0.000274658203125  
1.00001525878906  
0.67291259765625  
1.3458251953125  
16.0000305175781  
24932  
758.380676269531  
0.0001068115234375    

これは私が別の投稿
編集1から得たコードです:

 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 += 2)
        {
             data[i] = BitConverter.ToInt16(wave, i) / 32768.0;
        }


        /**************assigning sample rate**********************/
        for (int i = 24; i < 28; i++)
        {
            sR[i - 24] = wave[i];
        }
        SampleRate = BitConverter.ToInt16(sR, 0);
        return data;
    }  

編集2:2番目の数字ごとに0で出力されます

0.009002685546875
0
0.009613037109375
0
0.0101318359375
0
0.01080322265625
0
0.01190185546875
0
0.01312255859375
0
0.0150682653

4

1 に答える 1

3

サンプルが 16 ビットの場合 (そのように思われます)、 を使用する必要がありますInt16。サンプル データの各 2 バイトは、-32768 ~ 32767 の範囲の符号付き 16 ビット整数です。

Int16符号付きを -1 から 1 の浮動小数点値に変換する場合は、 Int16.MaxValue + 1(32768 に等しい) で除算する必要があります。したがって、コードは次のようになります。

for (int i = 0; i < data.Length; i += 2)
{
    data[i] = BitConverter.ToInt16(wave, i) / 32768.0;
}

値が署名されているため、ここでは 32768 を使用します。

したがって、-32768/32768 は -1.0 になり、32767/32768 は 0.999969482421875 になります。

65536.0 を使用した場合、値は -0.5 .. 0.5 の範囲になります。

于 2013-07-01T15:37:59.187 に答える