相位谱解释

信息处理 Python 阶段
2022-02-20 17:38:42

我有一个由两个探头交替捕获的模拟信号。有时信号是周期性的,并且取决于物理条件,两个周期性信号可能同相或异相。此外,这些信号非常嘈杂。在模数转换之后,我必须计算这些信号是同相还是异相(还有其他情况,但我暂时简化了)。信号看起来像这样: 原始信号

实现我的目标的计划是:

- 计算 FFT 以查看是否存在某种周期性。

- 如果是,过滤信号以隔离我正在寻找的主频率。

- 找到一种方法来计算这些信号之间的相位差。

我不确定如何执行一种有效的方法来计算信号之间的相位差,即使它在纸上看起来微不足道。我尝试了 matplotlib'phase_spectrum,我想知道如何解释我的结果。这是具有两个相位差为 pi/2 rad 的正弦的代码(过滤后我得到与这些正弦非常相似的东西):

'''

import numpy as np
import matplotlib.pyplot as plt

fs = 100_000
f = 3800

sin1 = [np.sin((2 * np.pi * f * i)/ fs) for i in range(2000)]
sin2 = [np.sin((2 * np.pi * f )/ fs + np.pi/2) for i in range(2000)]

plt.phase_spectrum(sin1, Fs=fs)
plt.phase_spectrum(sin2, Fs=fs)
plt.show()

'''

我得到这个图形:

全相位谱

由于我的两个鼻窦中只有一个频率,我无法弄清楚整个图表的含义,无论如何,如果我放大:

以 f = 3800hz 为中心的相位谱

在最后一张图片中,我可以看到在 3800 赫兹附近,橙色信号大约等于 0rad,另一个大约等于 -1,57rad,因此绝对值相差 ~pi/2。我想确保自己做到这一点并进行数值计算,但我不知道这个函数如何映射 x 轴上的频率以及如何获得相应的索引,知道吗?

如果我是对的,那么这种方法似乎做得很好,但我不确定我的解释是否良好,或者在某些情况下它可能更微妙,我可能会错过一些东西。顺便说一句,这个相位谱是否类似于我们从傅立叶变换中得到的相位谱?我知道这是傅里叶变换的重要组成部分,但没有太多信息,通常重点放在幅度谱上。

另一种方法是计算两个正弦波的两个峰值之间的时间差,通过计算 (time_difference_between_two_peaks)/T_0 = Phi/2pi 提取相位,其中 T_0 是正弦波的周期,Phi 是相位差。

2个回答

假设您的两个滤波信号具有相同的频率内容,您可以通过互相关确定时间滞后,然后将该时间滞后转换为相位差。此答案中还建议了一些其他解决方案

我必须计算这些信号是同相还是异相

这是一个病态的问题。通常,相位差是频率的函数,将其浓缩为一个数字通常没有意义。即使信号是周期性的,也往往有很多谐波,每个谐波都有自己的相位差。您可以对相位差进行能量加权差分,但在许多情况下,结果将毫无意义:您将如何处理它?

从图中可以看出,在频谱的很大一部分上,相位或多或少是线性的,因此您可以尝试查看群延迟并检查它是否与频率保持合理一致。