, を正の定数とするとき、時刻 (秒) での値が
である信号は、振幅 , 周波数 (Hz) の正弦波である。
次のプログラムを実行すると、 の信号を10秒間記録した WAVEファイル (サンプリング周波数 モノラル、 量子化ビット数 16ビット、モノラル) ``sinwave.wav'' が出来る。
http://nalab.mind.meiji.ac.jp/~mk/fourier/testwritewave.py
1 # testwritewave.py 2 # encoding: utf-8 3 # http://nalab.mind.meiji.ac.jp/~mk/lecture/fourier-2017/testwavemodule3.py 4 # これは Python 3.x 用のプログラム 5 6 import numpy as np 7 import wave 8 import struct 9 10 fname = 'sinwave.wav' 11 wf = wave.open(fname, 'w') 12 ch = 1 13 width = 2 14 samplerate = 44100 15 wf.setnchannels(ch) 16 wf.setsampwidth(width) 17 wf.setframerate(samplerate) 18 19 time = 10 20 numsamples = time * samplerate 21 22 # python 2.x では ( ) を取る 23 print( u"チャンネル数 = ", ch) 24 print( u"サンプル幅 (バイト数) = ", width) 25 print( u"サンプリングレート(Hz) =", samplerate) 26 print( u"サンプル数 =", numsamples) 27 print( u"録音時間 =", time) 28 29 # 信号データを作る (numpy の ndarray で) 30 freq = 440 # 周波数 freq を 440 Hz にする 31 x=np.linspace(0, time, numsamples+1) # 0≦t≦time をnumsamples等分 32 y=np.sin(2 * np.pi * freq * x) # 周波数 freq (Hz) の正弦波 33 y=np.rint(32767*y/max(abs(y))) # [-32767,32767] の範囲に収める 34 y=y.astype(np.int16) # 16ビット整数に型変換する 35 y=y[0:numsamples] # numsamples 個のデータに打ち切る 36 37 # ndarray から bytes オブジェクトに変換 38 data=struct.pack("h" * numsamples , *y) 39 40 # データを書き出す 41 wf.writeframes(data) 42 wf.close()
桂田 祐史