LMMSE(Linear Minimum Mean Square Error,线性最小均方误差)均衡是通信系统中最为经典且高效的接收端技术之一。它的核心思想是在抑制噪声与**消除信道干扰(ISI/衰落)**之间寻找一个最佳的平衡点。
1. 系统模型与变量含义
在单载波或 OFDM 的子载波上,经过频域同步后的接收信号模型可以表示为:
Y=HX+NY = HX + NY=HX+N
其中各变量的物理意义如下:
- XXX: 发送信号 。通常假设其均值为 0,协方差(功率)为 E∣X∣2=σx2E\|X\|\^2 = \sigma_x^2E∣X∣2=σx2。
- HHH: 信道频率响应(Channel Frequency Response)。它代表了信道对信号的幅度衰减和相位旋转。
- NNN: 加性高斯白噪声 (AWGN)。均值为 0,方差(功率)为 E∣N∣2=σn2E\|N\|\^2 = \sigma_n^2E∣N∣2=σn2。
- YYY: 接收信号。
2. LMMSE 的核心目标
均衡器的目的是找到一个线性系数 WWW,使得估计值 X^=WY\hat{X} = WYX^=WY 与真实值 XXX 之间的均方误差(MSE)最小:
J(W)=E∣X\^−X∣2=E∣WY−X∣2J(W) = E\|\\hat{X} - X\|\^2 = E\|WY - X\|\^2J(W)=E∣X\^−X∣2=E∣WY−X∣2
3. 公式推导过程
为了求得使 J(W)J(W)J(W) 最小的 WWW,我们利用正交原理(Orthogonality Principle) 。该原理指出,最优估计误差 (WY−X)(WY - X)(WY−X) 必须与观测数据 YYY 正交:
E(WY−X)Y∗=0E(WY - X)Y\^\* = 0E(WY−X)Y∗=0
第一步:展开期望公式
EWYY∗−XY∗=0EWYY\^\* - XY\^\* = 0EWYY∗−XY∗=0
W⋅EYY∗=EXY∗W \cdot EYY\^\* = EXY\^\*W⋅EYY∗=EXY∗
第二步:计算自相关 EYY∗EYY\^\*EYY∗ 和互相关 EXY∗EXY\^\*EXY∗
根据 Y=HX+NY = HX + NY=HX+N,假设信号 XXX 与噪声 NNN 互不相关(即 EXN∗=0EXN\^\* = 0EXN∗=0):
- 观测信号自相关:
EYY∗=E(HX+N)(HX+N)∗=∣H∣2E∣X∣2+E∣N∣2=∣H∣2σx2+σn2EYY\^\* = E(HX+N)(HX+N)\^\* = |H|^2E\|X\|\^2 + E\|N\|\^2 = |H|^2\sigma_x^2 + \sigma_n^2EYY∗=E(HX+N)(HX+N)∗=∣H∣2E∣X∣2+E∣N∣2=∣H∣2σx2+σn2
- 互相关:
EXY∗=EX(HX+N)∗=H∗E∣X∣2=H∗σx2EXY\^\* = EX(HX+N)\^\* = H^*E\|X\|\^2 = H^*\sigma_x^2EXY∗=EX(HX+N)∗=H∗E∣X∣2=H∗σx2
第三步:求解 WWW
将上述结果代入 W⋅EYY∗=EXY∗W \cdot EYY\^\* = EXY\^\*W⋅EYY∗=EXY∗:
W(∣H∣2σx2+σn2)=H∗σx2W(|H|^2\sigma_x^2 + \sigma_n^2) = H^*\sigma_x^2W(∣H∣2σx2+σn2)=H∗σx2
W=H∗σx2∣H∣2σx2+σn2W = \frac{H^* \sigma_x^2}{|H|^2 \sigma_x^2 + \sigma_n^2}W=∣H∣2σx2+σn2H∗σx2
为了简化,我们通常将分子分母同除以 σx2\sigma_x^2σx2:
WLMMSE=H∗∣H∣2+σn2σx2W_{LMMSE} = \frac{H^*}{|H|^2 + \frac{\sigma_n^2}{\sigma_x^2}} WLMMSE=∣H∣2+σx2σn2H∗
4. 深度理解:LMMSE vs. Zero-Forcing (ZF)
我们可以通过对比来看出 LMMSE 的高明之处:
- Zero-Forcing (ZF) 均衡器: WZF=1HW_{ZF} = \frac{1}{H}WZF=H1
- 缺点: 如果某个频率点信道很弱(∣H∣|H|∣H∣ 很小),1/H1/H1/H 就会变得非常大。此时会极度放大噪声,导致性能崩溃。
- LMMSE 均衡器:
- 高 SNR 时 (σn2→0\sigma_n^2 \to 0σn2→0): 公式退化为 1/H1/H1/H,此时主要任务是消除衰落。
- 低 SNR 时 (σn2\sigma_n^2σn2 很大): 分母被噪声功率占主导,阻止了 WWW 无限变大。此时它表现得更稳健,牺牲了一部分信号还原度来换取噪声的抑制。
5. python代码实现
python
import torch
import matplotlib.pyplot as plt
import numpy as np
def MMSE_equalization(x_complex, h, received_signal, noise_power):
'''
计算 MMSE 均衡器系数并应用于接收信号
:param x_complex: 信道输入信号(复数形式)
:param h: 信道系数(复数形式)
:param received_signal: 接收信号(复数形式)
:param noise_power: 噪声功率(标量),不是SNR
:return: 均衡后的信号(复数形式)
'''
device = x_complex.device
Px = torch.mean(torch.abs(x_complex) ** 2)
#print(f"Px: {Px.item()}")
noise_power_tensor = torch.tensor(noise_power, device=device)
# 计算 MMSE 均衡器系数
W = h.conj() / (torch.abs(h) ** 2 + noise_power_tensor / Px)
# 应用 MMSE 均衡器
equalized_signal = W * received_signal
return equalized_signal
def test_lmmse_equalization():
# 1. 模拟参数设置
B, C, K = 4, 12, 80 # Batch, Subcarriers, Symbols
SNR_dB = 10
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 2. 生成随机复数信号 (模拟已归一化的 x_normalized)
# 我们用 4-QAM 信号作为例子,方便观察星座图
x_real = torch.sign(torch.randn(B, C, K, device=device))
x_imag = torch.sign(torch.randn(B, C, K, device=device))
x_normalized = (x_real + 1j * x_imag) / np.sqrt(2) # 功率归一化到 1
# 3. 生成随机信道 H (瑞利衰落)
#h = (torch.randn(B, C, K, device=device) + 1j * torch.randn(B, C, K, device=device)) / np.sqrt(2)
h = torch.ones_like(x_normalized) * (0.5 + 0.5j) # 顺时针旋转45°
# 4. 信号经过信道
y_faded = h * x_normalized
# 5. 添加噪声
p_rx = torch.mean(torch.abs(y_faded) ** 2, dim=(1, 2), keepdim=True)
snr_linear = 10 ** (SNR_dB / 10.0)
n0 = p_rx / snr_linear
noise = (torch.randn_like(x_normalized) + 1j * torch.randn_like(x_normalized)) * torch.sqrt(n0 / 2)
y_complex = y_faded + noise
# 6. LMMSE 均衡
noise_var = n0
y_equalized = MMSE_equalization(x_normalized, h, y_complex, noise_var)
# 7. 性能评估
mse = torch.mean(torch.abs(x_normalized - y_equalized) ** 2).item()
print(f"--- 测试结果 ---")
print(f"SNR: {SNR_dB} dB")
print(f"MSE (越小越好): {mse:.6f}")
# 8. 可视化星座图
plt.figure(figsize=(12, 4))
# 原始信号
plt.subplot(1, 3, 1)
plt.scatter(x_normalized.cpu().real.flatten(), x_normalized.cpu().imag.flatten(), s=1, alpha=0.5)
plt.title("Original (Sent)")
plt.grid(True);
plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
# 接收信号 (未均衡)
plt.subplot(1, 3, 2)
plt.scatter(y_complex.cpu().real.flatten(), y_complex.cpu().imag.flatten(), s=1, alpha=0.3)
plt.title("Received (Faded + Noise)")
plt.grid(True)
# 均衡后信号
plt.subplot(1, 3, 3)
plt.scatter(y_equalized.cpu().real.flatten(), y_equalized.cpu().imag.flatten(), s=1, alpha=0.5)
plt.title(f"Equalized (LMMSE)\nMSE: {mse:.5f}")
plt.grid(True);
plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
plt.tight_layout()
plt.show()
if __name__ == "__main__":
test_lmmse_equalization()
SNR=10dB,平坦衰落(旋转45°):

SNR=10dB,瑞利衰落:
