FFT処理でnumpyとscipyを使った方法をまとめておきます。
このページでは処理時間を比較しています。
以下のページを参考にさせていただきました。
■Python NumPy SciPy : FFT 処理による波形整形(スムーザ)
https://org-technology.com/posts/smoother.html
まず、処理するサンプルデータを作成します。
import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
# サンプルデータ作成
n = 512 # データ数
dt = 0.01 # サンプリング間隔
f = 1 # 周波数
t = np.linspace(1, n, n)*dt-dt
y = np.sin(2*np.pi*f*t)+0.5*np.random.randn(t.size)
# FFT 処理と周波数軸の作成
yf = fftpack.fft(y)/(n/2)
freq = fftpack.fftfreq(n, dt)
①scipyのfftpackを使う方法(fft, ifft)
yf = fftpack.fft(y)/(n/2)
freq = fftpack.fftfreq(n, dt)
fs = 2
yf2 = np.copy(yf)
yf2[(freq > fs)] = 0
yf2[(freq < 0)] = 0
y2 = np.real(fftpack.ifft(yf2)*n)
計算時間:48.2 µs ± 869 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
②scipyのfftpackを使う方法(rfft, irfft)
yf = fftpack.rfft(y)/(n/2)
freq = fftpack.fftfreq(n, dt)
fs = 2
yf2 = np.copy(yf)
yf2[(freq > fs)] = 0
yf2[(freq < 0)] = 0
y2 = np.real(fftpack.irfft(yf2)*(n/2))
計算時間:38.7 µs ± 723 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
③numpyのfftを使う方法
yf = np.fft.fft(y)/(n/2)
freq = np.fft.fftfreq(n, d=dt)
fs = 2
yf2 = np.copy(yf)
yf2[(freq > fs)] = 0
yf2[(freq < 0)] = 0
y2 = np.real(np.fft.ifft(yf2)*n)
計算時間:41.3 µs ± 2.3 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
結果は
1位 38.7us ②scipyのfftpackを使う方法(rfft, irfft)
2位 41.3us ③numpyのfftを使う方法
3位 48.2us ①scipyのfftpackを使う方法(fft, ifft)
以上です。