【问题标题】:Finding the 'volume' of a .wav at a given time在给定时间查找 .wav 的“音量”
【发布时间】:2012-01-07 02:50:17
【问题描述】:

我正在为我的第四年项目(处理函数响应式编程)开发一个小型示例应用程序。这个想法是创建一个可以播放 .wav 文件的简单程序,然后显示正在播放歌曲的当前音量的“弹跳”动画(就像在录音软件中一样)。我在 Scala 中构建它,所以主要关注 Java 库和现有解决方案。

目前,我已经设法轻松播放 .wav 文件,但似乎无法实现第二个目标。基本上有一种方法可以解码 .wav 文件,这样我就可以通过某种方式访问 任何给定时间的“音量”?按体积,我想我指的是它的幅度,但我可能错了 - 高等物理学是前一阵子......

显然,我对此一无所知,所以如果有人能指出我正确的方向,那就太好了!

【问题讨论】:

  • 查看诸如 RMS 和 dB 之类的东西。
  • these 之类的东西可能是一个合适的视图。

标签: java scala audio signal-processing wav


【解决方案1】:

在数字音频处理中,您通常指的是信号的瞬时峰值幅度(也称为PPM -- peak programme metering)。根据您想要的准确度或您是否希望对某些标准化计量建模,您可以

  • 只需使用样本帧的滑动窗口(找到每个窗口的最大绝对值)
  • 实施某种峰值保持机制,将最后一个峰值保留给定持续时间,然后开始使该值“下降”给定的每秒分贝数。

另一种测量模式是 RMS,它是通过在某个时间窗口上积分计算得出的(将平方样本值相加,除以窗口长度,然后取平方根,即均方根 RMS)。这可以更好地了解信号的“能量”,比峰值测量更平滑,但不能捕获观察到的最大值。这种模式有时也称为VU meter。您可以使用一种滞后(低通)滤波器来近似此值,例如y[i] = y[i-1]*a + |x[i]|*(a-1),对于一些价值0 < a < 1

您通常以对数形式显示这些值,即在 decibels 中,因为这更符合我们对信号强度的感知,而且对于大多数信号来说,您的屏幕空间的覆盖范围也会更加规则。

我参与的三个项目可能会对您有所帮助:

  • ScalaAudioFile,您可以使用它从 AIFF 或 WAVE 文件中读取样本帧
  • ScalaAudioWidgets 这是一个仍然年轻且不完整的项目,它在 scala-swing 之上提供一些音频应用程序小部件,包括 PPM 视图 - 只需使用滑动窗口并将窗口的当前峰值(以及可选的 RMS)设置为常规间隔,视图将处理峰值保持和下降时间
  • (ScalaCollider,SuperCollider 声音合成系统的客户端,您可以使用它来回放声音文件并实时测量峰值和 RMS 幅度。后者可能对您的项目来说是一种过度杀伤,并且会涉及如果您从未听说过 SuperCollider,则需要一些认真的学习曲线。优点是您无需担心声音播放与仪表显示同步)

【讨论】:

  • ScalaAudioFile 看起来很棒,所以我决定使用它。关于如何获得每一秒 wav 的幅度,您有什么帮助吗?我目前正在这样做(制作一个值数组):gist.github.com/1398345
【解决方案2】:

在 wav 文件中,流中给定点的数据是音量(移动了动态范围的一半)。换句话说,如果您知道 wav 文件的类型(例如 8 位、单声道),每个字节代表一个样本。如果您知道采样率(例如 44100 HZ),则将时间乘以 44100,这就是您要查看的字节。

字节的值是体积(到中间的距离.. 0 和 255 是峰值,127 是零)。这是假设编码不是 mu-law 编码。我在这里找到了一些关于如何区分这些格式的好信息,或者更好的是,在这些格式之间进行转换:

http://www.gnu.org/software/octave/doc/interpreter/Audio-Processing.html

您可能希望在某个固定数量的样本窗口上对这些样本进行平均。

【讨论】:

  • “流中给定点的数据就是体积。” 不,不是。不是OP所指的那种卷。例如。信号中的“平线”值 127 不是全音量,而是 0 音量。
  • 是的..我试图在第二段中说明这一点..我将进行编辑以澄清;但是,即使这样也很简单,因为这并没有考虑到 mu-law 编码的可能性..
  • 您混淆了伸长率和振幅。声音文件中的帧代表采样的伸长率。例如,正弦波y[i] = sin( omega * i ) 的伸长率在 -1 和 1 之间振荡,而幅度是恒定的 (1)。按体积,您指的是某种幅度测量。
  • 不正确。我很确定我没有混淆任何东西。小心你的想法。数字音频的质量必然是有限的,因此动态范围受到限制。这些限制是你与其他东西混淆的地方。样本的名称完全一样:瞬时体积的“样本”。扬声器线圈需要正负信号(前后移动)。原始数字音频只是扬声器线圈在任何时刻都应获得的功率(移动了动态范围的一半,因此正负区域的动态范围相等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多