Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Obtain wave pattern of a audio file in Java

I'm wondering how I may obtain musical information such as amplitude from a audio file?

Suppose we have a raw audio file, what I want to extract data from the file which allows me to generate a curve such as http://www1.icsi.berkeley.edu/Speech/mr/nearfar.html. Once I have obtained this curve, I will perform FFT, etc.

enter image description here

I have been trying to search for solutions in Java Sound, but what I only know so far is that I can pour the data into byte[] using AudioInputStream. But how do I translate that byte[] into a double[] which contains actual information about the sound? In this case, the values in the double[] represent amplitude.

Could anyone please provide a solution to solve this problem in Java?

like image 598
user1767408 Avatar asked Oct 23 '12 06:10

user1767408


1 Answers

Typical wav file is 16 bit little endian, so you can take each two consecutive bytes, b1 and b2, and get the amplitude as follows:

(double) (b2 << 8 | b1 & 0xFF) / 32767.0;

if the input is stereo, first two bytes would be left channel, then two bytes for right channel.

like image 188
Denis Tulskiy Avatar answered Nov 01 '22 02:11

Denis Tulskiy