在给定时间查找.wav的"音量"

sea*_*owg 4 java audio scala signal-processing wav

我正在为我的第四年项目(处理功能反应式编程)开发一个小型示例应用程序.我们的想法是创建一个简单的程序,可以播放.wav文件,然后显示播放歌曲当前音量的"弹跳"动画(如音频录制软件).我在Scala中构建它,因此主要是查看Java库和现有解决方案.

目前,我已经设法轻松播放.wav文件,但我似乎无法实现第二个目标.基本上有一种方法可以解码.wav文件,这样我可以在任何给定的时间访问'音量'吗?按体积我认为我的意思是它的幅度,但我可能错了 - 高等物理学不久前......

显然,我对此一点都不太了解,所以如果有人能指出我正确的方向,那就太棒了!

sna*_*pop 6

在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 音量。 (2认同)
  • 您正在混淆伸长率和振幅。声音文件中的帧表示采样的伸长率。例如,正弦波 `y[i] = sin( omega * i )` 的伸长率在 -1 和 1 之间振荡,而幅度是常数 (1)。按体积,您指的是某种幅度测量。 (2认同)
  • 不正确。我很确定我没有混淆任何东西。小心你的想法。数字音频的质量必然是有限的,因此动态范围受到限制。这些限制是您与其他事物混淆的地方。样品正如其名:瞬时体积的“样品”。扬声器线圈需要正负信号(来回移动)。原始数字音频只是扬声器线圈在任何时刻应该获得的功率(移动一半的动态范围,因此正负区域的动态范围相等)。 (2认同)

0__*_*0__ 5

在数字音频处理中,您通常会参考信号的瞬时峰值幅度(这也称为PPM - 峰值程序计量).根据您想要的准确程度或者您是否希望为某些标准化计量进行建模,您也可以

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

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

您通常以对数方式显示值,即以分贝单位,因为这与我们对信号强度的感知更好地对应,并且对于大多数信号也可以更加规则地覆盖屏幕空间.

我参与的三个项目可以帮助您:

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