我有一个由两个探头交替捕获的模拟信号。有时信号是周期性的,并且取决于物理条件,两个周期性信号可能同相或异相。此外,这些信号非常嘈杂。在模数转换之后,我必须计算这些信号是同相还是异相(还有其他情况,但我暂时简化了)。信号看起来像这样: 原始信号
实现我的目标的计划是:
- 计算 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()
'''
我得到这个图形:
由于我的两个鼻窦中只有一个频率,我无法弄清楚整个图表的含义,无论如何,如果我放大:
在最后一张图片中,我可以看到在 3800 赫兹附近,橙色信号大约等于 0rad,另一个大约等于 -1,57rad,因此绝对值相差 ~pi/2。我想确保自己做到这一点并进行数值计算,但我不知道这个函数如何映射 x 轴上的频率以及如何获得相应的索引,知道吗?
如果我是对的,那么这种方法似乎做得很好,但我不确定我的解释是否良好,或者在某些情况下它可能更微妙,我可能会错过一些东西。顺便说一句,这个相位谱是否类似于我们从傅立叶变换中得到的相位谱?我知道这是傅里叶变换的重要组成部分,但没有太多信息,通常重点放在幅度谱上。
另一种方法是计算两个正弦波的两个峰值之间的时间差,通过计算 (time_difference_between_two_peaks)/T_0 = Phi/2pi 提取相位,其中 T_0 是正弦波的周期,Phi 是相位差。