np.fft.fft无法正常工作

时间:2018-04-09 06:14:56

标签: python-3.x fft

我试图使用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: FFT(?) from python

来自matlab的

FFT: FFT from matlab

1 个答案:

答案 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]))