每次看到相干光通信的论文里那些密密麻麻的公式,你是不是也感到一阵眩晕?特别是平衡接收机部分,各种三角函数、复数运算和相位噪声项交织在一起,让人望而生畏。作为曾经也被这些公式"折磨"过的工程师,我想分享一个更直观的学习方法——用Python搭建仿真模型,通过可视化来理解平衡接收机的工作原理。
在光纤通信系统中,接收端需要将微弱的光信号转换为电信号进行处理。传统的光电探测器虽然简单,但存在几个致命缺陷:
平衡接收机通过差分探测的方式,巧妙地解决了这些问题。它不仅能抑制直流分量和强度噪声,还能将信号幅度提高一倍。想象一下,这就像是用两只耳朵听声音——通过比较两耳的差异,我们不仅能更清晰地定位声源,还能过滤掉环境噪声。
让我们用NumPy和Matplotlib来构建一个简化的平衡接收机仿真系统。这个模型将包含三个主要组件:3dB耦合器、光电探测器和差分放大器。
首先设置Python环境并生成测试信号:
python复制import numpy as np
import matplotlib.pyplot as plt
from scipy import constants
# 仿真参数设置
Fs = 100e9 # 采样率100GHz
T = 1e-9 # 仿真时长1ns
t = np.arange(0, T, 1/Fs) # 时间轴
# 生成信号光(Signal)和本振光(LO)
fc_signal = 193.1e12 # 信号光频率193.1THz(C波段)
fc_lo = 193.1e12 # 本振光频率(理想零差情况)
# 加入小幅频率偏移模拟实际情况
delta_f = 100e6 # 100MHz偏移
fc_lo += delta_f
# 信号光参数
Ps = 1e-6 # 信号光功率1μW
As = np.sqrt(Ps) # 信号光幅度
phi_s = 0.1 * np.sin(2*np.pi*1e9*t) # 信号相位调制(1GHz)
# 本振光参数
Plo = 1e-3 # 本振光功率1mW
Alo = np.sqrt(Plo) # 本振光幅度
phi_lo = 0.05 * np.random.randn(len(t)) # 本振相位噪声
3dB耦合器是平衡接收机的核心器件,它将信号光和本振光按特定比例混合:
python复制def coupler_3dB(signal, lo):
"""模拟3dB耦合器工作"""
# 理想3dB耦合器输出
out1 = (signal + lo) / np.sqrt(2) # 同相输出
out2 = (signal - lo) / np.sqrt(2) # 反相输出
return out1, out2
# 生成光场信号
signal_field = As * np.exp(1j*(2*np.pi*fc_signal*t + phi_s))
lo_field = Alo * np.exp(1j*(2*np.pi*fc_lo*t + phi_lo))
# 通过3dB耦合器
E1, E2 = coupler_3dB(signal_field, lo_field)
为了直观理解耦合器的作用,我们可以绘制输入输出信号的对比:
python复制plt.figure(figsize=(12, 6))
plt.subplot(211)
plt.plot(t[:1000], np.real(signal_field[:1000]), label='Signal')
plt.plot(t[:1000], np.real(lo_field[:1000]), label='LO')
plt.title('Input Optical Fields')
plt.ylabel('Amplitude')
plt.legend()
plt.subplot(212)
plt.plot(t[:1000], np.abs(E1[:1000])**2, label='E1 Output')
plt.plot(t[:1000], np.abs(E2[:1000])**2, label='E2 Output')
plt.title('3dB Coupler Outputs')
plt.xlabel('Time (s)')
plt.ylabel('Intensity')
plt.legend()
plt.tight_layout()
plt.show()
经过耦合器后,光信号需要被转换为电信号。光电二极管完成这一转换,其输出电流与输入光功率成正比:
python复制def photodetector(optical_field, R=0.8):
"""模拟光电探测器响应"""
# R为响应度(A/W),输出电流与光功率成正比
optical_power = np.abs(optical_field)**2
return R * optical_power
# 两个支路的光电转换
I1 = photodetector(E1)
I2 = photodetector(E2)
# 差分放大输出
I_diff = I1 - I2
让我们可视化这三个关键位置的信号变化:
python复制plt.figure(figsize=(12, 9))
# 绘制耦合器输出光强
plt.subplot(311)
plt.plot(t[:1000], np.abs(E1[:1000])**2, label='E1 Intensity')
plt.plot(t[:1000], np.abs(E2[:1000])**2, label='E2 Intensity')
plt.title('Optical Intensity After Coupler')
plt.ylabel('Power (W)')
plt.legend()
# 绘制探测器输出电流
plt.subplot(312)
plt.plot(t[:1000], I1[:1000], label='I1 Current')
plt.plot(t[:1000], I2[:1000], label='I2 Current')
plt.title('Photodetector Output Currents')
plt.ylabel('Current (A)')
plt.legend()
# 绘制差分输出
plt.subplot(313)
plt.plot(t[:1000], I_diff[:1000], label='Differential Output', color='red')
plt.title('Balanced Receiver Final Output')
plt.xlabel('Time (s)')
plt.ylabel('Current (A)')
plt.legend()
plt.tight_layout()
plt.show()
通过仿真,我们可以直观地看到平衡接收机相比传统单端探测的优势:
比较单端探测和平衡探测的输出频谱:
python复制from scipy.fft import fft, fftfreq
# 计算频谱
freqs = fftfreq(len(t), 1/Fs)[:len(t)//2]
spectrum_I1 = np.abs(fft(I1)[:len(t)//2])
spectrum_diff = np.abs(fft(I_diff)[:len(t)//2])
plt.figure(figsize=(12, 5))
plt.semilogy(freqs/1e6, spectrum_I1, label='Single-ended (I1)')
plt.semilogy(freqs/1e6, spectrum_diff, label='Balanced (I1-I2)')
plt.xlim([0, 10e3]) # 观察低频部分
plt.title('Output Current Spectrum Comparison')
plt.xlabel('Frequency (MHz)')
plt.ylabel('Magnitude')
plt.legend()
plt.grid()
plt.show()
从频谱图中可以明显看出,平衡接收机几乎完全消除了直流分量(0Hz附近),而单端探测则有很强的直流成分。
平衡接收机通过差分放大,有效抑制了共模噪声(如本振激光器的强度噪声):
python复制# 添加本振强度噪声模拟
lo_noise = 0.01 * np.random.randn(len(t))
lo_field_noisy = (Alo + lo_noise) * np.exp(1j*(2*np.pi*fc_lo*t + phi_lo))
# 重新计算带噪声的情况
E1_noisy, E2_noisy = coupler_3dB(signal_field, lo_field_noisy)
I1_noisy = photodetector(E1_noisy)
I2_noisy = photodetector(E2_noisy)
I_diff_noisy = I1_noisy - I2_noisy
# 绘制比较
plt.figure(figsize=(12, 4))
plt.plot(t[:1000], I1[:1000], label='Single-ended (Noiseless)')
plt.plot(t[:1000], I1_noisy[:1000], label='Single-ended (With LO Noise)')
plt.plot(t[:1000], I_diff_noisy[:1000], label='Balanced (With LO Noise)')
plt.title('Noise Rejection Performance')
plt.xlabel('Time (s)')
plt.ylabel('Current (A)')
plt.legend()
plt.show()
从时域波形可以清晰看到,单端探测的输出明显受到本振强度噪声的影响,而平衡接收机则几乎完全抑制了这种噪声。
在实际的相干光通信中,我们通常使用正交调制(如QPSK)。平衡接收机可以自然地扩展到这种情况,形成所谓的"相位分集接收"。
对于正交调制信号,我们需要两个平衡接收机分别解调同相(I)和正交(Q)分量:
python复制# 生成QPSK信号示例
symbol_rate = 10e9 # 符号率10GBaud
samples_per_symbol = int(Fs / symbol_rate)
phi_s_i = np.pi/4 * np.sign(np.random.randn(len(t)//samples_per_symbol)) # I路相位
phi_s_q = np.pi/4 * np.sign(np.random.randn(len(t)//samples_per_symbol)) # Q路相位
# 扩展到连续时间
phi_s_i_cont = np.repeat(phi_s_i, samples_per_symbol)[:len(t)]
phi_s_q_cont = np.repeat(phi_s_q, samples_per_symbol)[:len(t)]
# 生成正交调制信号
signal_field_iq = As * np.exp(1j*(2*np.pi*fc_signal*t + phi_s_i_cont + phi_s_q_cont))
# 90度混合器输出(简化模型)
E_I1 = (signal_field_iq + lo_field) / np.sqrt(2)
E_I2 = (signal_field_iq - lo_field) / np.sqrt(2)
E_Q1 = (signal_field_iq + 1j*lo_field) / np.sqrt(2)
E_Q2 = (signal_field_iq - 1j*lo_field) / np.sqrt(2)
# 平衡探测
I_I = photodetector(E_I1) - photodetector(E_I2)
I_Q = photodetector(E_Q1) - photodetector(E_Q2)
通过绘制I/Q输出形成的星座图,可以直观评估解调性能:
python复制# 采样符号中心点
sample_points = np.arange(samples_per_symbol//2, len(t), samples_per_symbol)
I_samples = I_I[sample_points]
Q_samples = I_Q[sample_points]
plt.figure(figsize=(8, 8))
plt.scatter(I_samples, Q_samples, alpha=0.5)
plt.title('Received QPSK Constellation')
plt.xlabel('In-phase Component')
plt.ylabel('Quadrature Component')
plt.grid()
plt.axis('equal')
plt.show()
这个简单的仿真展示了平衡接收机如何同时解调出信号的I和Q分量,为后续的数字信号处理奠定基础。