我该如何检测特定频率的正弦波的相位变化?

信息处理 离散信号 阶段
2022-02-22 19:16:06

我想检测正弦波相位的偶尔瞬时变化。

我有一个正弦波信号,其频率在 kHz 范围内,并且其相位经历随机变化。我想检测这些相位变化并计算发生次数。理想情况下,我还能够为每次出现提取一些近似的相位变化度数。我该怎么办?

我在 Python 中实现了 Jason R 的建议:

# generating a 30KHz sine wave sampled at 500KHz with a pi/2 phase shift halfway through the signal
F = 30e3
Fs = 500e3
t = np.arange(0, 1e-3, 1/Fs)
S = np.append(np.sin(F*2*np.pi*t[:int(len(t)/2)] + 0), np.sin(F*2*np.pi*t[int(len(t)/2):] - np.pi/2))

S_analytic =  hilbert(S) # calculating the analytic signal

def GetRealImagArray(Array):
    ImagArray = np.array([num.imag for num in Array])
    RealArray = np.array([num.real for num in Array])
    return RealArray, ImagArray

R, I = GetRealImagArray(S_analytic)
phi = np.arctan2(I, R)
f = phi[1:] - phi[:-1]

然后我通过绘制信号和 FM 鉴别器得到以下信息:

信号图和 FM 鉴别器

大的正尖峰表示我的问题所要求的相位变化。正弦波最小值处向下尖峰的原因是什么?这是我的 Python 实现中的预期行为还是错误?

1个回答

最简单的方法是对信号应用数字 FM 鉴别器。在高层次上,您将执行以下操作:

  • 形成输入的分析信号这也可以称为确保它处于复基带

  • 计算分析信号的相位与时间x[n]

    ϕ[n]=atan2(Im{x[n]}Re{x[n]})

  • 信号的瞬时频率与时间的关系可以通过微分来估计ϕ[n]使用任何离散微分方法(通常使用一阶差分,即f[n]=ϕ[n]ϕ[n1])。

为什么这行得通?如果您的信号通常是恒定频率,那么您的 FM 鉴别器的输出f[n]应该是大致恒定的。如果在特定样本索引处存在相位跳跃,则在鉴别器看来,这似乎是突然变化到一个非常不同的频率。跳转后判别器输出f[n]将再次跟踪正弦曲线的频率。

因此,您可以在输入信号上连续运行鉴别器并应用阈值,以寻找样本之间频率的大变化。这将对应于相位不连续性。

编辑:当反正切函数输出的相位值环绕时,上述内容会受到虚假输出的影响±π(见下面的评论)。一个更强大的实现上述方法的方法是:

x^[n]=x[n]x[n1]f[n]=atan2(Im{x^[n]}Re{x^[n]})

也就是说,形成x[n]与共轭x[n1]. 在每个采样瞬间n,结果的相位等于两者之间的相位差x[n]x[n1](这是您要测量的)。当绝对相位x[n]±π. 只需找到生成的产品的相位即可f[n].