【问题标题】:Given an audio stream, find when a door slams (sound pressure level calculation?)给定一个音频流,找出门何时关上(声压级计算?)
【发布时间】:2010-10-04 17:29:22
【问题描述】:

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

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

看:

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

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

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

看:

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

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

更新: 使用 Octave(开源数值分析 - 类似于 Matlab)并查看均方根是否能满足我的需求(这会产生与 SPL 非常相似的结果)

更新 2: 计算 RMS 在简单情况下很容易找到关门:

现在我只需要看看困难的情况(收音机,高温/空气等)。 CFAR 看起来非常有趣 - 我知道我将不得不使用自适应算法,而 CFAR 肯定符合要求。

-亚当

【问题讨论】:

  • 可以选择加速度计吗?
  • 我在板上安装了一个三轴加速度计。顺便说一句,它还包括压力传感器、光传感器、门开关检测、GPS 和摄像头。虽然这些选项可用,但理想情况下,该设计只需要麦克风来感应门关闭。
  • 只是一个随机的想法 - 如果它几乎总是在关闭时剪辑 - 为什么不只检测剪辑?
  • @aronchick - 因为车里有很多噪音,也足够大,可以剪辑,但在其他方面有所不同。

标签: c algorithm audio signal-processing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      查看源音频文件的屏幕截图,检测声级变化的一种简单方法是对样本进行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. 任何突然的声音,例如拍手声,都可以视为门正在关闭。

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

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

      【讨论】:

      • 我真的很喜欢这种方法,所以我会实施它并在这里报告我的结果。而不是有一个固定的阈值,我将跟踪平均能量,并有一个可调整的因素(即,窗口必须是平均触发的 1.5+ 倍)。
      【解决方案4】:

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

      有很多关于不同信号处理的建议 可以采取的方法,但实际上,当您了解检测时 理论,搭建嵌入式信号处理板,学习处理 您选择的芯片的架构,尝试一种算法,调试它,然后 为您想要使用它的汽车调整它(然后重新调整和重新调试 它适用于所有其他汽车),你会希望你只是粘着一根芦苇 在车内切换开关并将磁铁热粘在车门上。

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

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

      【讨论】:

      • 在很多情况下这是正确的答案。如果可以在不为开关接线的情况下完成,那么我们可以避免安装问题、成本增加、责任问题,并且鉴于该设备旨在重复使用(不是永久安装),接线不是最佳选择。不过,这是一种选择。
      • 在某些情况下,如电动滑动门或掀背门接线可能是必要的,因为关闭的声音没有那么有力,因此需要更多的处理,或自定义调整(以及因此设置)。另一个想法是在礼貌灯附近放置一个光传感器 - 易于安装,也可以工作。
      • 我倾向于同意,但这并没有阻止我提出算法上的建议...... :) +1
      • “从你问这个问题的方式来看,很明显声音处理不是你想走的路。”我问这个问题的方式表明了这一点呢?如果我对自己的意图造成错误印象,我会很乐意修改它。
      • 对不起,如果我表现得像个混蛋,但您似乎对信号处理不熟悉。如果您想玩或学习,我不想让您失望,但如果您想在合理的时间内对关门检测做出真正的解决方案,音频信号处理可能是最困难的途径。
      【解决方案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))
      

      【讨论】:

        【解决方案6】:

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

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

        祝你好运!

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

            【解决方案9】:

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

            【讨论】:

            • 是的,我在这里展示了非常简单的案例。现实情况要严酷得多 - 收音机和加热/AC 处于高位时,我得到了合理的结果,但我也得到了一些误报,只是 RMS 峰值检测。
            猜你喜欢
            • 2011-01-27
            • 2015-07-04
            • 1970-01-01
            • 2013-09-20
            • 1970-01-01
            • 2018-07-12
            • 2014-08-01
            • 1970-01-01
            • 2012-03-24
            相关资源
            最近更新 更多