Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

np.fft.fftとnp.fft.rfftの処理速度の比較

np.fft.fft v.s. np.fft.rfft

以下の記事を読んで、np.fft.fftnp.fft.rfftの実行速度の比較に興味がわいたので、やってみました。

pman0214.github.io

音信号処理の場合、短時間フーリエ変換などでFFTをかなりの回数実行する機会が多いと思います。

時は金なり。

そこで、FFTする信号の長さ n_fft と実行する回数を変えて処理時間を計ってみました。

処理速度の比較結果

f:id:Kurene:20191114034327p:plain

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)