2013-09-05 41 views
8

私はその内容を操作、その後、wavファイルを読み込むしようとしている、サンプルPythonでwavファイルのデータを操作するには?

によってサンプルがここで私がこれまで持っているものです:私が得る

import scipy.io.wavfile 
import math 

rate, data = scipy.io.wavfile.read('xenencounter_23.wav') 

for i in range(len(data)): 
    data[i][0] = math.sin(data[i][0]) 
    print data[i][0] 

結果は次のとおりです。

0 
0 
0 
0 
0 
0 

など

代わりにprint data[i]と書くと、通常はサイズが2のゼロ以外の配列が得られます。

答えて

11

wavfile.readによって返される配列dataは、の整数データ型のnumpy配列です。 numpyのアレイのデータ型が所定の位置に変更することができないので、このライン:

data[i][0] = math.sin(data[i][0]) 

は常に作成し、その代わりに、その行の0

あろう整数にmath.sinの結果をキャスト計算結果を格納する新しい浮動小数点配列。

それとも一度に配列内のすべての要素の正弦を計算するためにnumpy.sinを使用します。

import numpy as np 
import scipy.io.wavfile 

rate, data = scipy.io.wavfile.read('xenencounter_23.wav') 

sin_data = np.sin(data) 

print sin_data 

あなたの追加のコメントから、あなたがそれぞれの値の正弦をと​​り、結果を書きたいことが表示されます新しいwavファイルとして。

ここに、私が望むものがあると思う例があります。ここでは、ファイル「M1F1-int16-AFsp.wav」を使用します:http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html。関数show_infoは、各ステップの結果を説明するのに便利な方法です。対話型シェルを使用している場合は、これを使用して変数とその属性を検査できます。

import numpy as np 
from scipy.io import wavfile 

def show_info(aname, a): 
    print "Array", aname 
    print "shape:", a.shape 
    print "dtype:", a.dtype 
    print "min, max:", a.min(), a.max() 
    print 

rate, data = wavfile.read('M1F1-int16-AFsp.wav') 

show_info("data", data) 

# Take the sine of each element in `data`. 
# The np.sin function is "vectorized", so there is no need 
# for a Python loop here. 
sindata = np.sin(data) 

show_info("sindata", sindata) 

# Scale up the values to 16 bit integer range and round 
# the value. 
scaled = np.round(32767*sindata) 

show_info("scaled", scaled) 

# Cast `scaled` to an array with a 16 bit signed integer data type. 
newdata = scaled.astype(np.int16) 

show_info("newdata", newdata) 

# Write the data to 'newname.wav' 
wavfile.write('newname.wav', rate, newdata) 

ここに出力があります。 (初期の警告は、いくつかのメタデータがscipy.io.wavfile.readによって理解されていないファイルにおそらく存在することを意味する。)

<snip>/scipy/io/wavfile.py:147: WavFileWarning: Chunk (non-data) not understood, skipping it. 
    WavFileWarning) 
Array 'data' 
shape: (23493, 2) 
dtype: int16 
min, max: -7125 14325 

Array 'sindata' 
shape: (23493, 2) 
dtype: float32 
min, max: -0.999992 0.999991 

Array 'scaled' 
shape: (23493, 2) 
dtype: float32 
min, max: -32767.0 32767.0 

Array 'newdata' 
shape: (23493, 2) 
dtype: int16 
min, max: -32767 32767 

新しいファイル「newname.wav」が符号付き16ビット値の2つのチャネルを含んでいます。

+1

+1は 'np.sin(...)'を示唆しています。それは確かに行く方法です、そしてそれは速く*道*でしょう。 – nneonneo

+0

ありがとうございます。私は正弦値を別の配列(または技術的にリスト)に保存しようとしましたが、書き込み時に 'AttributeError: 'list'オブジェクトに属性 'ndim'がありません。 – JVE999

+0

@ Jamil、あなたは自分自身(例:http://www.engr.ucsb.edu/~shell/che210d/numpy.pdf、またはhttp://wiki.scipy.org/Tentative_NumPy_Tutorial、または他の多くのnumpyのチュートリアルそこに)。あなたがしたことを見ずに、私はその問題を解決することができません。 –