我正在尝试生成一个展示波形文件振幅的图形。
我已经读取了文件字节,然后通过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/