2009-01-31 15 views
39

不是不像拍探測器(「拍拍上!拍手鼓掌一擊了!拍手鼓掌上拍,拍斷,梆子! 拍手鼓掌「)我需要檢測一扇門關閉的時間。這是在汽車,這比一個房間或家庭的門更容易:鑑於音頻流,發現當門抨擊(聲壓水平計算?)

聽:http://ubasics.com/so/van_driver_door_closing.wav

看:
image of waveform shows steady line, then sudden disruption, settling down to steady line

它的採樣在16位4kHz的,我想,以避免大量樣品處理或儲存。

當你看到它大膽或另一種波形工具是很有特色,而且幾乎總是剪輯由於在車輛聲壓的增加 - 即使在Windows和其他大門是敞開的:

聽: http://ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engineon.wav

看:
alt text

我希望有一個相對簡單的算法,將採取讀數爲4kHz,8位,並跟蹤了「穩定狀態」的。當算法檢測到聲級顯着增加時,它將標記該點。

  • 您的想法是什麼?
  • 如何檢測此事件?
  • 有聲壓級計算的代碼示例可能有幫助嗎?
  • 我可以用更少的頻繁的採樣脫身

更新:與倍頻播放(開源數值分析 - 類似Matlab的),看是否均方根會給(1kHz時或更慢?)我我需要什麼(這會導致一些非常相似的SPL)

UPDATE2:關閉容易計算的RMS發現門的簡單情況:
alt textalt text
現在我只需要看一下困難的情況(無線電,熱/高空等)。 CFAR看起來非常有趣 - 我知道我將不得不使用自適應算法,而CFAR當然符合這個法案。

- 亞當

+0

加速度計是一個選項嗎? – ccook 2009-02-01 06:51:18

+0

我在主板上包含一個三軸加速度計。順便提一句,它還包括壓力傳感器,光線傳感器,門開關檢測,GPS和相機。雖然這些選項可用,但理想情況下,設計只需要麥克風進行門鎖感應。 – 2009-02-01 06:54:51

+0

只是一個隨機的想法 - 如果它在關閉時幾乎總是剪輯 - 爲什麼不只是檢測剪輯? – aronchick 2009-05-07 18:18:31

回答

26

查看源音頻文件的截圖,檢測聲音級別變化的一種簡單方法是做樣本的numerical integration以查明特定時間波的「能量」。

粗略算法將是:

  1. 除以樣品分成幾塊
  2. 計算每個節
  3. 的能量取前一個窗口和當前窗口間的能量的比率
  4. 如果比率超過某個閾值,請確定存在突然的巨大噪音。

samples = load_audio_samples()  // Array containing audio samples 
WINDOW_SIZE = 1000     // Sample window of 1000 samples (example) 

for (i = 0; i < samples.length; i += WINDOW_SIZE): 
    // Perform a numerical integration of the current window using simple 
    // addition of current sample to a sum. 
    for (j = 0; j < WINDOW_SIZE; j++): 
     energy += samples[i+j] 

    // Take ratio of energies of last window and current window, and see 
    // if there is a big difference in the energies. If so, there is a 
    // sudden loud noise. 
    if (energy/last_energy > THRESHOLD): 
     sudden_sound_detected() 

    last_energy = energy 
    energy = 0; 

我要補充一點,我還沒有試過這樣的免責聲明。

這種方式應該可以在沒有首先記錄樣品的情況下進行。只要有一定長度的緩衝區(例如WINDOW_SIZE),就可以執行數值積分來計算聲音段的能量。然而,這確實意味着處理會有延遲,這取決於WINDOW_SIZE的長度。另一個問題是確定一段聲音的長度。

如何分割成多個段

在第一個音頻文件,看來,關門的聲音的持續時間爲0.25秒,所以用於數值積分窗口或許應該至多一半或者甚至更像十分之一,所以即使靜音部分和噪音部分之間的窗口重疊,也可以注意到靜音和突然聲音之間的差異。例如,如果積分窗口爲0.5秒,並且第一個窗口覆蓋了0.25秒的靜音和0.25秒的關門時間,並且第二個窗口覆蓋了0.25秒的關門時間和0.25秒的靜默時間,可能看起來兩段聲音具有相同的噪音水平,因此不會觸發聲音檢測。我想有個簡短的窗口可以緩解這個問題。

然而,窗口太短意味着聲音的增加可能不會完全適合一個窗口,並且可能認爲相鄰部分之間的能量差異很小,這會導致聲音錯過。

我相信WINDOW_SIZETHRESHOLD都將不得不根據經驗確定將被檢測的聲音。

爲了確定這個算法需要保留在內存中的樣本數量,比方說,WINDOW_SIZE是門關閉聲音的1/10,約爲0.025秒。採樣率爲4 kHz,即100個採樣點。這似乎沒有太多的內存要求。使用200字節的16位採樣。

優點/缺點

