java - 波形文件原始数据16位采样值

标签 java audio wav waveform

我正在尝试生成一个展示波形文件振幅的图形。
我已经读取了文件字节,然后通过little endian转换为hex,然后将值转换为小数。
但是,即使声音是16位的,因此该值应该在(-32768,32768)之间,但是我得到的十进制值超过了该值并达到65000;
一个例子可能会更好地解释我的情况:
文件中的字节:(121,-2)
由于mono取两个值,即numChannels = 1,因此blockAlign = 2
小端值:87 FE
十六进制值(大端):FE87
小数:65159
我什至考虑将Hex设为-FE87,因为该字节具有负值,但我认为它们不能那样工作。
我认为这是罪魁祸首,但我无法弄清楚。
“16位样本存储为2的补码有符号整数,范围从-32768到32767。”
http://soundfile.sapp.org/doc/WaveFormat/
有人可以帮我解决我做错的事情吗,我已经花了数小时试图找出答案。

最佳答案

在二进制补码中(顺便说一下,Java本身使用了二进制补码),数字的符号由最左边的位确定。
当您解析该十六进制值FE87并将结果存储在int中时,最左边的位为零,因此结果为正。
您要做的是将16个最低有效位之外的所有位都切掉。您可以通过将int强制转换为short来实现。现在,short最左边的位是1,表示数字是负数。

int i = Integer.parseInt("FE87", 16);
System.out.println(i);
short sample = (short) i;
System.out.println(sample);
输出:
65159
-377

关于java - 波形文件原始数据16位采样值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62586794/

相关文章:

java - SWT表增量选择

jquery - 在 jQuery 中预加载 wav/mp3 文件

java - 从内部存储、Android Studio (JAVA) 播放音频文件的应用程序

java - Eclipse插件的插件,如何管理依赖关系?

Java 8 : merging two Lists containing objects by Id

jquery - jQuery声音通知有关新文件的内容

ios - 在自定义键盘扩展中播放标准 iOS 键盘点击声音

android - 在线播放多首音频

python - 使用Python将oga(Telegram音频文件fpormat)转换为ogg/wav文件格式

java - 我收到了关于计算每小时英里数的作业,但我的运行程序似乎无法找到我的时间变量