我想知道信号中特定频率的能量是多少。我使用FFT来获取频谱,频率步长由我的信号长度决定。
我想让频谱峰值达到特定频率,-0.08。然而,光谱的离散化只给出了-0.0729和-0.0833的峰值。
有没有办法移动频谱以确保我想要的频率有一个数据点?或者一种获得价值而不必使用fft的方法?
非常感谢!
答案 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)。我相信这是实现预期结果的最快方式。