Интерпретация буферных элементов DirectSound с устройства захвата микрофона - PullRequest
1 голос
/ 04 марта 2009

Я выполняю некоторые работы по техническому обслуживанию с использованием буферов 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.
}

Ответы [ 3 ]

2 голосов
/ 05 марта 2009

Как сказал MSN, сэмплы находятся в 32-битных числах. Чтобы обнаружить тишину, вы обычно рассчитываете среднеквадратичное значение: возьмите среднее значение в квадрате выборочных значений за некоторый интервал времени (скажем, 20-50 мс) и сравните (квадратный корень из) это среднее значение с порогом. Шум, свойственный сигналу микрофона, может позволить одиночным выборкам достичь порогового значения, в то время как окружающий звук все равно будет считаться тишиной. Усреднение по короткому интервалу приведет к значению, которое лучше соответствует нашему восприятию.

0 голосов
/ 05 марта 2009

В дополнение к предложению Хана усреднить образцы, также рассмотрите возможность калибровки вашего порогового значения. В разных средах, с разными микрофонами и разными аудиоканалами, «тишина» может многое значить.

Простым способом было бы бездельничать, чтобы настроить порог. В качестве альтернативы, разрешите «Измерение уровня шума», где вы получаете пороговое значение.

Обратите внимание, что сэмплы являются линейными, но уровни при обработке звука обычно задаются в дБ . Поэтому, в зависимости от целевой аудитории, вы можете преобразовать показания и входные данные в дБ и обратно.

0 голосов
/ 05 марта 2009

С здесь , значения PCM с плавающей запятой из [-1, 1].

...