Python 理解快速傅里叶变换方法的输出

Python 理解快速傅里叶变换方法的输出,python,numpy,fft,Python,Numpy,Fft,我试图理解python FFT库产生的输出 我有一个sqlite数据库,其中记录了几个系列的ADC值。每个系列由1024个采样组成,采样频率为1ms 导入数据序列后,我对其进行规范化,并通过fft方法运行int。我已经包括了一些原始信号与FFT输出的对比图 import sqlite3 import struct import numpy as np from matplotlib import pyplot as plt import time import math conn = sqli

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

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

导入数据序列后,我对其进行规范化,并通过
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输出中看到

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()

我做错了什么?

使用
np.fft.fft
时,您需要确保数据的间隔均匀,否则输出将不准确。如果间隔不均匀,可以使用LS周期图,例如:。 或查找非均匀fft

关于情节:
我不认为你明显做错了什么。您的信号由一个周期大小为
100
的信号组成,因此您可以预期在
1/周期=0.01
附近有一个强频率信号。这是在图形上可见的内容。时域信号不是正弦信号,因此频域中的峰值将模糊,如图所示。

这是有道理的。结果不是我期望看到的,所以我有一种感觉,我把事情搞砸了。谢谢欢迎可能有用:考虑到一件新事情,我删除了我的评论,并将其添加为答案。