python - 了解快速傅里叶变换方法的输出
问题描述
我试图理解 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 输出中看到。
我究竟做错了什么?
解决方案
使用时需要确保数据的间距均匀np.fft.fft
,否则输出会不准确。如果它们的间距不均匀,您可以使用 LS 周期图,例如:http ://docs.astropy.org/en/stable/stats/lombscargle.html 。或查找非均匀fft。
关于情节:我不认为你在做明显错误的事情。您的信号由一个周期为数量级的信号组成100
,因此您可以预期周围有一个很强的频率信号1/period=0.01
。这是您的图表上可见的内容。时域信号不是那么正弦的,因此您在频域中的峰值会很模糊,如图所示。
推荐阅读
- nearprotocol - 如何在与 Nearlib 的交易中附加价值(存款)?
- ios - 这是新版本 watchOS 或 iOS 的错误吗?
- wix - Excel VSTO Addin:如何删除安装提示?
- angular - Spring Boot - 从 Azure Blob 存储上传或下载的问题
- node.js - Docker 容器不响应另一个容器请求
- pyspark - 如果 pyspark 中不存在,则从数据中选择键列为 null
- amazon-s3 - 我可以在较大的文件中使用 AWS S3 和 Google Speech-to-Text 吗?
- postgresql - 不一致的日期时间 PostgreSQL 默认值 now()
- java - 使用 Spring Data 向 MongoDB 传递数据的方法
- python - 使用命令提示符安装 pip 包时出错