python - 将 3 字节立体声 WAV 文件转换为 numpy 数组

标签 python numpy wav wave

我得到了一个连续水下录音的大型 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 does not match format”。我想这与 Python struct 无法处理 24 位数据有关。

波形文件的参数如下:

  • nchannels=2
  • 采样宽度=3
  • 帧率=48000
  • nframes=283516532L
  • comptype='NONE'
  • compname='未压缩'

有人知道如何将 24 位立体声 WAV 文件读入 numpy 数组吗?

最佳答案

这是一个循环,可以处理具有任意数量 channel 的 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

关于python - 将 3 字节立体声 WAV 文件转换为 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19709018/

相关文章:

python - 将类及其函数传递给另一个类

python - Pandas iloc vs 直接切片?

Python 2.7,在字符串的最后两位数字前添加破折号

python - 如何更改 NumPy 逻辑函数的基数?

java - 在给定时间查找 .wav 的 'volume'

python - 如何使用 web.py python 中的列表结果实现分页

python - Theano矩阵乘以2d矩阵得到3d矩阵

python - Pandas:绘制从上到下的表现者

java - 导入和连接WAV文件

c# - 将 AAC 转换为 WAV