从MATLAB到Python的二维FFT

2024-04-20 02:45:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我的大部分编程经验是在MATLAB中,最近我开始熟悉Python。你知道吗

我遇到了一些很棒的MATLAB代码here,这些代码与我想使用的一些东西有关,所以我尝试用Python重新创建它:

import numpy as np
import math
import matplotlib.pyplot as plt

x = np.linspace(-2, 2, 100) # seconds
y = np.linspace(-3, 3, 200) # seconds

xFreq = 2; # Hz
yFreq = -3; # Hz

a = np.matrix(np.matrix(np.exp(2j * np.pi * y * yFreq)))
b = np.matrix(np.exp(2j * np.pi * np.matrix(x).T * xFreq))

c = np.dot(b,a).T

plt.imshow(c.real, cmap='gray', extent = [min(x), max(x), min(y), max(y)], aspect=2/3);
plt.colorbar()
plt.xlabel('x (Sec)')
plt.ylabel('y (Sec)')
plt.show()

2D sinuosidal

nfftx = len(x);
fs = 1/np.diff(x)[0]; 
fx = np.linspace(-1,1,nfftx) * fs/2;

nffty = len(y);
fs = 1/np.diff(y)[0]; 
fy = np.linspace(-1,1,nffty) * fs/2;

imF = np.fft.fftshift(np.fft.fft2(c))/np.size(c)

plt.figure()
plt.title("FFT (real)")
plt.imshow(np.real(imF), cmap='gray', extent = [min(fx), max(fx), min(fy), max(fy)], aspect=2/3)
plt.xlabel('fx (Hz)')
plt.ylabel('fy (Hz)')

FFT of the image

  1. 你知道为什么y频率是3赫兹,反之是3赫兹吗
  2. 我无法理解最初的评论员在MATLAB中用这两行代码做了什么:
Nfft = 4 * 2 .^ nextpow2(size(im));
imF = fftshift(fft2(im, Nfft(1), Nfft(2))) / numel(im);

这很可能就是为什么我的FFT信号相对于背景如此强烈。关于如何在Python中调整FFT的想法?你知道吗


Tags: 代码importnppltminfsrealmatrix
1条回答
网友
1楼 · 发布于 2024-04-20 02:45:13

我只有部分答案。你知道吗

如果仔细观察,用Python代码生成的正弦图像和用Matlab代码生成的正弦图像上的颜色是反转的(检查靠近边缘的条纹的颜色,以及颜色栏上的颜色)。你知道吗

这就解释了为什么在FFT图上有反转的颜色,也可能是为什么得到的是3hz,而不是-3hz。不幸的是,我现在无法使用Python访问计算机,因此无法验证这一点。我想这可能是一个很好的开始故障排除。你知道吗


编辑:

是的,你说得对。我完全错过了Matlab脚本中的flipud。我不认为你的计算是错的。最简单的检查方法是保存Matlab数据并将其导入Python。你知道吗

在Matlab中:

save('data.mat', 'im')

然后使用scipy将其导入Python:

im_matlab = scipy.io.loadmat('data.mat')['im']
np.all(np.isclose(im_matlab, im))

如果最后一行给出了True,那么这意味着计算是正确的。你知道吗

关于绘图,imshow假设原点(numpy数组的第0个索引)是左上角,这是图像的标准。您可以通过在plt.imshow中使用origin='lower'关键字来更改此设置。你知道吗

关于fftshift,我认为this answer到另一个StackOverflow问题是您需要的。你知道吗

相关问题 更多 >