我想知道信号中特定频率的能量。我正在使用FFT来获取频谱,频率步长取决于我的信号长度。如何提取python中特定频率的峰值
我想在一个特定频率拿到谱峰,-0.08。然而,频谱的离散化仅给我一个-0.0729和-0.0833的峰值。
有没有办法改变频谱以确保在我想要的频率上有数据点?或者一种获得价值而不必使用fft的方法?
非常感谢!
我想知道信号中特定频率的能量。我正在使用FFT来获取频谱,频率步长取决于我的信号长度。如何提取python中特定频率的峰值
我想在一个特定频率拿到谱峰,-0.08。然而,频谱的离散化仅给我一个-0.0729和-0.0833的峰值。
有没有办法改变频谱以确保在我想要的频率上有数据点?或者一种获得价值而不必使用fft的方法?
非常感谢!
当你进行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个时期。
如果您有离散数据但需要连续变量的输出,您将需要某种插值函数。对于请求风格的价值,我会建议Scipy interp1d(example of the use of a interp1d function)。我相信这是达到预期结果的最快方法。
非常感谢你,这正是我一直在寻找的!你是对的,没有必要在这里把整个频谱。 – Mathilde