Pythonで2次元DFTのDFT行列を取得する最も簡単な方法は何ですか? numpy.fftにそのような関数が見つかりませんでした。ありがとう!
19528 次
7 に答える
17
最も簡単でおそらく最速の方法は、SciPy の fft を使用することです。
import scipy as sp
def dftmtx(N):
return sp.fft(sp.eye(N))
もっと速い方法 (もっと複雑かもしれません) をご存知でしたら、ご意見をいただければ幸いです。
主な質問との関連性を高めるために、numpy を使用することもできます。
import numpy as np
dftmtx = np.fft.fft(np.eye(N))
私がそれらの両方をベンチマークしたとき、scipy の方がわずかに高速だったという印象がありますが、完全には実行していません。
Python での FFT 実装に関する非常に優れたソースは次 のとおりです: http://nbviewer.ipython.org/url/jakevdp.github.io/downloads/notebooks/UnderstandingTheFFT.ipynb時にはシンプルさも伴います。
于 2014-10-29T18:04:43.140 に答える
14
私はこれが組み込まれているとは思わない.しかし、直接計算は簡単です:
import numpy as np
def DFT_matrix(N):
i, j = np.meshgrid(np.arange(N), np.arange(N))
omega = np.exp( - 2 * pi * 1J / N )
W = np.power( omega, i * j ) / sqrt(N)
return W
EDIT 2D FFT マトリックスの場合、次を使用できます。
x = np.zeros(N, N) # x is any input data with those dimensions
W = DFT_matrix(N)
dft_of_x = W.dot(x).dot(W)
于 2013-11-02T06:38:13.180 に答える
2
@アレックス| は基本的に正しいです。2 次元 DFT に使用したバージョンをここに追加します。
def DFT_matrix_2d(N):
i, j = np.meshgrid(np.arange(N), np.arange(N))
A=np.multiply.outer(i.flatten(), i.flatten())
B=np.multiply.outer(j.flatten(), j.flatten())
omega = np.exp(-2*np.pi*1J/N)
W = np.power(omega, A+B)/N
return W
于 2013-11-02T22:05:15.780 に答える