I have been given a large WAV-file of continuous underwater recording which I would like to convert to a numpy array for analysis. I am struggling to do this.
So far I have:
import numpy as np
import scipy as sp
import wave as wv
import struct
wavefile = wv.open(filename,'r')
(nchannels,sampwidth,framerate,nframes,comptype,compname) = wavefile.getparams()
// read a sample as example
wavedata =wavefile.readframes(1)
The first frame looks like this: '\xcd\xbc\xff@\x01\x00'. I have tried to unpack it using struct but unpack whatever I do I get the following error: "str size does not match format". I guess this is related to the fact that Python struct cannot handle 24-bit data.
The parameter of the wave-file looks as following:
- nchannels=2
- sampwidth=3
- framerate=48000
- nframes=283516532L
- comptype='NONE'
- compname='not compressed'
Someone know hows to read a 24-bit stereo WAV-file into a numpy array?
Here's a loop that handles 2, 3, and 4 byte WAV files with arbitrary numbers of channels:
This is an old question but if someone needs additional options and there is no restriction on using external modules, then you can probably use librosa
For those with similar issues I post my solution. Note that this converts a 24-bit wave file into a signed floating point numpy array. Leave the /int2float part out when only converting to integers.