2009-03-04 81 views
1

我正在做一些涉及DirectSound緩衝區的維護工作。我想知道如何解釋緩衝區中的元素,也就是知道緩衝區中每個值的含義。這些數據來自麥克風。從麥克風捕獲設備解釋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

here,浮點PCM值從[-1,1]。

2

由於MSN說樣本是在32位浮點數。要檢測靜音,您通常會計算RMS值:在某個時間間隔(例如20-50 ms)內取平方的樣本值的平均值,並將此平均值的(平方根)與閾值進行比較。 麥克風信號中固有的噪音可能會讓單個樣品達到閾值以上,而環境聲音仍將被視爲靜音。短時間內的平均值會導致一個與我們的感覺更好地相符的值。

0

除了漢族對平均樣本的建議之外,als還考慮校準閾值。在不同的環境下,使用不同的麥克風和不同的音頻通道,「沉默」可能意味着很多事情。

簡單的方法將是lovoing來配置閾值。或者,在您達到閾值時進行「噪底測量」。

請注意,樣本是線性的,但音頻處理中的級別通常在dB中給出。因此,根據yoru目標受衆,您可能希望將讀數和輸入轉換爲dB。