python-3.x - np.fft.fft 无法正常工作

标签 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

最佳答案

导入的信号 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/

相关文章:

python-3.x - Dash python plotly实时更新表

python - 无法根据第一列值将列拆分为多列

swift - Swift 中的 DFT 结果与 MATLAB 中的不同

numpy - 为什么 Python 和 CUDA 不支持半精度复数浮点运算?

python - 如何通过傅里叶变换获得有关图像清晰度的信息?

python-3.x - 无法从部分初始化的模块 '_has_surrogates' 导入名称 'email.utils'

python - 尝试在 ubuntu 上安装 pygame 出现错误

python - 削波 FFT 矩阵

Python,通过比较不同字段来比较字典列表的差异

python - 直接傅立叶变换的最大值