给定一个audiostream,find一个门砰的一声(声压级计算?)
与拍手检测器(“拍手! 拍手拍手拍手! 拍手拍手拍手,拍手,拍手! 拍手拍手 ”)不同,我需要检测何时关门。 这是在一辆车,比一个房间或家门更容易:
听着: http : //ubasics.com/so/van_driver_door_closing.wav
看:
这是在16位4khz采样,我想避免大量的样品处理或存储。
当你用大胆或其他波形工具来观察它时,它是非常独特的,并且由于车内声压的增加而几乎总是被剪断 – 即使窗户和其他门打开:
听: http : //ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engineon.wav
看:
我期望有一个相对简单的algorithm,可以读取4kHz,8位的数据,并跟踪“稳定状态”。 当algorithm检测到声音水平的显着增加时,它将标记该点。
- 你怎么看?
- 你如何检测这个事件?
- 有声压级计算的代码示例可能有帮助吗?
- 我可以不经常采样(1kHz甚至更慢)吗?
更新:玩八度(开源数值分析 – 类似于Matlab),看看是否均方根会给我我需要什么(这导致了一些非常类似于SPL)
Update2:在简单情况下,计算RMS可以轻松地closures门:
现在我只需要看一下困难的情况(无线电,高温热气等)。 CFAR看起来非常有趣 – 我知道我将不得不使用自适应algorithm,CFAR当然符合这个法案。
-亚当
查看源audio文件的截图,检测声级变化的一个简单方法是对样本进行数值积分 ,以便在特定时间找出波的“能量”。
一个粗略的algorithm是:
- 把样品分成几个部分
- 计算每个部分的能量
- 取前一窗口和当前窗口之间的能量比值
- 如果该比率超过某个阈值,则确定存在突然的巨大噪音。
伪代码
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;
我应该添加一个免责声明,我没有试过这个。
这种方式应该可以在没有首先logging样品的情况下进行。 只要有一定长度的缓冲区(例如WINDOW_SIZE
),就可以进行数值积分来计算声音段的能量。 但是,这意味着在处理中会有延迟,这取决于WINDOW_SIZE
的长度。 另一个问题是确定一段声音的长度。
如何分割成部分
在第一个audio文件中,关门声音的持续时间看起来是0.25秒,所以用于数值积分的窗口可能至多是其中的一半,甚至更多的是十分之一,因此,即使静音部分和噪声部分之间的窗口重叠,也可以注意到静音和突然的声音。
例如,如果积分窗口是0.5秒,并且第一个窗口覆盖了0.25秒的静音和0.25秒的关门,并且第二个窗口覆盖了0.25秒的关门和0.25秒的静音,则可能看起来像两段声音具有相同的噪音水平,因此不会触发声音检测。 我想有一个短的窗口可以缓解这个问题。
但是,窗口太短意味着声音的上升可能不会完全适合一个窗口,并且可能认为相邻部分之间的能量差别很小,这会导致声音被遗漏。
我相信WINDOW_SIZE
和THRESHOLD
都将不得不根据经验确定要检测的声音。
为了确定这个algorithm需要保存多less个样本,比方说, WINDOW_SIZE
是门closures声的1/10,约为0.025秒。 采样率为4 kHz,即100个采样。 这似乎不是太多的内存要求。 使用200字节的16位采样。
优点缺点
这种方法的优点在于,如果源audio以整数forms馈送,则可以用简单的整数算术来执行处理。 如已经提到的那样,捕获是实时处理将会有一个延迟,取决于被集成的部分的大小。
我可以想到这个方法有几个问题:
- 如果背景噪音太大,则背景噪音和关门之间的能量差别将不容易被识别,并且可能无法检测到关门。
- 任何突然的噪音,比如拍手,都可以被视为门closures。
也许,结合其他答案中的build议,如尝试使用傅立叶分析来分析关门的频率签名,这将需要更多的处理,但会使其不易出错。
在find解决这个问题的方法之前,可能需要进行一些实验。
您应该点击车内的车门closures开关。 试图做到这一点与声音分析是过度工程。
关于不同的信号处理方法,有很多build议,但实际上,当你学习检测理论的时候,build立一个embedded式信号处理板,学习你select的芯片的处理架构,尝试一个algorithm,debugging它,然后调整它想要使用它的车(然后重新调整和重新debugging它的每一辆车),你会希望你只是stickey录音磁簧开关内的汽车和hotglued磁铁到门。
这不是说dsp专家解决这个问题不是一个有趣的问题,但是从你提出这个问题的方式来看,声音处理并不是你想要的路线。 这将是一个噩梦,使其正确的工作。
此外,拍手只是一个高通滤波器input阈值检测器。 (加上一个定时器来确保2个拍子足够快)
这个问题在雷达世界有很多相关的文献(这就是所谓的检测理论)。
你可以看看“单元平均CFAR”(恒虚警率)检测。 维基百科有一点点。 你的想法非常类似于这个,它应该工作! 🙂
祝你好运!
我首先看看光谱。 我在你提供的两个audio文件上做了这个,看起来你可以使用一些相似的东西。 例如,两者之间的主要区别似乎在40-50Hz左右。 我的.02。
UPDATE
发表这个之后,我有另一个想法。 如果可以,请将加速度计添加到设备上。 然后关联振动和声音信号 。 这应该有助于跨车门检测。 我认为它应该很好地相关,因为声音是振动驱动的,例如立体声不是。 我有一个能够检测我的发动机转速与挡风玻璃安装(吸盘)的设备,所以灵敏度可能在那里。 (我没有承诺这个作品!)
替代文字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))
在audio信号中发现不同峰值的过程称为瞬态检测 。 索尼的Acid和Ableton Live等应用程序使用瞬态检测来查找音乐中的拍子,以便进行拍子匹配。
您在上面的波形中看到的不同峰值被称为瞬态,并且有几个很好的algorithm来检测它。 本文对能源物质的瞬态检测和分类介绍了3种方法。
我会想象,车辆之间的频率和幅度也会有很大的变化。 最好的方法来确定,将采取在公民与大型SUV的样本。 也许你可以让用户在“学习”模式下关门,以获得幅度和频率签名。 那么你可以使用它来比较何时在使用模式。
您也可以考虑使用傅立叶分析来消除与门关不相关的背景噪音。
也许你应该尝试检测到应该标志着门closures的气压的重大瞬间上升。 您可以将其与波形和声级分析配对,这些都可能会给您一个更好的结果。
在采样频率较低的问题上,可以采集的最高声audio率是采样率的一半。 因此,如果车门声音在1000Hz时最强(例如),那么低于2000Hz的采样率将完全失去该声音
一个非常简单的噪音门可能会在你的情况下罚款。 只需等待幅度高于指定阈值的第一个采样(以避免与背景噪声触发)。 如果您需要区分不同types的噪音(例如,关门和手掌),您只需要比这更复杂。