0

次のコードを使用してNAudioを使用してマイクを読んでいます。

    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ビット値を正しく構築しているとは思えません。両方の方法を試しましたが、部屋の音のレベルに比例する値が得られません。

4

1 に答える 1

3

16 ビットのサンプルは符号付きで、ゼロは無音を表すため、符号なしの値を使用して平均を計算しようとしてもうまくいきません。Int16サンプルの絶対値を使用する必要があります。

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

于 2012-04-19T13:42:41.767 に答える