python - 从 FFT 中找出信号的周期

标签 python signal-processing fft

我有一个周期信号,我想找到周期。 Raw signal

由于存在边界效应,我首先切掉边界并通过查看第一个和最后一个最小值保留 N 个周期。

Signal

然后,我计算 FFT。

代码:

import numpy as np

from matplotlib import pyplot as plt

# The list of a periodic something
L = [2.762, 2.762, 1.508, 2.758, 2.765, 2.765, 2.761, 1.507, 2.757, 2.757, 2.764, 2.764, 1.512, 2.76, 2.766, 2.766, 2.763, 1.51, 2.759, 2.759, 2.765, 2.765, 1.514, 2.761, 2.758, 2.758, 2.764, 1.513, 2.76, 2.76, 2.757, 2.757, 1.508, 2.763, 2.759, 2.759, 2.766, 1.517, 4.012]
# Round because there is a slight variation around actually equals values: 2.762, 2.761 or 1.508, 1.507
L = [round(elt, 1) for elt in L]

minima = min(L)
min_id = L.index(minima)

start = L.index(minima)
stop = L[::-1].index(minima)

L = L[start:len(L)-stop]

fft = np.fft.fft(np.asarray(L))/len(L)
fft = fft[range(int(len(L)/2))]

plt.plot(abs(fft))

我知道列表的两个点之间有多少时间(即采样频率,在本例中为 190 Hz)。我认为 fft 应该给我一个与周期中的点数对应的值的尖峰,从而给了我点数和周期。 然而,这根本不是我观察到的输出:

FFT

我目前的猜测是 0 处的尖峰对应于我的信号的平均值,并且 7 附近的这个小尖峰应该是我的周期(尽管重复模式仅包括 5 个点)。

我做错了什么?谢谢!

最佳答案

你的数据是正确的,只是你没有正确地预处理它:

  1. 第一个巨大的峰值是信号的直流/平均值。如果你在进行 DFT 之前减去它,它就会消失
  2. 在进行 DFT 之前不对信号加窗会在 DFT 频谱中产生振铃,降低峰值并提高“非峰值”。

如果包括这两个步骤,结果应该更符合您的预期:

import numpy as np
import scipy.signal

from matplotlib import pyplot as plt

L = np.array([2.762, 2.762, 1.508, 2.758, 2.765, 2.765, 2.761, 1.507, 2.757, 2.757, 2.764, 2.764, 1.512, 2.76, 2.766, 2.766, 2.763, 1.51, 2.759, 2.759, 2.765, 2.765, 1.514, 2.761, 2.758, 2.758, 2.764, 1.513, 2.76, 2.76, 2.757, 2.757, 1.508, 2.763, 2.759, 2.759, 2.766, 1.517, 4.012])
L = np.round(L, 1)
# Remove DC component
L -= np.mean(L)
# Window signal
L *= scipy.signal.windows.hann(len(L))

fft = np.fft.rfft(L, norm="ortho")

plt.plot(L)
plt.figure()
plt.plot(abs(fft))

您会注意到,您会在 8 左右看到一个峰值,另一个峰值是 16 的两倍。这也是预期的:周期信号在 n*period 样本之后总是周期性的,其中 n 是任何自然数。在您的情况下:n*8

关于python - 从 FFT 中找出信号的周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49531952/

相关文章:

java - 音频处理 - 数字分块和前向傅里叶变换?

python - 如何在没有服务器的情况下在本地计算机上使用 Mkdocs?

python 异常具有相同的名称但不同的子类

python - py.test : How to parametrize when some values should return an error

iphone - 如何实现低通滤波器?

python - 获取图像的焦点像素

Android Systrace 没有那个文件或目录

math - 计算 Web Audio API 滤波器在特定频率和 Q 因子下的响应

c - 实时进行 FFT

python - 从数据的 FFT 分析中提取含义