计算两个角度之间的相对相位-python

计算两个角度之间的相对相位-python,python,scipy,synchronization,phase,Python,Scipy,Synchronization,Phase,我试图计算两个角度的时间序列之间的相对相位。使用下面的方法,通过从与标签A和标签B相关联的xy点导出的旋转来测量角度。在前3个时间点,角度以类似的方向移动,然后在其余3个时间点偏离 我的理解是,使用希尔伯特变换进行的相对相位计算表明,接近0°的值表示协调模式或同相模式。相反,接近180°的值表示异步模式或反相位。但是当我导出下面的结果时,我没有看到这个 import pandas as pd import matplotlib.pyplot as plt import numpy as np f

我试图计算两个角度的时间序列之间的相对相位。使用下面的方法,通过从与
标签A
标签B
相关联的xy点导出的旋转来测量角度。在前3个时间点,角度以类似的方向移动,然后在其余3个时间点偏离

我的理解是,使用希尔伯特变换进行的相对相位计算表明,接近0°的值表示协调模式或同相模式。相反,接近180°的值表示异步模式或反相位。但是当我导出下面的结果时,我没有看到这个

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import hilbert

df = pd.DataFrame({      
    'Time' : [1,1,2,2,3,3,4,4,5,5,6,6],    
    'Label' : ['A','B','A','B','A','B','A','B','A','B','A','B'],
    'x' : [-2.0,-1.0,-1.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0],
    'y' : [-2.0,-1.0,-2.0,-1.0,-2.0,-1.0,-3.0,0.0,-4.0,1.0,-5.0,2.0],              
   })

x = df.groupby('Label')['x'].diff().fillna(0).astype(float)
y = df.groupby('Label')['y'].diff().fillna(0).astype(float) 

df['Rotation'] = np.arctan2(y, x)
df['Angle'] = np.degrees(df['Rotation'])

df_A = df[df['Label'] == 'A'].reset_index(drop = True)
df_B = df[df['Label'] == 'B'].reset_index(drop = True)

y1 = df_A['Angle'].values
y2 = df_B['Angle'].values

ang1 = np.angle(hilbert(y1),deg=False)
ang2 = np.angle(hilbert(y2),deg=False)

f,ax = plt.subplots(3,1,figsize=(20,5),sharex=True)
ax[0].plot(y1,color='r',label='y1')
ax[0].plot(y2,color='b',label='y2')
ax[0].legend(bbox_to_anchor=(0., 1.02, 1., .102),ncol=2)

ax[1].plot(ang1,color='r')
ax[1].plot(ang2,color='b')
ax[1].set(title='Angle at each Timepoint')
phase_synchrony = 1-np.sin(np.abs(ang1-ang2)/2)
ax[2].plot(phase_synchrony)
ax[2].set(ylim=[0,1.1],title='Instantaneous Phase Synchrony',xlabel='Time',ylabel='Phase Synchrony')
plt.tight_layout()
plt.show()

根据你的描述,我会简单地使用

相位同步=1-np.sin(np.abs(y1-y2)/2) via Hilbert变换适用于只有已知(或基于合理原则假设)信号的实部进行分析的情况,在这种情况下,可以找到使结果函数进行分析的虚部

但是在你的例子中,你已经有了
x
y
,所以你可以像你已经做的那样直接计算角度

将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
将numpy作为np导入
从scipy.signal导入hilbert
df=pd.DataFrame({
“时间”:[1,1,2,2,3,3,4,4,5,5,6],
‘标签’:[‘A’、‘B’、‘A’、‘B’、‘A’、‘B’、‘A’、‘B’、‘A’、‘B’、‘B’、‘A’、‘B’],
'x':[-2.0,-1.0,-1.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0],
‘y’:[-2.0,-1.0,-2.0,-1.0,-2.0,-1.0,-3.0,0.0,-4.0,1.0,-5.0,2.0],
})
x=df.groupby('Label')['x'].diff().fillna(0).astype(float)
y=df.groupby('Label')['y'].diff().fillna(0).astype(float)
df['Rotation']=np.arctan2(y,x)
df['Angle']=np.度(df['Rotation'])
df_A=df[df['Label']='A']。重置索引(drop=True)
df_B=df[df['Label']='B']。重置_索引(drop=True)
y1=df_A[“角度]。数值
y2=df_B['角度].值
#这里不需要计算希尔伯特变换
f、 ax=plt.子批次(3,1,figsize=(20,5),sharex=True)
ax[0]。绘图(y1,颜色='r',标签='y1')
ax[0]。绘图(y2,颜色='b',标签='y2')
ax[0]。图例(bbox_至_锚=(0,1.02,1.,.102),ncol=2)
ax[1]。绘图(ang1,color='r')
ax[1]。绘图(ang2,color='b')
ax[1]。设置(title='每个时间点的角度')
#我所改变的一切
相位同步=1-np.sin(np.abs(y1-y2)/2)
ax[2]。绘图(相位同步)
ax[2].集合(ylim=[0,1.1],title='瞬时相位同步',xlabel='Time',ylabel='相位同步')
plt.紧_布局()
plt.show()

np.abs(ang1-ang2)的值都是~pi,这就是为什么
相位同步计算都是零。