2016-01-18 52 views
0

我需要從拾音器麥克風檢測現場音頻中的峯值,並輸出精確的時間到毫秒或最好在.txt文件中峯值的納秒。麥克風的現場音頻峯值檢測

我一直在尋找兩種可能的解決方案。第一個是在linux中設置一個shell腳本,通過nohup函數記錄5秒的音頻增量,然後在matlab中分析它們,但這裏的問題是記錄文件的結尾和開頭不完全是5秒分開。當新文件開始錄製時,延遲時間爲50-150毫秒。

第二個選擇是做類似於他們用於拍照燈開關的東西,但我不知道如何從中提取確切的時間。而且我也不知道這是否可以用拾音器麥克風工作,或者它是否與聲音傳感器一起工作(對於Arduino ...),就像它在這裏顯示的那樣。 http://en.code-bude.net/2014/12/08/how-to-build-a-clap-switch-using-arduino/

我想知道是否有更好的解決方案。我可以用C++或java來做到這一點嗎?請記住,我需要輸出毫秒或毫微秒的確切時間。

回答

0

爲了獲得準確的時間信息,您需要對樣本進行計數,然後從記錄開始計算時間。

首先,您需要確定可用的衆多音頻捕獲回放API之一。你沒有提到你在哪個平臺上,但如果你在Linux上,你可以看看ALSA,Jack,OSS,SDL等等。一旦你到了你能夠配置捕獲設備並開始接收樣品的地步,那麼每種方法都是相似的。你將得到一些函數回調與收到的樣本,並將需要掃描樣本的峯值和計算時間等...

這是一個回調可能看起來像什麼樣子的例子。請記住,你選擇的API將有其自己的微妙之處,你可能需要從字節數組轉換爲雙倍等... time將爲double精度值,準確度爲1/SAMPLERATE。

int sampleCount = 0; 
void BufferCallback(double* samples, int numSamples) 
{ 
    for (int i = 0 ; i < numSamples ; i++) 
    { 
     if (abs(samples[i]) > threshold) 
     { 
      // exceeded peak threshold, record the time 
      double time = sampleCount/(double)SampleRate; 
     } 
     sampleCount++; 
    } 
}