我正在做一些涉及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.
}
答案 0 :(得分:2)
正如MSN所说,样本是32位浮点数。要检测静音,通常会计算RMS值:在某个时间间隔(比如20-50 ms)中取平方样本值的平均值,并将此平均值与平均值(平方根)进行比较。 麦克风信号中固有的噪声可以使单个样本达到阈值以上,而环境声音仍然被认为是静音。短时间间隔的平均值将导致与我们的感知更好地对应的值。
答案 1 :(得分:0)
从here开始,浮点PCM值来自[-1,1]。
答案 2 :(得分:0)
除了Han对平均样本的建议外,als还考虑校准你的阈值。在不同的环境下,使用不同的麦克风和不同的音频通道,“沉默”可能意味着很多事情。
配置阈值的方法很简单。或者,允许“噪声基底测量”,您可以获得阈值。
请注意,样本是线性的,但音频处理中的级别通常在dB中给出。因此,根据yoru目标受众,您可能希望将读数和输入转换为dB。