【问题标题】:plot numpy fft in python returns wrong plotpython中的plot numpy fft返回错误的图
【发布时间】:2020-12-03 07:49:49
【问题描述】:

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

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

我明白了:

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

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 

任何想法为什么? 谢谢!

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

【问题讨论】:

  • 第 0 个系数是变换时间序列的平均值。您可以在应用 FFT 之前从数据中减去平均值。
  • 嘿!我刚试过,它返回一个镜像图,正常吗?

标签: python numpy plot fft


【解决方案1】:

我猜你应该用 logscales plots 来试试。首先,我建议使用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' 比例。

半原木 X: 半对数 Y: 对数刻度两者:

【讨论】:

  • 嘿!我尝试使用 np.fft.fftshift,但我不太确定如何解释,有没有办法指定要在图中查找的周期?
【解决方案2】:

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

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

【讨论】:

  • 嗨!谢谢回答。我正在尝试寻找生活日志数据中的周期,我想看看一个人在他们的日常行为中是否有相似之处,例如他们白天的活动时间。但我对傅里叶变换的工作原理有点困惑
  • 我有一个数据框,其中包含 x 天每小时采取的步骤,我想看看 x 天 24 小时内是否有任何峰值,如果有意义的话
  • Stackoverflow 可能不是询问算法特定问题的最佳场所。无论如何,傅里叶变换可以被认为是将信号分解为不同频率的正弦波。例如,如果这个人每天早上遛狗,那么您会在 FFT 中看到频率为1 / 24 hrs 的峰值。如果这个人早上、中午和晚上遛狗,你会在1 / 6 hrs 看到另一个高峰。话虽如此,我不认为傅里叶变换是解决您的问题的最佳工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多