【NumPy】FFTによって周波数スペクトルを求める

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
タイトルとURLをコピーしました