41

与拍手检测器不同(“拍手!拍手拍手拍手!拍手拍手拍手,拍手拍手! 拍手拍手”)我需要检测门何时关闭。这是在车辆中,比房间或家庭门更容易:

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

看:
波形图像显示稳定线,然后突然中断,稳定到稳定线

它以 16 位 4khz 采样,我想避免大量处理或存储样本。

当您在大胆或其他波形工具中查看它时,它非常独特,并且几乎总是由于车辆声压的增加而出现剪辑 - 即使在窗户和其他门打开时也是如此:

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

看:
替代文字

我希望有一个相对简单的算法可以读取 4kHz、8 位的读数,并跟踪“稳态”。当算法检测到声级显着增加时,它会标记该点。

  • 你怎么认为?
  • 您将如何检测此事件?
  • 是否有可能有帮助的声压级计算的代码示例?
  • 我可以减少采样频率(1kHz 甚至更慢吗?)

更新:使用 Octave(开源数值分析 - 类似于 Matlab)并查看均方根是否能给我所需的东西(这导致与 SPL 非常相似的东西)

更新 2:计算 RMS 在简单的情况下很容易发现门关闭: 现在我只需要查看困难的情况(收音机打开、加热/空气打开等)。CFAR 看起来非常有趣——我知道我将不得不使用自适应算法,而 CFAR 肯定符合要求。
替代文字 替代文字

-亚当

4

9 回答 9

28

查看源音频文件的屏幕截图,检测声级变化的一种简单方法是对样本进行数值积分,以找出特定时间波的“能量”。

一个粗略的算法是:

  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. 任何突然的声音,例如拍手声,都可以视为门正在关闭。

也许,结合其他答案中的建议,例如尝试使用傅里叶分析来分析关门的频率特征,这将需要更多的处理,但会使其不易出错。

在找到解决此问题的方法之前,可能需要进行一些实验。

于 2009-02-01T02:54:46.297 回答
8

您应该点击车内的关门开关。试图通过声音分析来做到这一点是过度工程。

有很多关于不同信号处理方法的建议,但实际上,当你学习检测理论、构建嵌入式信号处理板、学习你选择的芯片的处理架构、尝试算法、调试它时,然后为您想要使用它的汽车调整它(然后为每辆其他汽车重新调整和重新调试),您会希望您只是在车内粘上一个簧片开关并将一块磁铁热粘到门。

并不是说这对 dsp 专家来说不是一个有趣的问题,但是从您提出这个问题的方式来看,很明显声音处理不是您想要采取的路线。让它正常工作将是一场噩梦。

此外,拍板只是一个高通滤波器,馈入阈值检测器。(加上一个计时器,以确保 2 次拍手足够快)

于 2009-02-01T03:17:12.803 回答
7

雷达界有很多关于这个问题的相关文献(称为探测理论)。

您可能会查看“单元平均 CFAR”(恒定误报率)检测。维基百科在这里有一点。您的想法与此非常相似,它应该可以工作!:)

祝你好运!

于 2009-02-01T04:16:05.807 回答
5

我将从查看光谱开始。我对您提供的两个音频文件进行了此操作,您似乎可以使用一些相似之处。例如,两者之间的主要区别似乎在 40-50Hz 左右。我的.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))
于 2009-02-01T04:05:34.470 回答
4

在音频信号中发现明显尖峰的过程称为瞬态检测索尼的 AcidAbleton Live等应用程序使用瞬态检测来查找音乐中的节拍以进行节拍匹配。

您在上面的波形中看到的明显尖峰称为瞬态,有几种很好的算法可以检测它。能源问题中的瞬态检测和分类一文描述了 3 种方法来做到这一点。

于 2009-02-01T13:00:41.767 回答
3

我想频率和幅度也会因车辆而异。确定这一点的最佳方法是在 Civic 和大型 SUV 中取样。也许您可以让用户以“学习”模式关上门以获取幅度和频率特征。然后你可以用它来比较在使用模式下的时间。

您还可以考虑使用傅立叶分析来消除与关门无关的背景噪音。

于 2009-02-01T00:41:25.677 回答
0

也许您应该尝试检测应标记门关闭的气压的显着瞬时升高。您可以将它与此波形和声级分析配对,这些都可能会给您带来更好的结果。

于 2009-01-31T23:51:21.707 回答
0

在采样频率较低的问题上,可以捕获的最高声音频率是采样率的一半。因此,如果车门声音在 1000Hz(例如)时最强,那么低于 2000Hz 的采样率将完全失去该声音

于 2009-02-02T02:35:59.593 回答
0

在您的情况下,一个非常简单的噪声门可能就可以了。只需等待幅度高于指定阈值的第一个样本(以避免触发背景噪声)。如果您需要区分不同类型的噪音(例如关门与拍手),您只需要变得比这更复杂。

于 2009-02-02T07:55:21.573 回答