You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现两个带噪异相正弦信号的相位同步

带噪正弦信号的相位同步方案

已知两个带噪、相位不同的正弦信号,且已知它们的振幅和频率,目标是实现相位同步。之前通过上升沿过零点的方法因噪声干扰失效,相关法可能因噪声导致最大相关值出现在多周期后,偏移时丢失大量数据点。下面给出先识别相位差再偏移单信号的解决方案:

核心思路:正交解调法估计相位差

利用已知的信号频率,生成同相(cos)和正交(sin)的参考信号,通过与带噪信号做相关运算提取相位信息,这种方法抗噪声能力强,且无需依赖过零点检测。

具体步骤

  • 根据已知频率生成正交参考信号
  • 计算带噪信号与参考信号的相关积分,得到同相分量和正交分量
  • 通过反正切函数计算两个信号的相位,进而得到相位差
  • 对其中一个信号进行相位偏移,实现同步

代码实现(基于你的示例修改)

import numpy as np
import matplotlib.pyplot as plt

# 生成原始信号(和你的示例一致)
time = np.arange(0, 60, 0.005)
amp = 2
F = 0.25
signal1 = amp*np.sin(2*np.pi*F*time + np.pi)
signal2 = amp*np.sin(2*np.pi*F*time + np.pi/3)

# 添加噪声
mu, sigma = 0.2, 0.1
noise1 = np.random.normal(mu, sigma, len(signal1))
noise2 = np.random.normal(mu, sigma, len(signal2))
noisy_signal1 = signal1 + noise1
noisy_signal2 = signal2 + noise2

# ---------------------- 相位估计部分 ----------------------
def estimate_phase(noisy_signal, time, amp, freq):
    # 生成正交参考信号
    ref_cos = np.cos(2*np.pi*freq*time)
    ref_sin = np.sin(2*np.pi*freq*time)
    
    # 去除直流分量后计算相关积分
    signal_dc = noisy_signal - np.mean(noisy_signal)
    I = np.sum(signal_dc * ref_cos) * (time[1]-time[0])
    Q = np.sum(signal_dc * ref_sin) * (time[1]-time[0])
    
    # 根据积分结果计算相位
    scale = amp * (time[-1] - time[0]) / 2
    sin_phi = I / scale
    cos_phi = Q / scale
    phi = np.arctan2(sin_phi, cos_phi)
    return phi

# 估计两个信号的相位
phi1 = estimate_phase(noisy_signal1, time, amp, F)
phi2 = estimate_phase(noisy_signal2, time, amp, F)

# 计算相位差:让signal2与signal1同步所需的偏移量
phase_diff = phi1 - phi2

# 生成同步后的signal2(保留原噪声)
synced_signal2 = amp * np.sin(2*np.pi*F*time + phi2 + phase_diff) + noise2

# ---------------------- 可视化结果 ----------------------
plt.figure(figsize=(12,6))
plt.plot(time, noisy_signal1, label='带噪信号1', alpha=0.7)
plt.plot(time, noisy_signal2, label='带噪信号2(原始)', alpha=0.7)
plt.plot(time, synced_signal2, label='带噪信号2(同步后)', linestyle='--')
plt.legend()
plt.xlabel('时间')
plt.ylabel('幅值')
plt.title('带噪正弦信号相位同步结果')
plt.show()

# 打印估计的相位和相位差
print(f"估计的signal1相位:{phi1:.2f} rad")
print(f"估计的signal2相位:{phi2:.2f} rad")
print(f"相位差:{phase_diff:.2f} rad")

方法说明

  • 正交解调法通过积分运算平均掉噪声影响,抗干扰能力远优于零点检测
  • 已知振幅和频率的前提下,能精准计算相位缩放比例,降低估计误差
  • 同步时仅需对单个信号做相位偏移,不会丢失任何数据点

内容的提问来源于stack exchange,提问作者Marc Schwambach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:50:21