2012-04-19 10 views
0

私は、次のコードを使用してNAudioを使用してマイクを読んでいます:私は、平均コードであまり働いていないはどうすればNAudio WaveInから16ビットのサンプルを構築するのですか?

WaveIn waveInStream; 
    WaveFileWriter waveFileWriter; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     waveInStream = new WaveIn(); 
     waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable); 
     waveInStream.StartRecording(); 
     waveFileWriter = new WaveFileWriter("D:\\output.wav", waveInStream.WaveFormat); 
    } 

    void waveInStream_DataAvailable(object sender, WaveInEventArgs e) 
    { 
     UInt64 allVals = 0; 
     for (int i = 0; i < e.BytesRecorded; i += 2) 
     { 
      allVals += (UInt64)(((int)e.Buffer[0] << 16) | ((int)e.Buffer[1])); 
     } 
     UInt64 avg = allVals/((UInt64)e.BytesRecorded * 2); 
     avg /= 1000; 
     textBox1.AppendText(avg.ToString() + "\r\n"); 
     waveFileWriter.Write(e.Buffer, 0, e.BytesRecorded); 
    } 

    private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     waveInStream.StopRecording(); 
     waveInStream.Dispose(); 
     waveFileWriter.Close(); 
    } 

。しかし、正しいエンディアンを使用して16ビット値を正しく構成しているかどうかは疑問です。私は両方の方法を試みましたが、私は部屋の音量に比例した値を得ていません。符号なしの値を用いて平均値を算出するあなたの試みは動作しないように

答えて

2

16ビットサンプルは、ゼロを表す無音と、署名されています。 Int16サンプルの絶対値を使用する必要があります。

ビットシフトに慣れていない場合には、バイトをサンプルに変換する別の方法は、BitConverterクラスを使用することです(表示されたコードは機能しません)。

+0

ありがとう!私は理論的な誤解があることを知っていました。 – Salil

+0

はちょうど私を救った、ありがとうマーク! –

関連する問題