音声を可視化したい(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(静かな場合)の波形とフーリエ変換の結果は、下図。