【问题标题】:Finding and counting audio drop-outs in an ecological recording在生态记录中查找和计算音频丢失
【发布时间】:2014-01-31 18:29:23
【问题描述】:

我正在尝试评估生态音景的给定声音文件中有多少音频丢失。

Format: Wave
Samplingrate (Hertz):   192000
Channels (Mono/Stereo): Stereo
PCM (integer format):   TRUE
Bit (8/16/24/32/64):    16 

我的项目有一个二元水听器。这些元素是不同的品牌/型号,我们正在尝试确定在我们的特定实验中哪个元素表现更好。我们想要进行的一项分析是测量每个元素丢失或丢失信号的频率。这些丢失与信号幅度无关,换句话说,丢失不是由幅度最大化引起的。元件或相关电子设备刚刚发生故障。

我一直在尝试在 R 中执行此操作,因为这是我最熟悉的程序。我对 Matlab 和正则表达式的经验非常有限,但我愿意尝试这些程序/语言。我是生物学家,请原谅我的无知。

在 R 中,我一直在使用“seewave”包,虽然我已经能够生成一些非常漂亮的频谱图(公平地说,这是我之前使用过该包的唯一上下文) .我尝试在seewave(定时器)中使用包络和自动时间测量功能。我得到了一些有趣但相反的结果。

    foo=readWave("Documents/DASBR/DASBR2_20131119$032011.wav", from=53, to=60, units="seconds")
    timer(foo, f=96000, threshold=6.5, msmooth=c(30,5), colval="blue")

我已经无数次地更改了 msmooth 和 threshold 的值,但这只是很好的修补。该函数执行的是测量给定阈值处幅度峰值之间的持续时间。我需要它做什么a)在没有幅度的信号中找到样本或b)测量没有幅度的区域之间的持续时间。我可以使用这些输出中的任何一个。基本上我想反转阈值测量的方向,这有意义吗?因此,任何低于阈值的样本都会触发测量,而不是高于阈值的任何样本。

我仍在使用 seewave 来了解如何生成我需要的数据,但我正在寻找一些指导。也许seewave中有一个功能可以更有效地完成我想要做的事情。或者,如果要输出计时器生成的数值数据,我可以使用“quantmod”包函数“findValleys”来获取所有数据间隙的列表。

是的,我要求的是指导,哦,数据处理之神。

干杯。

【问题讨论】:

  • 欢迎来到 StackOverflow。您的问题可能会被关闭,因为它是如此模糊和广泛。您能否尝试更具体地说明您遇到的编码问题?
  • 我正在尝试使用 R 包 seewave 来查找声音流中的音频丢失。我一直在尝试功能计时器(如上所示)。定时器可用于发现幅度的增加,但不能减少。我有兴趣扭转这个过程。但是, timer(foo, f=96000, threshold=rev(10) ... 不起作用。或其他类似的尝试。如果我应该使用包 seewave 中的另一个函数,那么我将不胜感激指导。这还是太宽泛了吗?

标签: r audio signal-processing amplitude acoustics


【解决方案1】:

这个问题听起来让人想起电气工程中常见的电力传输问题。解决该问题的一种方法是获取信号中样本随时间的 RMS(均方根),在较短的持续时间(可能几秒甚至更短)内取平均值。您看到低 RMS 的持续时间是丢失的地方。它类似于您有时在音频放大器上看到的 VU 表 - 表示功率从放大器传输到扬声器。

【讨论】:

  • 嘿!所以,如果我先将 foo (7 秒长)分成 7 个大小相等的块,然后在它们上运行 rms,你会这样处理吗?比如: foo1=readWave("Documents/DASBR/DASBR2_20131119$032011.wav", from=53, to=54, units="seconds") foo2=readWave("Documents/DASBR/DASBR2_20131119$032011.wav", from=54 , to=55, units="seconds") foo3=readWave("Documents/DASBR/DASBR2_20131119$032011.wav", from=55, to=56, units="seconds") 等等... rms(foo1,foo2, foo3 等...)我确信有一个循环也会使这更容易。但这是你的建议吗?谢谢!
  • 这就是它的要点。然后,对于每个 1 秒的片段,取每个样本,对其进行平方,然后取所有平方样本的平均值,然后取其平方根。这将为您提供该段的 RMS。具有较低 RMS 的段是您辍学的地方。 RMS 是信号的平均功率。请参阅en.wikipedia.org/wiki/Root_mean_square 了解更多信息。
  • 谢谢!这解决了我遇到的一个问题,并打开了更多!所以它与编码有关。 :p
【解决方案2】:

我只是想总结一下我最终做了什么,以便其他人知道。不幸的是,RMS 测量值不是我想要的。虽然 rms 在技术上可以让我大致了解可能会发生辍学,但因为我正在处理生态记录,但还有太多其他因素在起作用。

背景:我正在使用的声音流来自一个双元件水听器,垂直间隔 2 米,并在海平面以下 100 m 处录制。我们发现约 100 米处的元素正在经历严重的辍学,而约 102 米处的元素大部分都很好。我们目前将此归因于一个待确定的电气问题。如果两个元件都准备好以完全相同的方式接收 auto ,则 rms 将在检测到丢失时起作用,但由于声音是独立接收的,rms 计算受到其他因素的影响太大。在源电平和​​信号接收方面,两米可以产生比您想象的更大的差异,这足以让我们根据信号到达之间的延迟来定位发声动物(左/右模糊)。

都一样,这就是我所做的:

library(seewave)
library(tuneR)
foo=readWave("Sound_file_Path")
L=foo@left
R=foo@right
rms(L)
rms(R)

然后我通过一个目录循环这个过程,我在这里详细说明:for.loop with WAV files

到目前为止,这个问题还没有解决,不过感谢大家的讨论!

~等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2010-10-15
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多