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

时间:2016-03-15 15:28:01

标签: python fft spectrum frequency-analysis

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

我的频谱看起来像这样: Spectrum, the red line is where I want a value, but falls between two frequencies

我想让频谱峰值达到特定频率,-0.08。然而,光谱的离散化只给出了​​-0.0729和-0.0833的峰值。

有没有办法移动频谱以确保我想要的频率有一个数据点?或者一种获得价值而不必使用fft的方法?

非常感谢!

2 个答案:

答案 0 :(得分:3)

当您进行DFT(或任何傅立叶变换)时,您实际正在做的是测量您的信号与某些频率的正弦“相交”的程度。这是通过将信号的乘积与任何频率的波的复共轭相加来完成的。从技术上讲,这被称为内积,它是点积的推广,并衡量信号与另一个信号的“接近”程度。因此,如果您只对一个频率感兴趣,请不要使用整个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个时期。

答案 1 :(得分:1)

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