2016-11-24 5 views
0

、パイソンを使用したWAVファイルを書きます。は私がKarplus-強力なアルゴリズムを実装しようとしていますnumpyのアレイとWAVEモジュール

(ギターアコードを表す)numpyの配列(オーディオ(y、レート= Fs))を使用してJupyter Notebookを通してすべてがうまく見えます。

残念なことに、numpyのアレイ書き込み:WAVEモジュールを使用して、WAVファイルにYは、(次のPythonコードを使用して)間違っている:Yの各要素は

<type 'numpy.float64'> 
noise_output = wave.open('k-s.wav', 'w') 
noise_output.setparams((1, 4, Fs, 0, 'NONE', 'not compressed')) 

for i in range(0, len(y)): 
    value = y[i] 
    packed_value = struct.pack('f', value) 
    noise_output.writeframes(packed_value) 

noise_output.close() 

ある

WAVファイルを正しく書き込むために書き込みループをどのように修正する必要がありますか?

問題に関するいくつかの詳細。 WAVに書き込む前に、Y配列の最初の要素は次のとおりです。

[ 0.33659756 0.33659756 -0.43915295 -0.87036152 1.40708988 0.32123558 
-0.6889402 1.9739982 -1.29587159 -0.12299964 2.18381762 0.82228042 
0.24593503 -1.28067426 -0.67568838 -0.01843234 -1.830472 1.2729578 
-0.56575346 0.55410736] 

WAVファイルに要素を書き込んだ後、WAVファイルを閉じて、もう一度それを読んで、私が収集したの最初の20個の要素のためにこれを得ました配列:

[ 1051481732 1051481732 -1092560728 -1084305405 1068768133 1050966269 
-1087349149 1073523705 -1079648481 -1107564740 1074512811 1062371576 
    1048303204 -1079775966 -1087571478 -1130954901 -1075163928 1067642952 
-1089415880 1057872379] 
+0

フロートデータを整数に変換し、リトルエンディアンでパックする必要があります。 –

+0

整数に変換するには?いくつかのスケーリングまたは?浮動小数点数は1に非常に近いので、おそらくスケーリングが必要でしょうか? @ PM2Ring – mir0soft

+0

はい、スケールする必要があります。私は符号付きの16ビット整数を使うことをお勧めします。浮動小数点数は '-2 ** 15

答えて

1
import scipy.io.wavfile 
scipy.io.wavfile.write("karplus.wav", Fs, y) 

多田! AFAIKはfloat64とfloat32で動作します。ステレオの場合、シェイプは(nb_samples、2)にする必要があります。 scipy.io.wavfile.writeを参照してください。

+0

はい、私はscipyで試してみましたが、すべて正常に動作しています。しかし、私はまだWAVEを使っているときにこれが起こっているのは困惑していますか? – mir0soft

関連する問題