第【89】期-- MIMO干扰广播信道中的加权和速率最大化:WMMSE算法推导、实现与仿真 --MATLAB完整代码

关注我,追更更多通信仿真代码!

文章目录

摘要

多小区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公众号(包含往期博客所有代码),所见即所得

相关推荐
带娃的IT创业者11 天前
当推理速度突破物理极限:深度解析 MiMo-v2.5-Pro-UltraSpeed 的 1000 TPS 架构革命
人工智能·架构·大模型·架构优化·mimo·tps·推理速度
通信仿真爱好者19 天前
第【60期】--大规模MIMO系统信号检测算法误码率比较 --matlab完整代码+参考文章
算法·matlab·mimo·信号检测
wj3055853782 个月前
Claude Code接入MiMo缓存失效?1个变量秒修复
缓存·mimo·claude code
通信仿真爱好者2 个月前
第【11】期--基于智能反射面的MIMO安全速率最大化研究-maltab完整代码+完整报告
mimo·matlab仿真·物理层安全·智能反射面
人道领域2 个月前
新项目该怎么入手?我用Claude code 接入小米mimo复盘黑马点评,看他的思路是什么。
java·人工智能·后端·mimo·claude code
Quz2 个月前
小米 MiMo vs DeepSeek API 选型对比
人工智能·mimo·deepseek
深念Y2 个月前
Claude Code + MiMo 模型踩坑全记录:当 NewAPI 公益站遇上推理链缺失
ai·api·小米·key·代理·mimo·newapi
深念Y2 个月前
正在阅读正在阅读MiMo 突然不能用 Claude Code 了?
ai·api·agent·key·mimo·claudecode·xiaomi
BUG制造者:图图2 个月前
MiMo 模型 Tool Calls 400 报错终极解决方案——Reasoning Content 代理中间件
中间件·代理模式·mimo·小米模型