相位 (Phase)
相位是一个周期信号在一个周期内的位置,通常以角度(度或弧度)表示。在许多应用中,相位被限制在一个周期内。例如,相位通常被限定在 −180∘到 +180∘ 或 0∘ 到 360∘ 之间。
示例
−90∘ 表示信号在周期的三分之一处。
180∘ 表示信号在周期的一半处。
展开相位 (Unwrapped Phase)
展开相位是指将相位角连续累加,消除相位跳变,使其成为线性变化的相位。这在处理跨越多个周期的信号时尤为重要,因为它避免了相位在 −180∘和 +180∘之间的跳变。这种处理方式可以更准确地反映信号的相位变化趋势。
示例
如果信号的相位从 170∘跳变到 −170∘,展开相位会将其处理为 170∘到 190∘。
相位和展开相位的区别
- 相位:受限于一个周期范围内的相位角,通常在 −180∘ 到 +180∘之间。
- 展开相位:累积的相位角,不受周期限制,线性变化。
计算展开相位的步骤
- 读取相位数据:从信号中读取初始相位数据。
- 检测相位跳变:在相位跨越 −180∘和 +180∘时检测相位跳变。
一般来说,可以通过计算相邻两个相位值的差值来检测相位跳变。如果相邻两个相位值的差值超过某个阈值(例如 180∘),则认为发生了相位跳变。为了使相位连续,可以在发生相位跳变时,对后续的相位值进行调整。
- 累加相位差:消除相位跳变,将其转换为连续变化的相位角。
示例
import numpy as np
import matplotlib.pyplot as plt
# 示例数据,10个频率点的实部和虚部
real = [1, 0.707, 0, -0.707, -1, -0.707, 0, 0.707, 1, 0.5]
imag = [0, 0.707, 1, 0.707, 0, -0.707, -1, -0.707, 0, -0.866]
# 计算相位
phase = np.arctan2(imag, real) # np.arctan2返回值在[-pi, pi]之间
phase_deg = np.degrees(phase) # 转换为角度
# 手动计算展开相位
unwrapped_phase_deg = np.zeros_like(phase_deg)
unwrapped_phase_deg[0] = phase_deg[0]
for i in range(1, len(phase_deg)):
delta = phase_deg[i] - phase_deg[i - 1]
if delta > 180:
unwrapped_phase_deg[i] = unwrapped_phase_deg[i - 1] + delta - 360
elif delta < -180:
unwrapped_phase_deg[i] = unwrapped_phase_deg[i - 1] + delta + 360
else:
unwrapped_phase_deg[i] = unwrapped_phase_deg[i - 1] + delta
# 打印相位和展开相位
print("实部: ", real)
print("虚部: ", imag)
print("相位: ", phase_deg)
print("展开相位: ", unwrapped_phase_deg)
# 绘制相位和展开相位
plt.figure(figsize=(12, 6))
plt.plot(phase_deg, label="相位")
plt.plot(unwrapped_phase_deg, label="展开相位")
plt.xlabel("频率点")
plt.ylabel("相位 (度)")
plt.legend()
plt.title("相位和展开相位")
plt.show()
实部: [1, 0.707, 0, -0.707, -1, -0.707, 0, 0.707, 1, 0.5]
虚部: [0, 0.707, 1, 0.707, 0, -0.707, -1, -0.707, 0, -0.866]
相位: [ 0. 45. 90. 135. 180.
-135. -90. -45. 0. -59.99927222]
展开相位: [ 0. 45. 90. 135. 180.
225. 270. 315. 360. 300.00072778]