瞬时频率可以定义为分析信号的瞬时相位的导数,在Scipy 的文档中的这个示例中可以很好地在实践中看到。但它似乎并不总是这样工作。我使用示例中的代码并获得了不同的结果,例如频率从 2 到 12Hz 逐渐变化的正弦波:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import hilbert, chirp
duration = 1.0
fs = 400.0
samples = int(fs*duration)
t = np.arange(samples) / fs
w = 2*np.pi*(2 + 10*t)
signal = np.sin(w*t)
analytic_signal = hilbert(signal)
amplitude_envelope = np.abs(analytic_signal)
instantaneous_phase = np.unwrap(np.angle(analytic_signal))
instantaneous_frequency = (np.diff(instantaneous_phase) /
(2.0*np.pi) * fs)
这是原始频率在底部子图中以灰色绘制的结果图:
fig = plt.figure()
ax0 = fig.add_subplot(211)
ax0.plot(t, signal, label='signal')
ax0.plot(t, amplitude_envelope, label='envelope')
ax0.set_xlabel("time in seconds")
ax0.legend()
ax1 = fig.add_subplot(212)
ax1.plot(t, 0.5*w/np.pi, lw=2, color='gray')
ax1.plot(t[1:], instantaneous_frequency)
ax1.set_xlabel("time in seconds")
fig.show()
在底部图中,蓝线和灰线方向相同,但两者之间存在巨大差异,我并不是指永远存在的边缘效应。计算出的瞬时频率以几乎是最终达到 20Hz 以上的实际值的两倍的速度上升。
我对其他具有恒定幅度和不同频率的正弦波进行了尝试,得到了类似的结果。只有当我使用具有恒定频率的信号时,蓝线才与底部图上的灰线匹配。我的问题是:信号是否必须满足任何条件才能使瞬时频率的定义成立,所以它可以从分析信号的瞬时相位推导出来?