我正在为我的第四年项目(处理函数反应式编程)开发一个小型示例应用程序。我们的想法是创建一个简单的程序,可以播放 .wav 文件,然后显示正在播放歌曲的当前音量的“弹跳”动画(就像在录音软件中一样)。我正在 Scala 中构建它,因此主要关注 Java 库和现有解决方案。
目前,我已经成功地播放了 .wav 文件,但我似乎无法实现第二个目标。基本上有没有一种方法可以解码 .wav 文件,以便我可以通过某种方式访问
任何给定时间的“音量”?就体积而言,我想我的意思是它的振幅,但我可能是错的 - 高等物理学是不久前......
显然,我对此一无所知,所以如果有人能指出我正确的方向,那就太好了!
在数字音频处理中,您通常指的是信号的瞬时峰值幅度(也称为PPM-- 峰值节目计量 http://en.wikipedia.org/wiki/Peak_programme_meter)。根据您想要的准确程度或者您是否希望对某些标准化计量进行建模,您可以
- 只需使用样本帧的滑动窗口(找到每个窗口的最大绝对值)
- 实现某种峰值保持机制,在给定的持续时间内保留最后一个峰值,然后开始让该值以每秒给定的分贝数“下降”。
另一种测量模式是 RMS,它是通过在某个时间窗口内积分来计算的(将采样值的平方相加,除以窗口长度,然后取平方根,即均方根 RMS)。这可以更好地了解信号的“能量”,比峰值测量更平滑,但不会捕获观察到的最大值。这种模式有时被称为VU meter http://en.wikipedia.org/wiki/VU_meter以及。您可以使用一种滞后(低通)滤波器来近似这一点,例如y[i] = y[i-1]*a + |x[i]|*(a-1)
,对于某个值0 < a < 1
通常以对数方式显示值,即decibels http://en.wikipedia.org/wiki/Decibel,因为这更符合我们对信号强度的感知,而且对于大多数信号来说,它会更规则地覆盖您的屏幕空间。
我参与的三个项目可能会对您有所帮助:
-
Scala音频文件 https://github.com/Sciss/ScalaAudioFile您可以使用它从 AIFF 或 WAVE 文件中读取示例帧
-
ScalaAudioWidgets https://github.com/Sciss/ScalaAudioWidgets这是一个仍然年轻且不完整的项目,旨在在 scala-swing 之上提供一些音频应用程序小部件,包括 PPM 视图——只需使用滑动窗口并定期设置窗口的当前峰值(以及可选的 RMS),以及该视图将处理峰值保持和下降时间
- (斯卡拉碰撞器 https://github.com/Sciss/ScalaCollider,SuperCollider 声音合成系统的客户端,您可以使用它来播放声音文件并实时测量峰值和 RMS 幅度。后者对于您的项目来说可能有点大材小用,并且如果您从未听说过 SuperCollider,则会涉及一些严重的学习曲线。优点是您无需担心声音播放与仪表显示的同步)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)