关注我,追更更多通信仿真代码!
文章目录
-
- 摘要
- 一、引言
- 二、系统模型与问题描述
-
- [2.1 系统模型](#2.1 系统模型)
- [2.2 优化问题](#2.2 优化问题)
- 三、WMMSE算法:理论基础与迭代公式
-
- [3.1 速率与MSE的等价关系](#3.1 速率与MSE的等价关系)
- [3.2 等价优化问题的构建](#3.2 等价优化问题的构建)
- [3.3 交替优化迭代](#3.3 交替优化迭代)
- 四、仿真设计
-
- [4.1 仿真参数](#4.1 仿真参数)
- [4.2 仿真结果](#4.2 仿真结果)
- [4.3 完整代码](#4.3 完整代码)
- 五、结论
摘要
多小区MIMO干扰广播信道(MIMO-IBC)中的加权和速率最大化问题是一个经典的非凸优化难题。Shi等人于2011年提出的迭代加权最小均方误差(WMMSE)算法为该问题提供了一种优雅的解决思路------通过建立加权和速率与加权MSE之间的等价关系,将原始非凸问题转化为一系列可高效求解的凸子问题。本文从系统模型出发,详细推导了WMMSE算法的理论基础,给出了完整的迭代更新公式,并通过MATLAB仿真验证了算法的收敛性与有效性。
参考文献《An iteratively weighted MMSE approach to distributed sum-utility maximization for a MIMO interfering broadcast channel》
一、引言
-
随着无线通信技术的快速发展,多小区多用户MIMO系统已成为提升频谱效率的关键技术架构。在这一架构中,多个基站同时向各自服务范围内的用户发送信号,不可避免地会对相邻小区的用户产生共信道干扰。如何设计线性收发机以最大化系统的加权和速率(Weighted Sum Rate, WSR),是该领域颇具挑战性的问题之一。
-
Q Shi 等人将WMMSE算法应用到存在小区内和小区间干扰的多基站多用户的MIMO系统中。加权和速率最大化问题与一个特定的加权MSE最小化问题在某种意义上是等价的。通过在这一等价问题中交替优化接收机、权重矩阵和发射预编码器,算法能够单调地改善加权和速率,最终收敛到原问题的一个平稳点。
二、系统模型与问题描述
2.1 系统模型

2.2 优化问题

显然这是一个非凸问题。
三、WMMSE算法:理论基础与迭代公式
3.1 速率与MSE的等价关系



具体证明过程可以见原论文。
3.2 等价优化问题的构建

由于 V 和 W 是相互独立的变量,可以安全地将两个最大化符号合并:

注意到

再转成最小化问题:

至此,我们完成了从原始速率最大化问题§到三变量联合优化问题(4d)的完全等价转换。整个过程没有引入任何近似,唯一的代价是增加了两个辅助变量(U 和 W),但换来的好处是:目标函数对每个变量单独而言都变成了凸函数(甚至具有闭式解),这使得高效迭代求解成为可能。
3.3 交替优化迭代



交替优化更新即可。
四、仿真设计
4.1 仿真参数
| 参数 | 符号 | 默认取值 |
|---|---|---|
| 基站(小区)数 | (K) | 4 |
| 每小区用户数 | (I) | 4 |
| 基站发射天线数 | (T) | 2 |
| 用户接收天线数 | (R) | 2 |
| 噪声功率 | (\sigma^2) | 1 |
| 用户权重 | (\alpha_{i,k}) | 1(等权重) |
| 收敛容差 | (\epsilon) | (10^{-3}) |
| 最大迭代次数 | (T_{\max}) | 100 |
| 信道模型 | --- | 瑞利平坦衰落 |
| 预编码初始化 | --- | 随机复数高斯,按总功率归一化 |
4.2 仿真结果


其中:
- 蓝色(WMMSE int10):每次信道实现做 10 次随机初始化,取 WMMSE 收敛后的最高速率再平均;
- 红色(WMMSE):每次信道实现只做 1 次随机初始化,收敛后直接平均。
可以看到:
- WMMSE 算法具有良好的收敛速度,能够在较少的迭代次数内达到稳定状态。
- 加权和速率最大化问题本质上是非凸的,WMMSE 算法只能保证收敛到局部最优解(平稳点),不能保证全局最优;单次随机初始化容易陷入"较差"的局部最优(尤其当干扰较强时);多次初始化相当于从不同的起始点出发进行搜索,选取得分最高的结果,提高了找到"更好"局部最优解的概率;
4.3 完整代码
c
%% (a) 收敛性验证:固定 SNR 下迭代过程
clear;
clc;
close all;
K = 4; % 基站数(小区数)
T = 2; % 每基站发射天线数
R = 2; % 每用户接收天线数
epsilon = 1e-3; % 停止判据:相对速率变化小于此值
max_iter = 100; % 最大迭代次数
sigma2 = 1; % 噪声功率
I = 4; % 每小区用户数
alpha1 = ones(I,K); % 用户权重(等权)
d = 4; % 数据流数(初始设置,后面取 min)
d = min([d, T, R]); % 实际数据流数受天线数限制
snr = 30; % 信噪比 (dB)
P = db2pow(snr)*sigma2; % 发射总功率(线性值)
% 生成随机瑞利平坦衰落信道,各元素 CN(0,1)
H = cell(I,K,K);
for i=1:I
for k = 1:K
for j=1:K
H{i,k,j} = sqrt(1/2)*(randn(R,T)+1i*randn(R,T));
end
end
end
rate = []; % 记录每次迭代的加权和速率
% 随机初始化预编码,满足总功率约束(每个用户平均分配功率)
V = cell(I,K);
for i=1:I
for k=1:K
v = randn(T,d)+1i*randn(T,d);
V{i,k} = sqrt(P/I)*v/norm(v,"fro");
end
end
% 计算初始和速率
rate_old = sum_rate(H,V,sigma2,R,I,K,alpha1);
rate = [rate rate_old];
iter1 = 1;
while(1)
% 步骤1:更新接收机
U = find_U(H,V,sigma2,R,I,K,d);
% 步骤2:更新权重
W = find_W(U,H,V,I,K,d);
% 步骤3:更新预编码
V = find_V(alpha1,H,U,W,T,I,K,P);
% 计算新和速率
rate_new = sum_rate(H,V,sigma2,R,I,K,alpha1);
rate = [rate rate_new];
iter1 = iter1 + 1;
% 判断是否收敛或达到最大迭代
if abs(rate_new-rate_old) / rate_old < epsilon || iter1 > max_iter
break;
end
rate_old = rate_new;
end
% 绘制收敛曲线
figure;
plot(0:iter1-1, rate, 'b-*')
grid on
xlabel('迭代次数')
ylabel('和速率 (bps/Hz)')
title('MIMO-IFC, SNR=30, K=4, T=2, R=2, \epsilon=1e-3')
c
function system_rate = sum_rate(H,V,sigma2,R,I,K,alpha1)
system_rate = 0;
for i = 1:I
for k = 1:K
H_ik = H{i, k, k};
V_ik = V{i, k};
d = size(V_ik, 2);
% 初始化干扰加噪声协方差矩阵 J(不含自身信号)
J = sigma2 * eye(R);
for j = 1:K
for m = 1:I
% 排除自身信号 (m==i && j==k)
if j ~= k || m ~= i
H_ij = H{i, k, j};
V_mj = V{m, j};
J = J + H_ij * V_mj * V_mj' * H_ij';
end
end
end
% 期望信号矩阵
signal = H_ik * V_ik;
% 计算该用户速率:log2(det(I + signal * signal' / J))
R_ik = log2(real(det(eye(R) + (signal * signal') / J)));
% 加权累加
system_rate = system_rate + alpha1(i, k) * R_ik;
end
end
end
c
function W = find_W(U,H,V,I,K,d)
% 初始化权重元胞数组,每个元素为 d×d 矩阵
W = cell(I, K);
for i = 1:I
for k = 1:K
U_ik = U{i, k};
H_ik = H{i, k, k};
V_ik = V{i, k};
% 计算误差矩阵 E = I - U^H * H * V
E = eye(d) - U_ik' * H_ik * V_ik;
% 权重矩阵取误差矩阵的逆:W = E^{-1}
W{i, k} = inv(E);
end
end
end
c
function V = find_V(alpha1,H,U,W,T,I,K,P)
% 获取数据流数 d(由权重矩阵的维度决定)
d = size(W{1,1},1);
V = cell(I, K);
tol = 1e-6; % 功率约束的容差
max_iter = 50; % 二分法最大迭代次数
for k = 1:K
% 对每个基站独立求解,使用二分法搜索拉格朗日乘子 mu_k
mu_low = 0;
mu_high = 1e3; % 足够大的上界
V_tmp = cell(I,1);
for iter = 1:max_iter
mu_k = (mu_low + mu_high) / 2;
power_k = 0;
for i = 1:I
% 构建矩阵 A(与用户 i 无关,只与基站 k 有关)
A = mu_k * eye(T);
for j = 1:K
for l = 1:I
H_ljk = H{l, j, k};
U_lj = U{l, j};
W_lj = W{l, j};
alpha_lj = alpha1(l,j);
% 累加所有用户(l,j)对基站 k 的干扰泄漏项
A = A + alpha_lj * (H_ljk') * U_lj * W_lj * (U_lj') * H_ljk;
end
end
% 构建向量 B(与用户 i 和基站 k 相关)
H_ikk = H{i, k, k};
U_ik = U{i, k};
W_ik = W{i, k};
alpha_ik = alpha1(i,k);
B = alpha_ik * (H_ikk') * U_ik * W_ik;
% 求解预编码:V_tmp{i} = A \ B
V_tmp{i} = A \ B;
power_k = power_k + norm(V_tmp{i}, 'fro')^2;
end
% 检查功率是否满足约束
if abs(power_k - P) < tol
break;
elseif power_k > P
mu_low = mu_k; % 功率太大 → 增大 mu 以增加惩罚
else
mu_high = mu_k; % 功率太小 → 减小 mu 以放松惩罚
end
end
% 将当前基站的预编码存入总元胞数组
for i = 1:I
V{i,k} = V_tmp{i};
end
end
end
bash
function U = find_U(H,V,sigma2,R,I,K,d)
% 初始化接收机元胞数组,维度 I×K,每个元素为 R×d 矩阵
U = cell(I, K);
for i = 1:I
for k = 1:K
% 构建接收信号的总协方差矩阵 J(含自身信号 + 干扰 + 噪声)
J = sigma2 * eye(R); % 噪声项
for j = 1:K
for m = 1:I
H_j = H{i, k, j}; % 第 j 个基站到用户 (i,k) 的信道
V_mj = V{m, j}; % 第 j 个基站对用户 (m,j) 的预编码
J = J + H_j * V_mj * V_mj' * H_j'; % 累加所有发射信号的协方差
end
end
% 提取本小区本用户的信道和预编码
H_ik = H{i, k, k};
V_ik = V{i, k};
% MMSE 接收机:J \ (H_ik * V_ik) 等效于 inv(J) * (H_ik * V_ik)
U{i, k} = (J \ H_ik) * V_ik; % 结果维度 R × d
end
end
end
五、结论
本文系统阐述了 WMMSE 算法在多小区 MIMO 干扰广播信道加权和速率最大化问题中的应用。通过建立速率与加权 MSE 的等价关系,将原始非凸问题转化为一系列可交替优化的凸子问题,并给出了完整的迭代更新公式。MATLAB 仿真结果表明,该算法具有良好的收敛性,能够有效提升系统加权和速率,为实际多小区 MIMO 系统的预编码设计提供了理论依据和实用工具。适合入门WMMSE算法,通信论文有很多优化问题都可以利用wmmse求解,比如RSMA多址接入的加权和速率优化,就是一个经典的wmmse算法的应用
往期的仿真代码可见往期文章文末VX公众号(包含往期博客所有代码),所见即所得