振幅A、サンプリング周波数fs、周波数f0、時間nのサイン波(正弦波)は下記の関数として定義できます。
サイン波の式
とすると、
今回は、サンプリング周波数が8kHzで周波数440Hz(ラの音)のwavファイルを作成を行いました。
スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# -*- coding: utf-8 -*- import wave import numpy as np from matplotlib import pylab as plt import struct a = 1 #振幅 fs = 8000 #サンプリング周波数 f0 = 440 #周波数 sec = 5 #秒 swav=[] for n in np.arange(fs * sec): #サイン波を生成 s = a * np.sin(2.0 * np.pi * f0 * n / fs) swav.append(s) #サイン波を表示 plt.plot(swav[0:100]) plt.show() #サイン波を-32768から32767の整数値に変換(signed 16bit pcmへ) swav = [int(x * 32767.0) for x in swav] #バイナリ化 binwave = struct.pack("h" * len(swav), *swav) #サイン波をwavファイルとして書き出し w = wave.Wave_write("output.wav") p = (1, 2, 8000, len(binwave), 'NONE', 'not compressed') w.setparams(p) w.writeframes(binwave) w.close() |
出力されたwavファイル
今回は440Hzの音(ラ・A4)で試しましたが、ド(C4)は261.63Hz、レ(D4)は293.66Hzというように音階(十二平均律音階)は周波数が決まっています。なのでスクリプトを改造して簡単な音楽のwavファイルをつくることもできます。