2012-03-19 6 views
2

24ビットpcmフォーマットのwavファイルからデータを読み込み、floatに変換する必要があります。私は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

を持っています。どうしてそれを使ってみませんか? –

答えて

1

これは非常に高速であるように思わ、それが24ビット値を処理し、それが正規ん:明らかにあなたはnumpyのを

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

'read_frames()'が 'np.array 'を返すので、' np.array'に変換する必要はありません。 '。 'dtype'引数を指定することもできますが、' np.float64'以外の型を使うとバグが現れている(バージョン0.11.0)ことに注意してください:https://github.com/cournape/audiolab/ issues/3 – Matthias

+0

'scikits.audiolab'はもはや維持されていないようです。 (おそらく同様に速い)別の方法として[PySoundFile](http://pysoundfile.readthedocs.org/)を試すことができます。 – Matthias

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

これは2バイトのデータを整数に変換しますが、データは3バイト幅です。 FWIW、samplewidth> 2のwav pcmフォーマットの場合、sndhdrは公式フォーマットを認識しますが、waveはそうではないため、別のエラー条件が発生する可能性があります。 – LMO

+0

これはかなり素早く見えます: – LMO

+0

この 'out'を2次元のnumpy配列に変換する方法は? ( 'np.array(out)'は1つの配列しか持たないので、2つのチャンネルを扱うことはできません) – Basj

関連する問題