[英]Wave File raw data 16bits Sample values
我正在嘗試生成一個顯示波形文件幅度的圖表。
我已讀取文件字節,然后通過 little endian 轉換為十六進制,然后將值轉換為小數。
但是即使聲音是 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
來做到這一點。 現在短的最左邊的位是一,這意味着數字是負數。
int i = Integer.parseInt("FE87", 16);
System.out.println(i);
short sample = (short) i;
System.out.println(sample);
Output:
65159
-377
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.