Converting the sample rate on-the-fly when reading a WAV file into a samples array with Java Converting the sample rate on-the-fly when reading a WAV file into a samples array with Java windows windows

Converting the sample rate on-the-fly when reading a WAV file into a samples array with Java


For sample rates > 11025 Hz you need to downsample, which is a two stage process. First you need to low pass filter to satisfy the Nyquist criterion, and then you can decimate, e.g. for 44.1 kHz sample rate data you would need to low pass filter with a cut-off frequency of 5.5 kHz and then you can throw away 3 out of every 4 samples for a 4:1 downsampling ratio. You'll need a different filter for each downsampling ratio that you want to support.


I believe the accepted answer answers another question -- it solves the same problem (downsampling the audio) but in another way (manually in stead of using the java sound API). I had the same thing and dug into it.

The correct way (or java sound API way) to do this is indeed (as suggested in http://docs.oracle.com/javase/tutorial/sound/converters.html)

AudioFormat outDataFormat = new AudioFormat((float) 8000.0, (int) 8, (int) 1, true, false);AudioInputStream lowResAIS = AudioSystem.getAudioInputStream(outDataFormat, inFileAIS);

Problem is that standard java doesn't ship with resampling (or even stereo-mono conversion) code (or at least not in that part of the code -- see http://www.jsresources.org/faq_audio.html#convert_sample_rate).

The jsresources pages point to the answers as well: simply installing 2 plugins does the trick. Easiest is to install these plugins in the Extensions directory, on OSX Lion this will do the trick (provided you have wget):

wget http://www.tritonus.org/tritonus_share-0.3.6.jar -O /Library/Java/Extensions/tritonus_share-0.3.6.jarwget http://www.tritonus.org/tritonus_remaining-0.3.6.jar -O /Library/Java/Extensions/tritonus_remaining-0.3.6.jar

After adding these 2 jar files, everything worked (just one extra warning: if you want to change both the number of channels and the sample rate, it's still not supported as one step).