2016-09-30 3 views
1

WarrenWeckesserがwavioを使用しています.24ビットwavファイルをPythonで読む必要があります。私が持っているwavファイルは、ある計測器で生成されており、正規化やスケーリングを行わずに生の値を取得しようとしています。wavio Python 3.5で24ビットWAVを読む

if sampwidth == 3: 
     a = _np.empty((num_samples, nchannels, 4), dtype=_np.uint8) 
     raw_bytes = _np.fromstring(data, dtype=_np.uint8) 
     a[:, :, :sampwidth] = raw_bytes.reshape(-1, nchannels, sampwidth) 
     a[:, :, sampwidth:] = (a[:, :, sampwidth - 1:sampwidth] >> 7) * 255 
     result = a.view('<i4').reshape(a.shape[:-1] 

誰かが、それは実際に(私は比較的numpyのために新しく、配列スライスしています)何をしているか説明できます:wavioモジュールで

作業を行うコードはこれです。私はそれのほとんどを理解するが、私はここで何が起こっているか理解していない:

a[:, :, sampwidth:] = (a[:, :, sampwidth - 1:sampwidth] >> 7) * 255 

私の場合、それは24〜32ビットから変換しないが、私はそれがデータをスケーリングされているかどうかうまくいかないことができ、生の値を変更せずに単純に埋め込むことができます。

+0

データの縮尺や正規化は行われません。ファイルからの符号付き24ビットデータを符号付き32ビットデータとしてnumpy配列に格納できるように符号を拡張します。 @ kennytmの答えはそれをかなりうまく解消する。 –

+0

おかげさまで、私は多くのことを考えましたが、私は確信する必要がありました。それはどこのドキュメンテーションにありますか? – Sam

+0

docstringは 'wavio.read'がデータの縮尺を変更しないと述べていませんが、' wavio.write' *のデフォルト値はデータを拡大するために 'read 'はしません。 –

答えて

1

aの形状は、その行が

a[:, :, 3] = (a[:, :, 2] >> 7) * 255 

我々は外側の2つのループdevectorize可能性と同じである

a[:, :, 3:] = (a[:, :, 2:3] >> 7) * 255 

と同じであるので、(num_samples, nchannels, 4)sampwidth == 3である:

for i in range(num_samples): 
    for j in range(nchannels): 
     a[i, j, 3] = (a[i, j, 2] >> 7) * 255 

dtypeがa iそれは≥128であるので、上記となったときの値が< 128、又は1である場合、S _np.uint8のでa[...] >> 7のみ0を与えることができる:

for i in range(num_samples): 
    for j in range(nchannels): 
     v = a[i, j, 2] 
     a[i, j, 3] = 255 if v >= 128 else 0 

データは24ビットリトルエンディアン整数である場合、これをsign-extensionを32ビットにすることと同じです。

関連する問題