2.2 正弦波の WAVE ファイルを作る

$ A$ , $ f$ を正の定数とするとき、時刻 $ t$ (秒) での値が

$\displaystyle u(t)=A\sin(2\pi f t)
$

である信号は、振幅 $ A$ , 周波数 $ f$ (Hz) の正弦波である。

次のプログラムを実行すると、 $ f=440\;\mathrm{Hz}$ の信号を10秒間記録した WAVEファイル (サンプリング周波数 $ 44100\;\mathrm{Hz}$ モノラル、 量子化ビット数 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()

桂田 祐史
2018-01-28