【问题标题】:Understanding the output from the fast Fourier transform method了解快速傅里叶变换方法的输出
【发布时间】:2019-02-25 22:12:39
【问题描述】:

我试图理解 python FFT 库产生的输出。

我有一个 sqlite 数据库,其中记录了几个系列的 ADC 值。每个系列由 1024 个采样组成,采样频率为 1 ms。

导入数据序列后,我对其进行规范化并通过fft 方法运行 int。我已经包含了一些原始信号与 FFT 输出的对比图。

import sqlite3
import struct
import numpy as np
from matplotlib import pyplot as plt
import time
import math

conn = sqlite3.connect(r"C:\my_test_data.sqlite")
c = conn.cursor()

c.execute('SELECT ID, time, data_blob FROM log_tbl')


for row in c:
    data_raw = bytes(row[2])
    data_raw_floats = struct.unpack('f'*1024, data_raw)
    data_np = np.asarray(data_raw_floats)

    data_normalized = (data_np - data_np.mean()) / (data_np.max() - data_np.min())

    fft = np.fft.fft(data_normalized)
    N = data_normalized .size

    plt.figure(1)
    plt.subplot(211)
    plt.plot(data_normalized )

    plt.subplot(212)
    plt.plot(np.abs(fft)[:N // 2] * 1 / N)
    plt.show()

    plt.clf()

信号显然包含一些频率,我希望它们可以从 FFT 输出中看到。

我做错了什么?

【问题讨论】:

  • 这是有道理的。结果不是我期望看到的,所以我有一种感觉,我把事情搞砸了。谢谢!
  • 欢迎。可能有用:dsp.stackexchange.com
  • 想到了一个新东西,我删除了我的评论并将其添加为答案。

标签: python numpy fft


【解决方案1】:

在使用np.fft.fft时需要保证你的数据间隔均匀,否则输出会不准确。如果它们的间距不均匀,您可以使用 LS 周期图,例如:http://docs.astropy.org/en/stable/stats/lombscargle.html。 或者查找非均匀fft。

关于地块: 我不认为你在做明显错误的事情。您的信号包含一个周期为100 数量级的信号,因此您可以预期1/period=0.01 附近有一个强频率信号。这是您的图表上可见的内容。时域信号不是那么正弦的,因此您在频域中的峰值会很模糊,如图所示。

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 2023-03-10
    • 2017-09-14
    • 2012-12-10
    • 2013-03-31
    • 2015-08-19
    • 2020-03-29
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多