音声を可視化したい(4)
2011-11-11 - 理想のユーザ・インターフェイスを求めての続き。
日常の音を録音したファイルから、得られた波形を周波数分解する。何も考えずに、フーリエ変換のライブラリを使ってみた。ソースは下の通り。
# sound02.py import numpy as np import matplotlib.pyplot as plt import wave #wf = wave.open("noise01.wav", "r") wf = wave.open("noise02.wav", "r") nframe = wf.getnframes() rframe = wf.getframerate() buf = wf.readframes(nframe) wf.close() y = np.frombuffer(buf,dtype="int16") t = np.arange(0,len(y))/float(rframe) dsc=0.000125 f = np.fft.fftfreq(t.size, dsc) s = np.fft.fft(y) am = np.sqrt(s.real**2 + s.imag**2) plt.subplot(211) plt.plot(t, y, 'r') plt.xlabel('Time [sec]') plt.axis([0, 20, -4000, 4000]) plt.subplot(212) plt.plot(f, am, 'r') plt.xlabel('Frequency [Hz]') plt.axis([10, 3000, 10, 1000000]) plt.xscale('log') plt.yscale('log') plt.show()
音のデータは、サンプリング間隔0.000125秒で、161600個ある。上のコードでは、t.size=161600となっている。つまり、サンプル数が2のべき乗になっていないが、どのように処理されているのだろうか。
サンプル1(うるさい場合)の波形とフーリエ変換の結果は、下図。
サンプル2(静かな場合)の波形とフーリエ変換の結果は、下図。