给音频流中,发现当一扇门关上(音压力水平计算的?)
-
20-08-2019 - |
题
不像拍探测器("拍! 拍手鼓掌 拍掉! 拍手鼓掌 拍手上的手机关掉,快! 拍手鼓掌 "),我需要检测时,一门关闭。这是在车辆,这是很容易的客房或家庭门:
听着: http://ubasics.com/so/van_driver_door_closing.wav
这样16位4khz,我想避免大量的处理或储存的样品。
当你看着它在厚颜无耻地或另一种波形的工具,这是相当独特,而且几乎总是片断由于增加在声压在车-即使当的窗户和其他的门都是开放:
听着: http://ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engineon.wav
我希望有一个相对较简单的算法,将采取读数在4khz,8位,并跟踪的稳定状态'。当算法检测的显着增加的声音水平,它将标志着点。
- 你有什么想法?
- 你会如何检测这种活动?
- 有没有代码的例子声音压力水平计算,可能会有帮助吗?
- 我可以摆脱不太频繁的取样(1khz或甚至更慢?)
更新: 玩倍频程(公开来源的数值分析--类似于Matlab),并看到如果根均方会给我我需要什么(这导致一些非常类似于SPL)
Update2: 计算RMS发现的门靠近很容易地在简单的情况下:
现在我只需要看看困难的情况下(无线电、加热/空气高,等等)。该恒虚警率看起来真的很有趣-我知道我必须要使用适应性的算法,以及恒虚警率肯定符合该法案。
-亚当
解决方案
看着屏幕源音频文件,一个简单的方法以检测变化中的声音水平将要做一个 数字集成 样品中找出的"能源"的波在一个特定的时间。
一个粗略的算法是:
- 除样本成部分
- 计算的能源的每个部分
- 采取比率的能源之间的上一个窗口和当前窗的
- 如果所述比例超过某一阈值,确定有一个突然的巨大的噪音。
伪
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秒钟的沉默,则可能出现的两个部分的声音具有相同级别的噪音,因此,不触发的声检测。我想象一下,有一个简短的窗口将缓解这一问题。
然而,有一个窗口是太短将意味着上升的声音可能不完全适合为一个窗口,它可能apppear有很小的差异在能源之间的相邻部分,这可能会导致的声音。
我相信的 WINDOW_SIZE
和 THRESHOLD
两者都需要凭经验确定的声音,这将是检测。
为了确定如何许多样品,这个算法将需要保持存在,让我们说, WINDOW_SIZE
是的1/10的声音的门关闭,这是关于0.025第二。在采样率为4千赫兹,也就是100样本。这似乎是不太多的存储要求。使用的16位样本的200字节。
优点/缺点
这种方法的优点是,可以执行处理有简单的整数的算术如果来源的音频馈送在作为整数。美中不足的是,如上所述,实时处理将会有一个延迟,根据大小的部分,是综合性的。
有几个问题,我可以认为这种方法:
- 如果背景噪音太大,差别在能源之间的背景噪声和闭门不会是容易区分,并且它可能无法检测的大门关闭。
- 任何突然的噪音,例如拍手,可能被视为车门关闭。
也许,合并建议在其他的答案,例如试图分析的频签名的门关闭,使用傅里叶分析,这将需要更多的处理,但会使它不那么容易出错。
它可能会采取一些实验之前找到一种方法来解决这个问题。
其他提示
你应该抽到的门靠近的开关在车上。试图这样做的声音分析overengineering.
有很多建议,有关不同信号处理 方法采取的,但是真的,你的时间了解检测 理论上,建立一个嵌入式信号处理董事,学习处理 建筑的芯片你选择、尝试一种算法,调试,然后 为你也为你想要的车上使用(和随后重新调整和重新调试 它对于所有其他汽车),你会希望你只是stickey录音磁簧 开关在车内并hotglued磁铁门。
不,这不是一个有趣的问题来解决对dsp专家, 但是,从方式你是问这个问题,这是清楚的声音 处理的不是你想要的路线。它只会是这样的噩梦 让它工作的权利。
此外,拍板只是一个高通滤波器送入阈值检测器。(再加上定时器,以确保2拍手不够迅速在一起)
我会开始看的光谱。我没有这两个音频文件了,并且那里似乎有些相似度你可以使用。例如的主要区别两者之间似乎大约40-50赫兹。我的。02.
更新
我有另一个想法后张贴这一点。如果可以的话,添加速度计上的设备。然后 相关的振动和声音信号.这应该有助于交叉车辆门的检测。我想它应该得到很好的相关性,因为声音振动驱动的,哪来的立体声例如,是不是。我有一个的设备,能够检测我发动机转速有挡风玻璃安装(吸杯),因此敏感性可能是存在的。(我做任何承诺这工作!)
(资料来源: charlesrcook.com)
%% 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))
该进程寻找不同的高峰音频信号被称为 瞬态检测.等应用程序 索尼的酸 和 市场直播 使用瞬态检测找到节拍音乐于这样做节拍匹配。
鲜明的钉你看到在波形上述被称为一个暂时的,并且有几个良好的算法用于检测。纸 瞬态检测和分类在能源的事项 描述了3种方法这样做。
我会想象的频率和振幅也明显不同的车辆,车辆。最好的方式来确定,将采取一个样品在公民与一个大SUV。也许你可以有用户关上门在一个"学习"模式得到振幅和频率的签名。然后你可以用它来进行比较时,在使用的模式。
你也可以考虑使用 傅里叶分析 消除背景的声音,是不相关联的门关闭。
也许你应该试试来检测的重大即时上升的空气压力,应该标志着一个门关闭。你可以对与这种波形和声音水平的分析和所有这些可能给你一个更好的结果。
在该问题上的较不频繁地采样、最高声音的频率能够捕获的一半的采样率。因此,如果汽车车门的声音是最强的1000赫兹(例如),然后取样速率下2000Hz会失去声音完全
一个非常简单的噪音门可能会做只是现在的情况。只是等待第一个样本,其幅度是上述一个指定的阈值(避免引发的背景噪声)。你只需要得到更多的复杂比这个如果你需要区分不同类型的噪音(例如一门关闭与拍手).