gpt4 book ai didi

python - Python中FFT峰值下的面积

转载 作者:行者123 更新时间:2023-12-04 08:11:57 29 4
gpt4 key购买 nike

在继续通过 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 频谱在这些点处类似于两个增量,但显然增加频率会拓宽峰值:
FFT
从第一个峰值可以推断出振幅为 0.5,但对于第二个峰值则不是。我已经尝试使用 np.trapz 获得峰下面积并将其用作幅度的估计值,但由于它接近狄拉克增量,因此对我选择的间隔非常敏感。我的问题是我需要为我的数据分析获得尽可能精确的幅度。
编辑:因为它似乎与点数有关,所以我决定增加(现在我可以)采样频率。这似乎解决了问题,如图所示:
FFT with more points
然而,对于一定数量的点和采样频率,高频峰值变宽似乎仍然很奇怪......

最佳答案

这并不奇怪,你有频率仓的泄漏。当您离散傅立叶变换所需的信号(采样)时,会创建频率区间,这些区间是计算幅度的频率间隔。并且每个 bin 的宽度由 sample_rate/num_points 给出。因此,bin 的数量越少,为每个频率分配精确的幅度就越困难。选择最佳采样率时还存在其他问题,例如防止混叠的香农-奈奎斯特定理。 https://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem .但是根据问题,有时会有一些用于采样的自定义费率。例如。在处理音频时,广泛使用 44,100 Hz 的采样率,原因是基于人类听力的极限。因此,它还取决于您在编写时要执行分析的数据的性质。反正这个问题也有理论值(value),你也可以查https://dsp.stackexchange.com一些有用的信息。

关于python - Python中FFT峰值下的面积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65908820/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com