2016-03-15 50 views
2

我想知道信号中特定频率的能量。我正在使用FFT来获取频谱,频率步长取决于我的信号长度。如何提取python中特定频率的峰值

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

我想在一个特定频率拿到谱峰,-0.08。然而,频谱的离散化仅给我一个-0.0729和-0.0833的峰值。

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

非常感谢!

回答

1

当你进行DFT(或任何傅立叶变换)时,你实际上在做什么,正在测量你的信号与某些频率的正弦波“相交”的程度。这是通过将你的信号乘以任意频率的波的复共轭来完成的。所以如果你只对一个频率感兴趣,不要拿整个DFT,只要看看你想要的。我不确定你的单位是什么,所以我假设你想要在f0 = -0.08赫兹的峰值(如果你的单位是别的东西,比如标准化到采样频率,那么你需要说明这一点)。这对应于复数指数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个时期。

+0

非常感谢你,这正是我一直在寻找的!你是对的,没有必要在这里把整个频谱。 – Mathilde

1

如果您有离散数据但需要连续变量的输出,您将需要某种插值函数。对于请求风格的价值,我会建议Scipy interp1d(example of the use of a interp1d function)。我相信这是达到预期结果的最快方法。