【发布时间】:2021-01-26 20:29:18
【问题描述】:
在继续通过 FFT 分析一些真实数据集之前,我正在尝试做一些测试,我发现了以下问题。
首先,我创建一个信号作为两个余弦之和,然后使用rfft 进行转换(因为它只有实数值):
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import rfft, rfftfreq
# Number of sample points
N = 800
# Sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = 0.5*np.cos(10*2*np.pi*x) + 0.5*np.cos(200*2*np.pi*x)
# FFT
yf = rfft(y)
xf = rfftfreq(N, T)
fig, ax = plt.subplots(1,2,figsize=(15,5))
ax[0].plot(x,y)
ax[1].plot(xf, 2.0/N*np.abs(yf))
从信号的定义可以看出,我有两个振幅为 0.5,频率为 10 和 200 的振荡。现在,我希望 FFT 频谱在这些点上类似于两个增量,但显然增加了频率拓宽了峰值:
从第一个峰值可以推断出振幅是 0.5,但不是第二个。我尝试使用np.trapz 获得峰值下的面积并将其用作幅度的估计值,但由于它接近狄拉克增量,因此对我选择的间隔非常敏感。我的问题是我需要尽可能准确地获取振幅以进行数据分析。
编辑:由于它似乎与点数有关,我决定增加(现在我可以)采样频率。这似乎解决了问题,如图:
但是,对于一定数量的点和采样频率,高频峰变宽似乎仍然很奇怪......
【问题讨论】:
-
如果您可以(以某种方式)推导出峰的解析表达式,那么您可以通过拟合推断其高度,这可能比数值积分更准确。
标签: python signal-processing fft