【问题标题】:Faster way to convert from 24 bit wav pcm format to float?从 24 位 wav pcm 格式转换为浮点数的更快方法?
【发布时间】:2012-03-19 23:25:38
【问题描述】:

我需要从 24 位 pcm 格式的 wav 文件中读取数据,然后转换为浮点数。我正在使用 Python 2.7.2。

wave包以字符串的形式读取数据,所以我尝试的是:

import wave
import numpy as np
import array
import struct

f = wave.open('filename.wav')
# read in entire wav file
wdata = f.readframes(nFrames) 
f.close()

# unpack into signed integers and convert to float      
data = array.array('f')
for i in range(0,nFrames*3,3):
    data.append(float(struct.unpack('<i', '\x00'+ wdata[i:i+3])[0]))

# normalize sample values
data = np.array(data)
data = data / 0x800000

这比我之前的方法快了很多,但仍然很慢。谁能提出更有效的方法?

【问题讨论】:

  • 显然你有 NumPy。为什么不一直使用它呢?

标签: python wav pcm


【解决方案1】:

这似乎相当快,它处理 24 位值,并进行标准化:

from scikits.audiolab import Sndfile
import numpy as np

f = Sndfile(fname, 'r')
data = np.array(f.read_frames(f.nframes), dtype=np.float64)
f.close()
return data

【讨论】:

  • 您不需要转换为np.array,因为read_frames() 已经返回np.array。您甚至可以指定dtype 参数,但请注意,如果您使用np.float64 以外的类型,则当前(版本0.11.0)存在错误:github.com/cournape/audiolab/issues/3
  • scikits.audiolab 似乎不再维护。作为(很可能同样快)替代方案,您可以尝试PySoundFile
猜你喜欢
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
相关资源
最近更新 更多