fft()メソッドでFFT(高速フーリエ変換)を行い、波形の周波数スペクトルを求める。
import numpy as np
import matplotlib.pyplot as plt
a = 0.1
f0 = 440
fs = 44100
sec = 3
n = np.arange(fs * sec)[0:fs]
s = a * np.sin(2.0 * np.pi * f0 * n / fs)
F = np.fft.fft(s)
F_abs = np.abs(F)
F_a = F_abs / fs * 2
F_a[0] = F_abs[0] / fs
plt.plot(F_a[:int(fs/2)+1])
plt.show()
※ 秒数が1秒でない場合、周波数が秒数倍されてしまうので
1秒間(サンプリング周波数の長さ)だけでFFTを行うか、
全体の長さを1秒間(サンプリングの周期を秒数分の1)にする必要がある。
今回の場合、波形が振幅0.1、周波数440Hzの正弦波だけで構成されていることが分かる。
☆Tips
ifft()メソッドを用いることで、FFTの結果から元の波形を求めることができる。
import numpy as np
import matplotlib.pyplot as plt
a = 0.1
f0 = 440
fs = 44100
sec = 3
n = np.arange(fs * sec)[0:fs]
s = a * np.sin(2.0 * np.pi * f0 * n / fs)
F = np.fft.fft(s)
f = np.fft.ifft(F)
plt.plot(f[:int(fs/f0)])
plt.show()
参考
numpy.fft.fft — NumPy v2.1 Manual
numpy.fft.ifft — NumPy v2.1 Manual