我已经获得了一个连续水下录制的大型WAV文件,我想将其转换为numpy数组进行分析。我正在努力做到这一点。
到目前为止,我有:
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)
第一帧看起来像这样:'\ xcd \ xbc \ xff @ \ x01 \ x00'。我试图使用struct解压缩但是无论我做什么,我都会收到以下错误:“ str size与格式不匹配”。我想这与Python struct无法处理24位数据有关。
wave文件的参数如下所示:
有人知道如何将24位立体声WAV文件读入一个numpy数组吗?
答案 0 :(得分:5)
这是一个循环,用于处理具有任意数量通道的2,3和4字节WAV文件:
def dataFromWave(fname):
""" return list with interleaved samples """
f = wave.open(fname, 'rb')
chans = f.getnchannels()
samps = f.getnframes()
sampwidth = f.getsampwidth()
if sampwidth == 3: #have to read this one sample at a time
s = ''
for k in xrange(samps):
fr = f.readframes(1)
for c in xrange(0,3*chans,3):
s += '\0'+fr[c:(c+3)] # put TRAILING 0 to make 32-bit (file is little-endian)
else:
s = f.readframes(samps)
f.close()
unpstr = '<{0}{1}'.format(samps*chans, {1:'b',2:'h',3:'i',4:'i',8:'q'}[sampwidth])
x = list(struct.unpack(unpstr, s))
if sampwidth == 3:
x = [k >> 8 for k in x] #downshift to get +/- 2^24 with sign extension
return x
答案 1 :(得分:1)
对于那些有类似问题的人,我发布了我的解决方案。请注意,这会将24位波形文件转换为带符号的浮点数numpy数组。只转换为整数时将/ int2float部分保留。
frames = wavfile.readframes(nsamples)
ch1 = np.zeros(nsamples)
ch2 = np.zeros(nsamples)
int2float = (2**23)-1
for x in np.arange(int(nsamples)):
ch1_24bit_sample = frames[x*6:x*6+3]
ch2_24bit_sample = frames[x*6+3:x*6+6]
ch1_32bit_sample = bit24_2_32(ch1_24bit_sample)
ch2_32bit_sample = bit24_2_32(ch2_24bit_sample)
ch1[x]=struct.unpack('i',ch_32bit_sample)[0]
ch2[x]=struct.unpack('i',ch_32bit_sample)[0]
ch1[x]=ch1[x]/int2float
ch2[x]=ch2[x]/int2float
def bit24_2_32(strbytes):
if strbytes[2] < '\x80':
return strbytes+'\x00'
else:
return strbytes+'\xff'
答案 2 :(得分:1)
这是一个老问题,但如果有人需要其他选项并且使用外部模块没有限制,那么您可以使用librosa
myNdArray = librosa.core.load(wav_path, sr=sample_rate)[0]