【问题标题】:Area under the peak of a FFT in PythonPython中FFT峰值下的区域
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我会评论乔治的回答,但我不能。

    也许您研究的起点是离散傅里叶变换的属性。 时域中的信号实际上是余弦乘以框窗,该框窗转换为频域,作为增量与 sinc 函数的卷积。 sinc 函数会涂抹光谱。

    但是,我不确定我们是否在此处观察到频谱泄漏,因为窗口恰好适合余弦的完整周期。箱的离散化可能仍然在这里发挥作用。

    【讨论】:

    • 你是对的,但我指的不是这种光谱泄漏。我提到了频率箱的泄漏给其他不应该的。我称它为频谱泄漏,因为堆栈溢出它与理论主题无关,我只是这样命名它,同时试图给出一个与他面临的问题直接相关的小而紧凑的答案,这绝对是垃圾箱的离散化。但可以肯定的是,正式的定义就是你所说的。这就是我建议 dsp.stackexhange.com 进一步分析该主题的原因。
    猜你喜欢
    • 2019-02-14
    • 2020-11-11
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    相关资源
    最近更新 更多