C++ 从麦克风捕获设备解读DirectSound缓冲元件

C++ 从麦克风捕获设备解读DirectSound缓冲元件,c++,audio,microphone,directsound,C++,Audio,Microphone,Directsound,我正在做一些涉及DirectSound缓冲区的维护工作。我想知道如何解释缓冲区中的元素,也就是说,知道缓冲区中的每个值代表什么。这些数据来自麦克风 正在使用此波形格式: WAVEFORMATEXTENSIBLE format = { { WAVE_FORMAT_EXTENSIBLE, 1, sample_rate, sample_rate * 4, 4, 32, 22 }, { 32 }, 0, KSDATAFORMAT_SUBTYPE_IEEE_FLOAT }; 我的目标是检测麦克风

我正在做一些涉及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.
}
bool是无声的(浮点*数据,无符号整数采样,浮点阈值)
{
float*max\u iter=std::max\u元素(数据,数据+num\u样本);
如果(!max_iter){
返回true;
}
浮动最大值=*最大值;
如果(最大值<阈值){
返回true;
}
return false;//至少有一个值足够大。
}

From,浮点PCM值来自[-1,1]。

正如MSN所说,样本是32位浮点。要检测静默,您通常会计算RMS值:取某个时间间隔(比如20-50 ms)内平方样本值的平均值,并将该平均值的(平方根)与阈值进行比较。
麦克风信号中固有的噪声可能会使单个样本达到阈值以上,而环境声音仍被视为静音。在一个短的时间间隔内的平均值将导致一个与我们的感知相对应的值。

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

最简单的方法是配置阈值。或者,允许进行“噪声地板测量”,您可以在其中获取阈值

请注意,样本是线性的,但音频处理中的级别通常在中给出。因此,根据您的目标受众,您可能需要将读数和输入转换为dB或从dB转换为dB