Python で高速フーリエ変換(FFT)をプロットする

Shivam Arora 2023年1月30日
  1. 高速フーリエ変換に Python scipy.fft モジュールを使用する
  2. 高速フーリエ変換に Python numpy.fft モジュールを使用する
Python で高速フーリエ変換(FFT)をプロットする

この 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()

python scipyfft の例

scipy.fft モジュールは scipy.fftpack モジュール上に構築されており、より多くの追加機能と更新された機能を備えていることに注意してください。

高速フーリエ変換に Python numpy.fft モジュールを使用する

numpy.fftscipy.fft モジュールと同様に機能します。scipy.fftnumpy.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()

python numpyfft の例