何故か急にwavファイルを作りたくなったので作成してみましたので、その際に覚えた知識をメモとして残します。
ライブラリ
本投稿では下のライブラリを使います。
- math(正弦波を作成するため)
- numpy(1次元配列を扱うため)
- scipy(wavファイルの作成のため)
- playsound(wavファイルの再生のため)
波形を作る
サンプルとして100Hzの正弦波を作成します。なお、サンプリングレートを44100Hzとするため、441個で1周期となる正弦波を100個(つまり1秒分)作成しています。
import math
data = [ math.sin(2 * math.pi * i / 441) for i in range(44100) ]
データを整数化する
wavファイルにするにはint16
にしないといけないので、波形の最大値で割り、int16
の正の最大値である32767
を掛けてから、int16
にしています。
import numpy as np
data2 = np.int16(data / np.abs(data).max() * 32767)
wavファイルとして保存
ファイル名をtest.wav
、サンプリングレートを44100
として保存します。
from scipy.io.wavfile import write
write('test.wav', 44100, data2)
wavファイルの再生
保存したwavファイルを再生します。
from playsound import playsound
playsound('test.wav')
おまけ
逆に保存したファイルを高速フーリエ変換(FFT)してみました。ファイルの読み込みにはwaveライブラリを使います。上記で作成したwavファイルであれば、下のようなプログラムになります。(モノラル16bitの場合だけです。bit数が違っていたりステレオ等だと、データフォーマットが違うので使えません)
import wave
import numpy as np
f = wave.open('test.wav', 'rb')
data = f.readframes(f.getnframes())
f.close()
data2 = np.frombuffer(data, dtype = 'int16')
data3 = np.fft.fft(data2 / np.abs(data2).max())