我正在开始一个允许我使用Java来读取声音样本的项目,并且取决于每个样本的属性(为了简化起见,我正在考虑专注于分贝,或者找到一些方法来计算特定样本或样本集的总体“体积”,返回0-255的值,其中0表示静音,255表示最高声压(与参考点相比,我想?我不知道怎么说这个)。我希望将这些值作为字节返回并发送到Arduino,以便使用PWM控制LED的强度,并在视觉上“看到”音乐。
我不是任何类型的音频文件格式专家,也没有特别了解数据如何存储在音乐文件中。因此,我无法找到如何读取样本并找到将其整体音量级别表示为字节的方法。我查看了javax.sound.sampled包,这对我来说非常困惑。任何关于如何实现这一目标的见解将不胜感激。
答案 0 :(得分:3)
首先,我建议您阅读Pulse-code modulation,这是用于在.wav文件上存储数据的格式(最简单的开头)。
接下来有一篇关于如何从java here中的wav文件获取PCM数据的帖子。
最后要获得“音量”(实际上更多是能量)应用此
energy equation http://img15.hostingpics.net/pics/922956CodeCogsEqn.gif
在大约10ms声音的窗口上(在44100kHz单声道10ms => 441个样本)。
希望它可以帮到你,
答案 1 :(得分:2)
正如Bastyen(我的+1)所示,计算分贝实际上并不简单,但需要查看大量样本。但是,由于声音样本比动画中的视觉帧更频繁地运行,因此使得聚合度量相当整齐。
一个不错的视觉动画率,例如,每秒更新60次,最常见的声音采样率是每秒44100次。因此,735个样本(44100/60 = 735)可能最终成为与可视化器连接的良好选择。
顺便说一下,在我读过的所有官方Java教程中(我是一个忠实的粉丝),我发现javax.sound.sampled附带的那些是最困难的。 http://docs.oracle.com/javase/tutorial/sound/TOC.html
但它们仍然值得一读。如果我负责重写,那么会有更多的代码示例。一些最好的代码示例分为几个部分,例如“使用文件和格式转换器”讨论。
如果您不希望计算RMS,则黑客将存储给定数量的样本的本地高和/或低值。将这些数字与分贝相关联将是可疑的,但是在将您的选择映射到可视化器之后,MAYBE可能很有用。部分问题是给定波浪上单个点的值可能会非常大。局部高点可能更多是由于组成谐波的相位发生排列而不是能量或体积。
您的PCM顶部和底部值可能不是0和256,对于8位编码,更可能是-128到127。更常见的仍然是16位编码(-32768到32767)。但是,如果你按照Bastyen的链接,你会得到这个。为了使代码独立于位编码,您可能会在进行任何其他计算之前对数据进行规范化(转换为介于-1和1之间的浮点数)。