首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >np.fft.fft工作不正常

np.fft.fft工作不正常
EN

Stack Overflow用户
提问于 2018-04-09 06:14:55
回答 1查看 2.8K关注 0票数 3

我试图使用python3.x对一些数据进行fft。但当我绘图时,我得到了我的原始数据(?)不是数据的fft。我用matlab来比较结果。我已经尝试了很多例子,从这个网站,但似乎没有任何工作。我不习惯和蟒蛇一起工作。我怎样才能得到一个类似matlab的图形呢?我不在乎-f/2到f/2或0到f/2谱。我的数据

代码语言:javascript
复制
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:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-09 12:34:15

导入的信号sinal2有一个大小(1997,1)。在这样的二维数组中,numpy.fft.fft在默认情况下沿最后一个轴计算快速傅立叶变换。在这种情况下,这意味着计算尺寸为1的1997年FFT。正如您可能知道的那样,1点FFT是一个标识映射(意味着单个值的FFT给出相同的值),因此得到的2D数组与原始数组相同。

为了避免这种情况,您可以显式地指定另一个轴:

代码语言:javascript
复制
fsig = np.fft.fft(sinal2, axis=0)

或者以其他方式将数据转换为一维数组,然后计算一维数组的FFT:

代码语言:javascript
复制
sinal2 = singal2[:,0]
fsig = np.fft.fft(sinal2)

最后,您的FFT图显示了连接频谱的上、下半部分的一条水平线。请参阅我对另一个问题的回答以解决此问题。由于您提到实际上只需要一半的频谱,您还可以将结果截断到第一个N//2+1点:

代码语言:javascript
复制
plt.plot( freq[0:len(freq)//2+1], np.abs(fsig[0:len(fsig)//2+1]))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49726589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档