给定一个音频流,找到一个门猛击(声压级计算?)

时间:2009-01-31 23:29:25

标签: c algorithm audio signal-processing

与拍手探测器不同(“Clap on!拍手拍手拍拍!拍手拍手拍拍,拍拍,拍板!拍手拍手“)我需要检测门何时关闭。这是一辆车,比房间或家门更容易:

听: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,我想避免大量处理或存储样品。

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

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

查找:
alt text

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

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

更新:使用Octave(开源数值分析 - 类似于Matlab),看看均方根是否能满足我的需要(这会产生与SPL非常相似的东西)< / p>

Update2:在简单的情况下,计算RMS可以轻松关闭门:
alt text alt text
现在我只需要看看困难的情况(收音机,高温/高空等)。 CFAR看起来非常有趣 - 我知道我将不得不使用自适应算法,CFAR肯定符合要求。

- 亚当

9 个答案:

答案 0 :(得分:27)

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

粗略的算法是:

  1. 将样本分为几个部分
  2. 计算每个部分的能量
  3. 取上一个窗口和当前窗口之间的能量比率
  4. 如果比率超过某个阈值,请确定突然发出巨响。
  5. <强>伪代码

    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. 任何突然的噪音,如拍手,都可以视为门正在关闭。
    3. 或许,结合其他答案中的建议,例如尝试使用傅立叶分析来分析门关闭的频率特征,这将需要更多处理,但会使其不易出错。

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

答案 1 :(得分:8)

您应该轻触车内的车门关闭开关。 尝试用声音分析来做这件事就是过度工程。

关于不同的信号处理有很多建议 当你学习检测时,你可以采取的方法 理论上,构建一个嵌入式信号处理板,学习处理 您选择的芯片的架构,尝试算法,调试它,然后 为你想要使用它的汽车调整它(然后重新调整并重新调试 对于其他所有的汽车而言,你会希望你只是stickey录制一个芦苇 在汽车内部切换并将磁铁塞到门上。

对于dsp专家而言,这不是一个有趣的问题, 但是从你问这个问题的方式来看,声音很明显 处理不是您想要的路线。这将是一场噩梦 使它正常工作。

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

答案 2 :(得分:7)

在雷达领域有很多关于这个问题的相关文献(称为检测理论)。

您可能会看一下“细胞平均CFAR”(恒定误报率)检测。维基百科有点here。你的想法与此非常相似,它应该有效! :)

祝你好运!

答案 3 :(得分:5)

我首先看一下光谱。我在你给出的两个音频文件上做了这个,你似乎可以使用一些相似之处。例如,两者之间的主要差异似乎是大约40-50Hz。我的.02。

<强>更新

发布此内容后我又有了一个想法。如果可以,请在设备上添加加速度计。然后关联振动和声学信号。这应该有助于跨车门检测。我认为它应该是相关的,因为声音是振动驱动的,例如,立体声不是。我有一个装置能够用挡风玻璃支架(吸盘)检测我的发动机转速,所以灵敏度可能就在那里。 (我不做任何承诺!)

alt text
(来源: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))

答案 4 :(得分:4)

在音频信号中找到明显尖峰的过程称为transient detection。像Sony's AcidAbleton Live这样的应用程序会使用瞬态检测来查找音乐中的节拍以进行节拍匹配。

您在上面的波形中看到的明显尖峰称为瞬态,有几种很好的算法可用于检测它。论文Transient detection and classification in energy matters描述了3种方法。

答案 5 :(得分:3)

我认为频率和幅度也会因车辆而异。确定这将采取思域与大型SUV的样本的最佳方式。也许您可以让用户以“学习”模式关闭门以获得幅度和频率特征。然后你可以用它来比较使用模式。

您还可以考虑使用Fourier analysis来消除与门关闭无关的背景噪音。

答案 6 :(得分:0)

也许你应该尝试检测气压的显着瞬间升高,这应该标志着一扇门关闭。您可以将其与此波形和声级分析配对,这些都可以为您提供更好的结果。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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