在python中绘制numpy fft返回错误的图

问题描述

我正在尝试使用numpy fft从数据框中绘制一些数据:

plt.plot(np.fft.fft(df_valid_daily_activity.stepsDaily))

我明白了:

enter image description here

我不明白为什么情节一开始如此陡峭,然后似乎趋于稳定? 我也收到此警告:

Casting complex values to real discards the imaginary part
  return array(a,dtype,copy=False,order=order)

我要绘制的数据示例:

2      12693.0
3      18387.0
4      18360.0
5      11684.0
6      12722.0
        ...   
273    27836.0
274    15566.0
280     7836.0
281    17787.0
284     7739.0
Name: stepsDaily,Length: 199,dtype: float64 

任何想法为何? 谢谢!

编辑:尝试减去均值-看起来仍然很奇怪

enter image description here

解决方法

您使用的函数是一个完全复杂的傅立叶变换:应用于实际数据时,它将对称于零。您可以做两件事:使用np.fft.fftshift移位数据,使零频率处于中间(或使用np.fft.fftfreq计算频率)或使用np.fft.rfft进行转换实际数据,并将返回完整FFT的一半。

最好了解FFT的预期用途。大多数人(包括我自己)实际上只对数据中出现的频率感兴趣。为此,可以使用FFT的幅度平方(通常在对数刻度上)的图。

,

我想发表评论,但由于我的声誉而不能:)
我猜您应该尝试使用对数标度图。首先,建议使用numpy.fft.fftshift来“将零频率分量移到频谱的中心。”

import random
import matplotlib.pyplot as plt
import numpy as np
f = [random.randint(5000,20000) for i in range(300)]
ff = np.fft.fftshift(f)

现在以“ semilogx”,“ semilogy”和“ loglog”比例绘制图:
Semi Log X
Semi Log Y
Log Scale Both