【问题标题】:How to apply FFT to find frequency of a signal?如何应用 FFT 来查找信号的频率?
【发布时间】:2019-04-04 18:05:39
【问题描述】:

我目前正在做一个项目,我记录了手机做周期性运动的加速器幅度,当我在 python 中对其进行可视化并对其进行平滑处理时,这一点非常明显。然而;我正在尝试以编程方式获取信号的频率(mag),到目前为止,我所有的尝试都失败了。 数据存储在一个 csv 中,其中包括几列,但我提取了幅度列,用低通滤波器对其进行平滑处理,然后最后尝试在我的过滤幅度数组上使用 numpy 的 fft 函数,但它没有给我预期的结果。

这是我在平滑后可视化幅度的图像:

如您所见,它是相当周期性的,您可以通过查看它来判断,但我不知道为什么 FFT 无法捕捉到这一点。

我从 numpy 包和 scipy 都尝试过 FFT,两者都给了我相同的结果。

data = genfromtxt("data.csv", dtype=float, delimiter=',', names=True)
y = data['mag']
w = np.fft.fft(y)
freq = np.fft.fftfreq(len(w))

我从freq 得到的输出是“最高”频率为 0 的数组,我不明白。如果相关,我知道我从设备记录数据的采样率为 20 毫秒,并且我已经尝试使用原始数据和平滑数据进行 FFT,但仍然没有运气。

【问题讨论】:

  • 频率,而不是频率。傅里叶变换会发现不止一个涉及和叠加。单个频率是正弦或余弦。你的例子不是那样。
  • 第零个频率是一个常数;它应该是该系列中的最低术语。我认为这发生在 b/c 你的信号有一个不为零的直流分量。
  • 您可以尝试将信号与自身进行卷积以捕获stackoverflow.com/questions/49531952/… 中所示的周期吗?移除 DC 组件是一个很好的提示。

标签: python signal-processing frequency-analysis


【解决方案1】:

您的信号有直流偏置。 DC 偏置与频率为 0 的余弦波相同(对于 FFT)。此 DC 偏置似乎也大于信号中的周期性幅度变化。所以 f=0 是预期的结果。

您至少可以尝试两件事。您可以在频率 bin 0 之后的 FFT 结果幅度中查找下一个峰值。绘制 FFT 幅度,您可能会看到它。或者您可以在执行 FFT 之前减去 DC 偏差(所有样本的平均值/平均值),这将消除频率 bin 0 处的大 FFT 结果。

请注意,FFT 结果的 bin 中心频率只是那些在 FFT 长度上呈整数周期的频率。如果实际频率不是其中之一,则必须进行插值。 Sinc 内核插值是 FFT 结果数据的合适插值器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多