了解快速傅立叶变换方法的输出

时间:2019-02-25 11:46:13

标签: python numpy fft

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

我有一个sqlite数据库,其中记录了多个ADC值系列。每个系列包含1024个样本,采样频率为1毫秒。

导入数据系列后,我对其进行规范化并通过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()

enter image description here

enter image description here

enter image description here

信号明显包含一些频率,我希望它们在FFT输出中可见。

我在做什么错了?

1 个答案:

答案 0 :(得分:3)

使用np.fft.fft时,请确保您的数据均匀分布,否则输出将不准确。如果它们的间距不均匀,则可以使用LS周期图,例如:http://docs.astropy.org/en/stable/stats/lombscargle.html。 或查找不均匀的fft。

关于情节: 我认为您做的事情显然不对。您的信号包含周期为100量级的信号,因此可以期望在1/period=0.01附近有较强的频率信号。这就是您的图表上可见的内容。时域信号不是正弦波,因此您的频域峰值将变得模糊,如图所示。