2012-03-19 61 views
2

我需要以24位pcm格式從wav文件中讀取數據,並將其轉換爲浮點數。我正在使用Python 2.7.2。將24位wav pcm格式轉換爲浮點型的更快方法?

波包作爲一個字符串讀取數據,所以我已經試過是:

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 

這是相當多的比我以前的方法更快,但仍相當緩慢。任何人都可以提出更有效的方法嗎?

+1

顯然你有NumPy的。爲什麼不全程使用它? – 2012-03-19 23:27:24

回答

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 
+0

您不需要轉換爲'np.array',因爲'read_frames()'已經返回一個'np.array '。你甚至可以指定一個'dtype'參數,但是要知道,如果你使用的是一個不是'np.float64'的類型,那麼當前(版本0.11.0)有一個錯誤:https://github.com/cournape/audiolab/問題/ 3 – Matthias 2013-11-06 09:08:15

+0

'scikits.audiolab'似乎不再被維護。作爲一個(很可能同樣快)的選擇,你可以嘗試[PySoundFile](http://pysoundfile.readthedocs.org/)。 – Matthias 2015-09-17 12:27:24

0
import sndhdr, wave, struct 
if sndhdr.what(fname)[0] != 'wav' 
    raise StandardError("file doesn't have wav header") 
try: 
    wav = wave.open(fname) 
    params = (nchannels,sampwidth,rate,nframes,comp,compname) = wav.getparams() 
    frames = wav.readframes(nframes*nchannels) 
finally: 
    wav.close() 
out = struct.unpack_from ("%dh" % nframes*nchannels, frames) 
+1

將兩個字節的數據轉換爲一個整數,但數據寬度爲三個字節。 FWIW,對於採樣寬度大於2的wav pcm格式,sndhdr在wave不識別時識別官方格式,因此可能存在另一個錯誤條件。 – LMO 2012-03-20 01:29:36

+0

這看起來很快: – LMO 2012-03-20 04:49:37

+0

如何將此'out'轉換爲二維numpy數組? ('np.array(out)'只給出1個數組,所以我們不能處理2個通道) – Basj 2013-11-13 20:17:40