data
によって返される配列は、整数データ型wavfile.read
の numpy 配列です。numpy 配列のデータ型はその場で変更できないため、次の行:
data[i][0] = math.sin(data[i][0])
math.sin
の結果を常に 0 になる整数にキャストします。
その行の代わりに、計算結果を格納する新しい浮動小数点配列を作成します。
または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 つのチャネルが含まれています。