用 dB 表示音乐音频样本? [复制]
Posted
技术标签:
【中文标题】用 dB 表示音乐音频样本? [复制]【英文标题】:Representing music audio samples in terms of dB? [duplicate] 【发布时间】:2013-05-15 02:53:05 【问题描述】:我正在启动一个项目,该项目允许我使用 Java 来读取声音样本,并且取决于每个样本的属性(为了简化,我正在考虑目前专注于分贝,或者找到一些方法来计算特定样本或一组样本的整体“音量”),返回一个 0-255 之间的值,其中 0 表示静音,255 表示最高声压(与参考点相比,我想?我不知道这个怎么写)。然后我想将这些值作为字节返回并发送到 Arduino,以便使用 PWM 控制 LED 的强度,并在视觉上“看到”音乐。
我不是任何类型的音频文件格式专家,并且对数据如何存储在音乐文件中没有特别的了解。因此,我很难找出如何读取样本并找到一种将其整体音量级别表示为字节的方法。我浏览了 javax.sound.sampled 包,这一切都让我很困惑。任何关于我如何实现这一点的见解将不胜感激。
【问题讨论】:
不,这不一样。 究竟有什么不同?现在是输入更多而不是更少的好时机。 这根本不是链接问题的副本。 【参考方案1】:首先我建议您阅读Pulse-code modulation,这是用于将数据存储在 .wav 文件中的格式(最简单的开头)。
接下来有一篇关于如何从javahere中的wav文件中获取PCM数据的帖子。
最终获得“音量”(实际上更多的是能量)应用此energy equation。
希望对你有帮助,
【讨论】:
那个链接失效了。你的意思是什么方程? 感谢您发现它。编辑了与 dsp.stackexchange.com 相关答案的链接。【参考方案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 之间的浮点数)。
【讨论】:
我喜欢每秒更新 60 次的想法,它确实比我的 10ms 更适合这个应用程序(更适合声音处理)。 感谢编辑!很抱歉第一次没有正确地做。以上是关于用 dB 表示音乐音频样本? [复制]的主要内容,如果未能解决你的问题,请参考以下文章