3

我正在启动一个项目,该项目将允许我使用 Java 读取声音样本,并取决于每个样本的属性(为了简化,我目前正在考虑专注于分贝,或者找到某种方法来计算整体一个特定样本或一组样本的“音量”),返回一个 0-255 之间的值,其中 0 表示静音,255 表示最高声压(与参考点相比,我想?我不知道怎么说这)。然后我想将这些值作为字节返回并发送到 Arduino,以便使用 PWM 控制 LED 的强度,并在视觉上“看到”音乐。

我不是任何类型的音频文件格式专家,并且对数据如何存储在音乐文件中没有特别的了解。因此,我很难找出如何读取样本并找到一种将其整体音量级别表示为字节的方法。我浏览了 javax.sound.sampled 包,这一切都让我很困惑。任何关于我如何实现这一点的见解将不胜感激。

4

2 回答 2

3

首先,我建议您阅读脉冲编码调制,这是用于将数据存储在 .wav 文件中的格式(最简单的开始)。

接下来有一篇关于如何从 java 中的 wav 文件中获取 PCM 数据的帖子

最后要得到“体积”(实际上是更多的能量)应用这个能量方程

希望它可以帮助你,

于 2013-05-15T07:39:51.327 回答
2

正如 Bastyen(我 +1)所指出的,计算分贝实际上并不简单,但需要查看大量样本。然而,由于声音样本比动画中的视觉帧更频繁地运行,因此进行聚合测量相当巧妙。

一个不错的视觉动画速率,例如每秒更新 60 次,最常见的声音采样率为每秒 44100 次。因此,735 个样本 (44100 / 60 = 735) 可能最终成为与可视化器交互的好选择。

顺便说一句,在我读过的所有官方 Java 教程中(我是一个忠实的粉丝),我发现 javax.sound.sampled 附带的那些是最难的。http://docs.oracle.com/javase/tutorial/sound/TOC.html
但它们仍然值得一读。如果我负责重写,将会有更多的代码示例。一些最好的代码示例在几个部分很深,例如,“使用文件和格式转换器”讨论。

如果您不希望计算 RMS,则可以为给定数量的样本存储本地高和/或低值。将这些数字与分贝相关联是值得怀疑的,但在将您选择的映射到可视化器之后可能会很有用。部分问题在于给定波上单个点的值范围可能很大。局部高可能更多是由于发生排列的组成谐波的相位而不是能量或体积。

对于 8 位编码,您的 PCM 顶部和底部值可能不是 0 和 256,更可能是 -128 到 127。更常见的是 16 位编码(-32768 到 32767)。但是,如果您关注 Bastyen 的链接,您将掌握这一点。为了使您的代码独立于位编码,您可能会在进行任何其他计算之前对数据进行规范化(转换为 -1 和 1 之间的浮点数)。

于 2013-05-15T21:05:45.163 回答