信道均衡——LMMSE算法

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∣2]J(W) = E[|\hat{X} - X|^2] = E[|WY - X|^2]J(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

第一步:展开期望公式

E[WYY∗−XY∗]=0E[WYY^* - XY^*] = 0E[WYY∗−XY∗]=0

W⋅E[YY∗]=E[XY∗]W \cdot E[YY^*] = E[XY^*]W⋅E[YY∗]=E[XY∗]

第二步:计算自相关 E[YY∗]E[YY^*]E[YY∗] 和互相关 E[XY∗]E[XY^*]E[XY∗]

根据 Y=HX+NY = HX + NY=HX+N,假设信号 XXX 与噪声 NNN 互不相关(即 E[XN∗]=0E[XN^*] = 0E[XN∗]=0):

  1. 观测信号自相关:

E[YY∗]=E[(HX+N)(HX+N)∗]=∣H∣2E[∣X∣2]+E[∣N∣2]=∣H∣2σx2+σn2E[YY^*] = E[(HX+N)(HX+N)^*] = |H|^2E[|X|^2] + E[|N|^2] = |H|^2\sigma_x^2 + \sigma_n^2E[YY∗]=E[(HX+N)(HX+N)∗]=∣H∣2E[∣X∣2]+E[∣N∣2]=∣H∣2σx2+σn2

  1. 互相关:

E[XY∗]=E[X(HX+N)∗]=H∗E[∣X∣2]=H∗σx2E[XY^*] = E[X(HX+N)^*] = H^*E[|X|^2] = H^*\sigma_x^2E[XY∗]=E[X(HX+N)∗]=H∗E[∣X∣2]=H∗σx2

第三步:求解 WWW

将上述结果代入 W⋅E[YY∗]=E[XY∗]W \cdot E[YY^*] = E[XY^*]W⋅E[YY∗]=E[XY∗]:

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 的高明之处:

  1. Zero-Forcing (ZF) 均衡器: WZF=1HW_{ZF} = \frac{1}{H}WZF=H1
  • 缺点: 如果某个频率点信道很弱(∣H∣|H|∣H∣ 很小),1/H1/H1/H 就会变得非常大。此时会极度放大噪声,导致性能崩溃。
  1. 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,瑞利衰落:

相关推荐
知识分享小能手3 小时前
PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 内部结构深度解析 —语法、实现与实战案例(20)
数据库·学习·postgresql
花姐夫Jun3 小时前
WebGL学习-夹角的归一化
学习·webgl
_muffinman3 小时前
Java学习笔记-第2章 运算和语句
java·笔记·学习
Be for thing4 小时前
Android 音频硬件(Codec / 喇叭 / 麦克风)原理 + 功耗与问题定位实战(手机 / 手表通用)
android·学习·智能手机·音视频
六元七角八分4 小时前
学习笔记一《JavaScript基础语法》
javascript·笔记·学习
Be for thing4 小时前
Android 存储硬件(RAM/UFS/eMMC)底层原理 + 性能 / 功耗测试实战
android·学习·智能硬件
码农的小菜园4 小时前
Android架构学习笔记
android·学习·架构
智算菩萨4 小时前
ChatGPT 5.4在英语学习中的应用:经典专四英语散文《Spring Thaw》赏析
人工智能·学习·ai·chatgpt·机器翻译
qq_571099354 小时前
学习周报三十六
学习