如何在 python 中提取特定频率的峰值

How to extract the peak at a specific frequency in python

我想知道信号中特定频率的能量有多少。我正在使用 FFT 获取频谱,频率步长由我的信号长度决定。

例如,我的光谱看起来像这样:

我想获得特定频率处的频谱峰值,-0.08。然而,光谱的离散化只给我一个峰值 -0.0729 和 -0.0833。

有没有办法移动频谱以确保在我想要的频率上有一个数据点?或者一种无需使用 fft 即可获取值的方法?

非常感谢!

如果您有离散数据但需要连续变量的输出,则您必然需要某种插值函数。对于请求样式的值,我建议 Scipy interp1d (example of the use of a interp1d function)。我相信这是实现预期结果的最快方法。

当您进行 DFT(或任何傅里叶变换)时,您实际上在做的是测量您的信号中有多少 "intersects" 具有特定频率的正弦波。这是通过将信号的乘积与任何频率的波的复共轭相加来完成的。从技术上讲,这称为内积,它是点积的推广,衡量一个信号与另一个信号的 "close" 程度。所以如果你只对一个频率感兴趣,不要把整个DFT都拿来,只看你想要的一个。

我不确定你的单位是什么,所以我假设你想要 f0 = -0.08 Hz 处的峰值(如果你的单位是其他单位,比如归一化到采样频率,那么你需要考虑到这一点)。这对应于复指数 exp(2*pi*j*f0*t)。因为您正在采样,所以您的 t 是离散的,所以 t = n/fs,其中 fs 是采样频率(以 Hz 为单位)。

# assuming you're using numpy arrays
w = exp(-2*pi*1j*f0*arange(len(signal))/fs)
peak = abs(sum(signal*w))

DFT有不同的定义;我很确定 numpy 对应于我上面的内容。指数中的额外减号是因为它是复共轭。

请注意,w 实际上不太可能是周期性的。如果样本数量足够大,这并不重要。一个好的启发式算法至少有 10 个周期。