Python で高速フーリエ変換(FFT)をプロットする
Shivam Arora
2023年1月30日
この Python チュートリアル記事では、高速フーリエ変換を理解し、Python でプロットします。
フーリエ解析は、周期成分の集合体として関数を伝達し、成分からそれらの信号を抽出します。関数とその変換の両方が離散部分と交換されるとき、それはフーリエ変換として表されます。
FFT は主に、実行速度を上げるための計算アルゴリズムと連携します。フィルタリングアルゴリズム、乗算、画像処理は、そのアプリケーションのいくつかです。
高速フーリエ変換に Python scipy.fft
モジュールを使用する
高速フーリエ変換で測定する最も重要なポイントの 1つは、タイムスタンプが均一なデータにのみ適用できることです。scipy.fft
モジュールは、指定された時間領域を周波数領域に変換します。長さ N 系列 x[n]
の FFT は、fft()
関数によって計算されます。
例えば、
from scipy.fftpack import fft
import numpy as np
x = np.array([4.0, 2.0, 1.0, -3.0, 1.5])
y = fft(x)
print(y)
出力:
[5.5 -0.j 6.69959347-2.82666927j 0.55040653+3.51033344j
0.55040653-3.51033344j 6.69959347+2.82666927j]
ノイズの多い信号は高い計算が必要なため、使用することもできます。たとえば、numpy.sin()
関数を使用して正弦級数を作成し、それをプロットできます。級数をプロットするために、Matplotlib
モジュールを使用します。
次の例を参照してください。
import scipy.fft
import matplotlib.pyplot as plt
import numpy as np
N = 500
T = 1.0 / 600.0
x = np.linspace(0.0, N * T, N)
y = np.sin(60.0 * 2.0 * np.pi * x) + 0.5 * np.sin(90.0 * 2.0 * np.pi * x)
y_f = scipy.fft.fft(y)
x_f = np.linspace(0.0, 1.0 / (2.0 * T), N // 2)
plt.plot(x_f, 2.0 / N * np.abs(y_f[: N // 2]))
plt.show()
scipy.fft
モジュールは scipy.fftpack
モジュール上に構築されており、より多くの追加機能と更新された機能を備えていることに注意してください。
高速フーリエ変換に Python numpy.fft
モジュールを使用する
numpy.fft
は scipy.fft
モジュールと同様に機能します。scipy.fft
は numpy.fft
からいくつかの機能をエクスポートします。
numpy.fft
は、2D 配列を処理するときに高速であると見なされます。実装は同じです。
例えば、
import matplotlib.pyplot as plt
import numpy as np
N = 500
T = 1.0 / 600.0
x = np.linspace(0.0, N * T, N)
y = np.sin(60.0 * 2.0 * np.pi * x) + 0.5 * np.sin(90.0 * 2.0 * np.pi * x)
y_f = np.fft.fft(y)
x_f = np.linspace(0.0, 1.0 / (2.0 * T), N // 2)
plt.plot(x_f, 2.0 / N * np.abs(y_f[: N // 2]))
plt.show()