1

DirectSoundバッファを含むいくつかのメンテナンス作業を行っています。バッファ内の要素を解釈する方法、つまり、バッファ内の各値が何を表すかを知りたいです。このデータはマイクからのものです。

この波形フォーマットが使用されています:

WAVEFORMATEXTENSIBLE format = {
  { WAVE_FORMAT_EXTENSIBLE, 1, sample_rate, sample_rate * 4, 4, 32, 22 },
  { 32 }, 0, KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
};

私の目標は、マイクの無音を検出することです。私は現在、各バッファー要素の強度がボリュームに直接対応していると仮定して、バッファー内のすべての値がボリュームのしきい値を超えていないかどうかを判断することでこれを達成しています。

これは私が現在試していることです:

bool is_mic_silent(float * data, unsigned int num_samples, float threshold)
{
  float * max_iter = std::max_element(data, data + num_samples);
  if(!max_iter) {
    return true;
  }

  float max = *max_iter;
  if(max < threshold) {
    return true;
  }

  return false;  // At least one value is sufficiently loud.
}
4

3 に答える 3

2

MSN が言ったように、サンプルは 32 ビット浮動小数点数です。無音を検出するには、通常、RMS 値を計算します。ある時間間隔 (20 ~ 50 ミリ秒など) でサンプル値の2 乗の平均を取り、この平均 (の平方根) をしきい値と比較します。マイク信号に固有のノイズにより、単一のサンプルがしきい値を超えて到達する可能性がありますが、周囲の音は依然として無音と見なされます。短い間隔で平均化すると、私たちの知覚によりよく対応する値が得られます。

于 2009-03-05T08:22:34.953 に答える
0

ここから、浮動小数点 PCM 値は [-1, 1] からとなります。

于 2009-03-04T22:08:30.793 に答える
0

サンプルを平均化するというハンの提案に加えて、しきい値を調整することを検討してください。さまざまな環境下で、さまざまなマイクとさまざまなオーディオ チャンネルを使用すると、「沈黙」は多くのことを意味します。

簡単な方法は、しきい値を設定することです。または、しきい値を取得する「ノイズフロア測定」を許可します。

サンプルは線形ですが、オーディオ処理のレベルは通常dBで示されることに注意してください。そのため、ターゲット オーディエンスによっては、読み値と入力を dB に変換したり、dB から変換したりする必要がある場合があります。

于 2009-03-05T09:28:13.733 に答える