私は、信号のエネルギースペクトル密度を配列(これをグラフィカルに出力する)に与える離散フーリエ変換関数をPythonで記述しようとしています。私は行列の乗算を使ってこれをやっています。私のコードは小さなデータセットでは動作するようですが、処理に時間がかかります。例えば大量のデータに対してタスクを完了しないwavファイル。関数は、現在ある:離散フーリエ変換が機能しない/非常に非効率的であるpython
from scipy.io import wavfile
import numpy as np
import matplotlib.pyplot as plt
デフESD(データ、FS):データがデータセットとFSある
a=[]
for i in range(int(np.size(data)/100)):
dt = 1/(fs)
fvec = np.arange(100*i , 100+(100*i) , 1)
nvec = np.arange(0 , np.size(data) , 1)
Wconst = np.exp(-1j*2*np.pi/np.size(data))
ematrix = Wconst**(np.outer(fvec,nvec))
b = (dt**2)*(abs(np.inner(ematrix , data))**2)
a = np.concatenate((a,b))
return a
サンプリング周波数です。この機能が非常に遅くて非効率的な理由はありますか?これは、100ブロックの周波数で信号を処理するように設計されています。それ以外の場合、マトリックスは非常に大きくなります。
ほとんどの人はnumpyまたはscipy fftルーチンを使用すると思います.fftは2 ** nのレコードサイズで最も高速です – f5r5e5d
DFTはO(n^2)、FFTはO(n log n)です。 nが大きいとき、DFTはFFTよりはるかに遅いため、FFTの最初のFは「高速」を表します。 –