Uri*_*hen 15 python numpy fft scipy dft
在python中获取二维DFT的DFT矩阵的最简单方法是什么?我在numpy.fft找不到这样的功能.谢谢!
Ale*_*x I 13
我不认为这是内置的.但是,直接计算很简单:
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
Run Code Online (Sandbox Code Playgroud)
编辑对于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)
Run Code Online (Sandbox Code Playgroud)
pan*_*ank 11
最简单,最可能最快的方法是使用SciPy的fft.
import scipy as sp
def dftmtx(N):
return sp.fft(sp.eye(N))
Run Code Online (Sandbox Code Playgroud)
如果你知道更快的方式(可能更复杂),我会很感激你的意见.
只是为了使它与主要问题更相关 - 你也可以用numpy来做:
import numpy as np
dftmtx = np.fft.fft(np.eye(N))
Run Code Online (Sandbox Code Playgroud)
当我对他们两个进行基准测试时,我有一个印象scipy一个稍微快一点,但我没有彻底完成它,它是在不久前,所以不要相信我的话.
这里是python中FFT实现的非常好的来源:http: //nbviewer.ipython.org/url/jakevdp.github.io/downloads/notebooks/UnderstandingTheFFT.ipynb 这是从速度角度来看,但在这种情况下我们实际上可以看到有时它也带有简洁性.
从 scipy 开始,0.14有一个内置的scipy.linalg.dft:
16 点 DFT 矩阵示例:
>>> import scipy.linalg
>>> import numpy as np
>>> m = scipy.linalg.dft(16)
Run Code Online (Sandbox Code Playgroud)
验证单一属性,注意矩阵未缩放,因此16*np.eye(16):
>>> np.allclose(np.abs(np.dot( m.conj().T, m )), 16*np.eye(16))
True
Run Code Online (Sandbox Code Playgroud)
对于 2D DFT 矩阵,这只是张量积的问题,或者在这种情况下特别是 Kronecker Product,因为我们正在处理矩阵代数。
>>> m2 = np.kron(m, m) # 256x256 matrix, flattened from (16,16,16,16) tensor
Run Code Online (Sandbox Code Playgroud)
现在我们可以给它一个平铺的可视化,它是通过将每一行重新排列成一个方块来完成的
>>> import matplotlib.pyplot as plt
>>> m2tiled = m2.reshape((16,)*4).transpose(0,2,1,3).reshape((256,256))
>>> plt.subplot(121)
>>> plt.imshow(np.real(m2tiled), cmap='gray', interpolation='nearest')
>>> plt.subplot(122)
>>> plt.imshow(np.imag(m2tiled), cmap='gray', interpolation='nearest')
>>> plt.show()
Run Code Online (Sandbox Code Playgroud)
结果(真实和图像部分分开):
如您所见,它们是 2D DFT 基函数
文档链接
| 归档时间: |
|
| 查看次数: |
11426 次 |
| 最近记录: |