np.fft.fft v.s. np.fft.rfft
以下の記事を読んで、np.fft.fft
とnp.fft.rfft
の実行速度の比較に興味がわいたので、やってみました。
音信号処理の場合、短時間フーリエ変換などでFFTをかなりの回数実行する機会が多いと思います。
時は金なり。
そこで、FFTする信号の長さ n_fft
と実行する回数を変えて処理時間を計ってみました。
処理速度の比較結果
FFTする信号の長さ n_fft
が長くなるほど、処理速度の差が大きくなっています。
予想通り、だいたい2倍弱の差です。
若干の誤差はあるものの、扱う信号が実数であり、FFTする信号長が長い場合や、大量のデータをFFTするのであれば、rfftを採用するのがよいと思います。
実装
import numpy as np import time def measure(x, fft_type, N): if fft_type == "np.fft.fft": fft = np.fft.fft elif fft_type == "np.fft.rfft": fft = np.fft.rfft start = time.time() for n in range(N): fft(x[n]) elapsed_time = time.time() - start print (f"{fft_type}:\tn_fft:{n_fft}:\t{elapsed_time:0.3f} [sec] / {N}") print("fft_type\tn_fft\t\ttime") for n in [1000, 10000, 100000]: for n_fft in [256, 1024, 4096, 32768]: x = np.random.random((n, n_fft)) measure(x, "np.fft.fft", n) measure(x, "np.fft.rfft", n)