我正在尝试使用 python 3.x 从一些数据中进行 fft。但是当我绘制时,我得到的是原始数据(?)而不是数据的 fft。我正在使用 matlab,所以我可以比较结果。 我已经尝试过该站点的许多示例,但似乎没有任何效果。我不习惯使用 python。我怎样才能得到类似于matlab的情节?我不在乎我得到的是 -f/2 到 f/2 还是 0 到 f/2 光谱。 My data
import scipy.io
import numpy as np
import matplotlib.pyplot as plt
mat = scipy.io.loadmat('sinal2.mat')
sinal2 = mat['sinal2']
Fs = 1000
L = 1997
T = 1.0/1000.0
fsig = np.fft.fft(sinal2)
freq = np.fft.fftfreq(len(sinal2), 1/Fs)
plt.figure()
plt.plot( freq, np.abs(fsig))
plt.figure()
plt.plot(freq, np.angle(fsig))
plt.show()
来自 python 的 FFT:
来自 matlab 的 FFT:
最佳答案
导入的信号 sinal2
的大小为 (1997,1)
。对于这样的二维数组,numpy.fft.fft
默认情况下计算沿最后一个轴的 FFT。在这种情况下,这意味着计算 1997 个大小为 1 的 FFT。如您所知,1 点 FFT 是恒等映射(意味着单个值的 FFT 给出相同的值),因此生成的二维数组与原始数组相同.
为避免这种情况,您可以明确指定另一个轴:
fsig = np.fft.fft(sinal2, axis=0)
或者以其他方式将数据转换为一维数组,然后计算一维数组的 FFT:
sinal2 = singal2[:,0]
fsig = np.fft.fft(sinal2)
最后一点,您的 FFT 图显示了一条连接频谱上半部分和下半部分的水平线。参见 my answer to another question来解决这个问题。既然你提到你真的只需要一半的频谱,你也可以将结果截断到第一个 N//2+1
点:
plt.plot( freq[0:len(freq)//2+1], np.abs(fsig[0:len(fsig)//2+1]))
关于python-3.x - np.fft.fft 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49726589/