我正在为我的第四年项目(处理功能反应式编程)开发一个小型示例应用程序。我们的想法是创建一个简单的程序,可以播放.wav文件,然后显示播放歌曲当前音量的“弹跳”动画(如音频录制软件)。我在Scala中构建它,因此主要是查看Java库和现有解决方案。
目前,我已经设法轻松播放.wav文件,但我似乎无法实现第二个目标。基本上有一种方法我可以解码.wav文件,所以我可以有一些访问 在任何给定的时间'体积'?按体积我认为我的意思是它的幅度,但我可能错了 - 高等物理学是不久前的......
显然,我根本不了解这一点,所以如果有人能指出我正确的方向会很棒!
答案 0 :(得分:6)
在wav文件中,流中给定点的数据是体积(移动动态范围的一半)。换句话说,如果你知道什么类型的wav文件(例如8位,单声道),每个字节代表一个样本。如果您知道采样率(比如44100 HZ),那么将时间乘以44100,这就是您要查看的字节。
字节的值是体积(距离中间的距离... 0和255是峰值,127是零)。这假设编码不是mu-law编码。我找到了一些关于如何区分这些格式的好信息,或者更好的是,在这里转换这些格式:
http://www.gnu.org/software/octave/doc/interpreter/Audio-Processing.html
您可能希望通过一些固定数量的样本窗口来平均这些样本。
答案 1 :(得分:5)
在数字音频处理中,您通常会参考信号的瞬时峰值幅度(这也称为PPM -- peak programme metering)。根据您想要的准确程度,或者您是否希望对某些标准化计量进行建模,您可以
另一种测量模式是RMS,它是通过在某个时间窗上积分计算的(加上平方样本值,除以窗口长度,取平方根,即均方根RMS)。这样可以更好地了解信号的“能量”,比峰值测量更平滑,但不能捕获观察到的最大值。此模式有时也称为VU meter。您可以通过一种滞后(低通)滤波器对此进行近似,例如: y[i] = y[i-1]*a + |x[i]|*(a-1)
,有些值0 < a < 1
您通常以对数方式显示值,即在decibels中,因为这与我们对信号强度的感知更好地对应,并且对于大多数信号也会更频繁地覆盖屏幕空间。
我参与的三个项目可能对您有所帮助: