python中的DFT矩阵

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 这是从速度角度来看,但在这种情况下我们实际上可以看到有时它也带有简洁性.


Kh4*_*tiK 7

从 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)

结果(真实和图像部分分开):

二维 DFT 基础

如您所见,它们是 2D DFT 基函数

文档链接