我试图使用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:
答案 0 :(得分:0)
导入的信号sinal2
的大小为(1997,1)
。对于像这样的二维数组,默认情况下numpy.fft.fft
计算沿最后一个轴的FFT。在这种情况下,这意味着计算大小为1的1997 FFT。您可能知道1点FFT是标识映射(意味着单个值的FFT给出相同的值),因此生成的2D数组与原始数组相同
为避免这种情况,您可以明确指定另一个轴:
fsig = np.fft.fft(sinal2, axis=0)
或以其他方式将数据转换为单维数组,然后计算1D数组的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]))