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 毫秒)内取平方样本值的平均值,并将该平均值与阈值进行比较(平方根)。麦克风信号中固有的噪声可能会让单个样本达到阈值以上,而环境声音仍将被视为无声。短时间间隔内的平均将产生一个更符合我们感知的值。

于 2009-03-05T08:22:34.953 回答
0

除了 Han 对平均样本的建议外,还考虑校准您的阈值。在不同的环境下,使用不同的麦克风和不同的音频通道,“沉默”可能意味着很多事情。

简单的方法是配置阈值。或者,允许在其中获取阈值的“本底噪声测量”。

请注意,样本是线性的,但音频处理中的电平通常以dB 为单位。因此,根据您的目标受众,您可能希望将读数和输入转换为 dB。

于 2009-03-05T09:28:13.733 回答
0

这里开始,浮点 PCM 值来自 [-1, 1]。

于 2009-03-04T22:08:30.793 回答