Q_and_A_1

1800 days ago by takepwave

Hiroshi TAKEMOTO (take@pwv.co.jp)

Waveデータの内積の例

Sageを使って音声データのLとRの信号の内積を取りたいとのご質問がありましたので、 ここで説明します。

必要なインポート

音声データの処理は、Sageがpythonベースなので、pythonのscikits.audiolabを使って Wavファイルから取り出します。

必要なインポート文は、以下の通りです。

# 必要なインポート from scikits.audiolab import wavread, wavwrite from numpy import abs, max 
       
/usr/local/sage-6.0/local/lib/python2.7/site-packages/scikits.audiolab-0\
.11.0-py2.7-linux-x86_64.egg/scikits/audiolab/soundio/play.py:48:
UserWarning: Could not import alsa backend; most probably, you did not
have alsa headers when building audiolab
  warnings.warn("Could not import alsa backend; most probably, "
/usr/local/sage-6.0/local/lib/python2.7/site-packages/scikits.audiolab-0.11.0-py2.7-linux-x86_64.egg/scikits/audiolab/soundio/play.py:48: UserWarning: Could not import alsa backend; most probably, you did not have alsa headers when building audiolab
  warnings.warn("Could not import alsa backend; most probably, "

オーディオファイルの読み込み

WAVファイルの読み込み関数wavreadを使ってオーディオファイルの音源を 2個の配列に取り込みます。

# 2つの信号を混合したWavファイルを読み込む recording, fs, enc = wavread(DATA + 'mixed.wav') 
       

Wavファイル(mixed.wav)がrecording変数にセットされますので、 これを使ってRとLの信号のvectorを作ります。

最初にrecordingのサイズと型を調べます。

len(recording) 
       
882000
882000
type(recording) 
       
<type 'numpy.ndarray'>
<type 'numpy.ndarray'>

recordingがnumpyの配列であることがわかりましたので、次数を求めます。

recording.shape 
       
(882000, 2)
(882000, 2)

内積を求める

Pythnのnumpyの88200 x 2の配列であることが分かりましたので、 この値からSageのvectorを生成して、内積を求めます。

# numpyの配列からRとLのvectorを生成 l_vec = vector(recording[: , 0]) r_vec = vector(recording[: , 1]) 
       
# 内積 LdotR = l_vec.dot_product(r_vec) print LdotR 
       
27933.0420707
27933.0420707