瞬时频率总是可以从解析信号中得出吗?

信息处理 频率 阶段 希尔伯特变换
2022-02-11 04:41:04

瞬时频率可以定义为分析信号的瞬时相位的导数,在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 以上的实际值的两倍的速度上升。

我对其他具有恒定幅度和不同频率的正弦波进行了尝试,得到了类似的结果。只有当我使用具有恒定频率的信号时,蓝线才与底部图上的灰线匹配。我的问题是:信号是否必须满足任何条件才能使瞬时频率的定义成立,所以它可以从分析信号的瞬时相位推导出来?

2个回答

这是因为相位项随时间变化的速率为t2对于频率斜坡,并且由于瞬时频率是相位的导数,因此您的结果与预期的一样。

m(t)=cos(2πf(t)t)

ϕ=2πf(t)t

f(t)=Kt对于线性频率斜坡

因此相位随时间变化的速率为t2

ϕ=2πKt2

相位的导数(即瞬时弧度频率)为:

dϕdt=4πKt

(除以2π获得瞬时频率,但现在应该非常清楚 2x 差异的来源)。

请参阅我发布的此 DSP 挑战的答案,进一步解释了这一点:

频率斜坡的模拟

你这样做是不对的。你的信号是

sin(2π(2+10t)t)
这使得瞬时频率
(2π)1ddt(2π(2+10t)t)=2+20t
. 基本上,您的“频率变化”还会增加当前已累积的相位,从而使您计划的频率变化增加一倍。

创建啁啾时非常常见的错误。