這種方法的優點是如果源的音頻被饋送在作爲整數可以用簡單的整數運算來執行的處理。正如已經提到的那樣,捕獲是實時處理將會有一個延遲,這取決於整合的部分的大小。

有幾個是我能想到的這個方法的問題:

  1. 如果背景噪音過大,背景噪聲和關門之間的能量差也不會很容易區分,並且可能無法檢測到關門。
  2. 任何突然的噪音,如拍手,都可以視爲門關閉。

也許,建議在其他的答案,比如試圖分析利用傅立葉分析關門,這將需要更多的處理,但會使其不太容易出錯的頻率特徵相結合。

在找到解決此問題的方法之前,可能需要進行一些實驗。

+0

我真的很喜歡這種方法,所以我會實施它,並在這裏報告我的結果。我不會設定一個固定的門檻,而是要跟蹤平均能量,並有一個可調整的因子(即窗口必須是平均觸發的1.5倍以上)。 – 2009-02-14 14:50:47

1

也許你應該嘗試檢測氣壓顯著上升瞬間應該標誌着關門。你可以將它與波形和聲級分析結合起來,這些都可以給你更好的結果。

3

我會想象,頻率和幅度也會因車輛而異。最好的方法來確定這是一個在公民對比大型SUV的樣本。也許你可以讓用戶在「學習」模式下關門,以獲得幅度和頻率特徵。然後,您可以使用它在使用模式下進行比較。

您還可以考慮使用Fourier analysis消除與門關閉無關的背景噪音。

8

您應該接通車門上的車門關閉開關。 試圖用聲音分析來做到這一點是過度工程。

有很多關於不同的信號處理 辦法採取的建議,但說真的,你的時間瞭解檢測 理論,構建嵌入式信號處理板,學習處理 架構爲您所選擇的芯片,嘗試一個算法,調試它,然後調整它爲您想要使用它的汽車(然後重新調整和重新調試 它爲其他汽車),你會希望你只是stickey錄音蘆葦 在車內切換並將磁鐵蓋在門上。

這不是說dsp專家解決這個問題並不是一個有趣的問題,但是從您提出這個問題的方式來看,很明顯,聲音處理不是您想要採用的路線。它只是這樣一個噩夢 使它的工作正確。

此外,拍手只是一個高通濾波器輸入閾值檢測器。 (加上一個定時器,以確保2拍很快一起)

+1

在很多情況下,這是正確的答案。如果可以在不連接交換機的情況下完成,那麼我們可以避免安裝問題,成本增加,責任問題,並且考慮到該設備意圖被重新使用(不是永久安裝),接線不是最佳的。不過,這是一個選項。 – 2009-02-01 03:56:30

5

我會開始看光譜。我在你給出的兩個音頻文件上做了這個,看起來你可以使用一些相似的東西。例如,兩者之間的主要區別似乎在40-50Hz左右。我的.02。

UPDATE

我有張貼這層出不窮的想法。如果可以,請將加速度計添加到設備上。然後關聯振動和聲學信號。這應該有助於跨越車門檢測。我認爲它應該很好地相互關聯,因爲聲音是振動驅動的,例如,立體聲不是。我有一個能夠用擋風玻璃支架(吸盤)檢測我的發動機轉速的設備,因此敏感度可能在那裏。 (我沒有承諾這個作品!)

alt text http://www.charlesrcook.com/spectral.jpg

%% Test Script (Matlab) 
clear 
hold all %keep plots open 
dt=.001 

%% Van driver door 
data = wavread('van_driver_door_closing.wav'); 

%Frequency analysis 
NFFT = 2^nextpow2(length(data)); 
Y = fft(data(:,2), NFFT)/length(data); 
freq = (1/dt)/2*linspace(0,1,NFFT/2); 
spectral = [freq' 2*abs(Y(1:NFFT/2))]; 

plot(spectral(:,1),spectral(:,2)) 

%% Repeat for van sliding door 
data = wavread('van_driverdoorclosing.wav'); 

%Frequency analysis 
NFFT = 2^nextpow2(length(data)); 
Y = fft(data(:,2), NFFT)/length(data); 
freq = (1/dt)/2*linspace(0,1,NFFT/2); 
spectral = [freq' 2*abs(Y(1:NFFT/2))]; 

plot(spectral(:,1),spectral(:,2)) 
6

上有雷達世界這個問題有很多相關的文獻(這就是所謂的檢測理論)。

你可能會看看「單元平均CFAR」(恆虛警率)檢測。維基百科有一點點here。你的想法與此非常相似,它應該起作用! :)

祝你好運!

0

在採樣頻率較低的問題上,可以採集的最高聲音頻率是採樣率的一半。因此,如果車門聲音在1000Hz時最強(例如),那麼2000Hz以下的採樣率將完全失去該聲音。

0

一個非常簡單的噪聲門在您的情況下可能會很好。只需等待幅度高於指定閾值的第一個採樣(以避免與背景噪聲觸發)。如果您需要區分不同類型的噪音(例如,門關閉和手拍),則只需要比這更復雜。