第【60期】--大规模MIMO系统信号检测算法误码率比较 --matlab完整代码+参考文章

文章目录

    • 摘要
    • [1 背景意义](#1 背景意义)
    • [2 理论基础](#2 理论基础)
      • [2.1 大规模MIMO上行链路模型](#2.1 大规模MIMO上行链路模型)
    • [2.2 最大似然检测](#2.2 最大似然检测)
    • [2.2 匹配滤波(Matched Filter, MF)](#2.2 匹配滤波(Matched Filter, MF))
    • [2.3 最小均方误差检测(MMSE)](#2.3 最小均方误差检测(MMSE))
      • [2.3 SIMO性能上界](#2.3 SIMO性能上界)
      • [2.4 诺伊曼级数近似(Neumann Series)](#2.4 诺伊曼级数近似(Neumann Series))
      • [2.5 高斯-赛德尔迭代(Gauss-Seidel)](#2.5 高斯-赛德尔迭代(Gauss-Seidel))
      • [2.6共轭梯度法(Conjugate Gradient, CG)](#2.6共轭梯度法(Conjugate Gradient, CG))
      • 2.7优化坐标下降BOX检测器(OCDBOX)
      • [2.8 ADMM无穷范数检测器](#2.8 ADMM无穷范数检测器)
    • [3 仿真结果](#3 仿真结果)

摘要

本文提出一个研究了大规模多输入多输出(MIMO)上行链路系统中主流信号检测算法的性能,实现了八种具有代表性的检测器,分为三类:(1)传统线性检测方案,包括匹配滤波(MF)和最小均方误差(MMSE)检测;(2)基于近似求逆的检测方法,包括诺伊曼级数近似、高斯-赛德尔迭代和共轭梯度(CG)检测;(3)基于BOX约束的检测方法,包括基于交替方向乘子法的无穷范数(ADMIN)检测器和优化坐标下降BOX(OCDBOX)检测器。此外,单输入多输出(SIMO)上界作为理想性能基准提供。

参考文章:
S. Shahabddin, M. Juntti and C. Studer, "ADMM-based infinity-norm detector for large-scale MIMO", IEEE International symposium of circuits and systems, Maryland, USA, May 2017.

1 背景意义

大规模MIMO技术在基站端部署数十至数百根天线,在同一时频资源内服务多个用户终端,能够显著提升系统频谱效率和链路可靠性,已成为5G无线通信系统的关键使能技术之一。然而,大规模MIMO带来的性能增益是以计算复杂度的显著增加为代价的。在上行链路中,基站需要从所有用户同时发送的叠加信号中准确检测出每个用户的发送符号,这一检测过程的计算复杂度随着用户数和调制阶数的增长而急剧上升。

最优的最大似然(ML)检测通过对所有可能的发送符号组合进行穷举搜索实现,其复杂度随用户数呈指数增长3,在大规模MIMO系统中完全不可行。传统的线性检测算法如匹配滤波(MF)和最小均方误差(MMSE)检测4虽然复杂度较低,但在天线数接近用户数时性能严重恶化。

2 理论基础

2.1 大规模MIMO上行链路模型

2.2 最大似然检测

2.2 匹配滤波(Matched Filter, MF)

2.3 最小均方误差检测(MMSE)

2.3 SIMO性能上界

假设在检测第 k 个用户时完美消除了所有其他用户的干扰:

2.4 诺伊曼级数近似(Neumann Series)

2.5 高斯-赛德尔迭代(Gauss-Seidel)

2.6共轭梯度法(Conjugate Gradient, CG)

2.7优化坐标下降BOX检测器(OCDBOX)

2.8 ADMM无穷范数检测器

ADMM将(18)改写为等价形式,采用ADMM求解

3 仿真结果

部分代码:

c 复制代码
if isempty(varargin)
    
    disp('使用默认仿真设置和参数...')
    
    % 设置默认仿真参数
    par.suffix = 'exp';                     % 仿真名称后缀: 'exp' 实验
    par.runId = 0;                         % 仿真ID(用于复现结果)
    par.MR = 64;                           % 接收天线数
    par.MT = 16;                           % 用户终端数(不大于MR!)
    par.mod = '64QAM';                     % 调制类型: 'BPSK','QPSK','16QAM','64QAM'
    par.simName = ['ERR_' num2str(par.MR) 'x' num2str(par.MT) '_' par.mod '_' par.suffix];  % 仿真名称(用于保存结果)
    par.trials = 100;                      % 蒙特卡洛试验次数
    par.SNRdB_list = 10:2:20;              % 待仿真的SNR [dB] 列表
    par.detector = {'MF','SIMO','Conjugate-Gradient','Neumann','Gauss-Seidel','OCDBOX','ADMIN','MMSE'};  % 待仿真的检测器列表
    % 算法专用参数
    par.alg.maxiter = 3;                   % 迭代算法的最大迭代次数
else
    
    disp('使用自定义仿真设置和参数...')
    par = varargin{1}; % 唯一参数为par结构体
    
end

% -- 初始化

% 使用runId随机种子(保证可复现性)
%   rng(par.runId);

% 建立格雷映射的星座字母表(依据IEEE 802.11)
switch (par.mod)
    case 'BPSK'
        par.symbols = [ -1 1 ];
    case 'QPSK'
        par.symbols = [ -1-1i,-1+1i, ...
            +1-1i,+1+1i ];
    case '16QAM'
        par.symbols = [ -3-3i,-3-1i,-3+3i,-3+1i, ...
            -1-3i,-1-1i,-1+3i,-1+1i, ...
            +3-3i,+3-1i,+3+3i,+3+1i, ...
            +1-3i,+1-1i,+1+3i,+1+1i ];
    case '64QAM'
        par.symbols = [ -7-7i,-7-5i,-7-1i,-7-3i,-7+7i,-7+5i,-7+1i,-7+3i, ...
            -5-7i,-5-5i,-5-1i,-5-3i,-5+7i,-5+5i,-5+1i,-5+3i, ...
            -1-7i,-1-5i,-1-1i,-1-3i,-1+7i,-1+5i,-1+1i,-1+3i, ...
            -3-7i,-3-5i,-3-1i,-3-3i,-3+7i,-3+5i,-3+1i,-3+3i, ...
            +7-7i,+7-5i,+7-1i,+7-3i,+7+7i,+7+5i,+7+1i,+7+3i, ...
            +5-7i,+5-5i,+5-1i,+5-3i,+5+7i,+5+5i,+5+1i,+5+3i, ...
            +1-7i,+1-5i,+1-1i,+1-3i,+1+7i,+1+5i,+1+1i,+1+3i, ...
            +3-7i,+3-5i,+3-1i,+3-3i,+3+7i,+3+5i,+3+1i,+3+3i ];
end

% 提取平均符号能量
par.Es = mean(abs(par.symbols).^2);

% 预计算比特标签
par.Q = log2(length(par.symbols));                % 每个符号的比特数
par.bits = de2bi(0:length(par.symbols)-1, par.Q, 'left-msb');

% 跟踪仿真时间
time_elapsed = 0;

% -- 开始仿真

% 初始化结果数组(检测器 x SNR)
res.VER = zeros(length(par.detector), length(par.SNRdB_list));  % 向量错误率
res.SER = zeros(length(par.detector), length(par.SNRdB_list));  % 符号错误率
res.BER = zeros(length(par.detector), length(par.SNRdB_list));  % 比特错误率

% 生成随机比特流(天线 x 比特 x 试验)
bits = randi([0 1], par.MT, par.Q, par.trials);

% 试验循环
tic
for t = 1:par.trials
    
    % 生成发送符号
    idx = bi2de(bits(:,:,t), 'left-msb') + 1;
    s = par.symbols(idx).';
    
    % 生成独立同分布的高斯信道矩阵和噪声向量
    n = sqrt(0.5) * (randn(par.MR, 1) + 1i*randn(par.MR, 1));
    H = sqrt(0.5) * (randn(par.MR, par.MT) + 1i*randn(par.MR, par.MT));
    
    % 通过无噪声信道发送(稍后使用)
    x = H * s;
    
    % SNR 循环
    for k = 1:length(par.SNRdB_list)
        % 当前SNR点(dB)
        SNR_dB = par.SNRdB_list(k);
        % 线性SNR
        SNR_lin = 10.^(SNR_dB ./ 10);
        
        % 每根接收天线的复噪声方差
        N0 = par.Es * par.MT / SNR_lin;
        
        % 通过有噪声信道发送数据
        y = x + sqrt(N0) * n;
        
        % 算法循环
        for d = 1:length(par.detector)
            switch (par.detector{d})   % 选择算法
                case 'MF'              % 匹配滤波
                    [idxhat, bithat] = MF(par, H, y);
                case 'MMSE'            % MMSE检测器
                    [idxhat, bithat] = MMSE(par, H, y, N0);
                case 'SIMO'            % SIMO下界
                    [idxhat, bithat] = SIMO(par, H, y, s);
                case 'ADMIN'           % 基于ADMM的无穷范数检测器
                    [idxhat, bithat] = ADMIN(par, H, y, N0);
                case 'OCDBOX'          % 优化坐标下降BOX检测器
                    [idxhat, bithat] = OCDBOX(par, H, y);
                case 'Neumann'         % 诺伊曼级数近似
                    [idxhat, bithat] = Neumann(par, H, y, N0);
                case 'Gauss-Seidel'    % 高斯-赛德尔检测器
                    [idxhat, bithat] = Gauss_Seidel(par, H, y, N0);
                case 'Conjugate-Gradient'  % 共轭梯度检测器
                    [idxhat, bithat] = CG(par, H, y, N0);
                otherwise
                    error('par.detector 类型未定义。')
            end
            
            % -- 计算错误指标
            err = (idx ~= idxhat);
            res.VER(d,k) = res.VER(d,k) + any(err);
            res.SER(d,k) = res.SER(d,k) + sum(err) / par.MT;
            res.BER(d,k) = res.BER(d,k) + sum(sum(bits(:,:,t) ~= bithat)) / (par.MT * par.Q);
            
        end % 算法循环结束
        
    end % SNR循环结束
    
    % 跟踪仿真时间
    if toc > 10
        time = toc;
        time_elapsed = time_elapsed + time;
        fprintf('预计剩余仿真时间: %3.0f 分钟。\n', time_elapsed * (par.trials/t - 1) / 60);
        tic
    end
    
end % 试验循环结束

% 归一化结果
res.VER = res.VER / par.trials;
res.SER = res.SER / par.trials;
res.BER = res.BER / par.trials;
res.time_elapsed = time_elapsed;

% -- 保存最终结果(par和res结构体)

%   save([ par.simName '_' num2str(par.runId) ], 'par', 'res');

% -- 显示结果(生成美观的Matlab图形)

marker_style = {'bo-','rs--','mv-.','kp:','g*-','c>--','yx:','k--'};
figure(1)
for d = 1:length(par.detector)
    if d == 1
        semilogy(par.SNRdB_list, res.BER(d,:), marker_style{d}, 'LineWidth', 2)
        hold on
    else
        semilogy(par.SNRdB_list, res.BER(d,:), marker_style{d}, 'LineWidth', 2)
    end
end
hold off
grid on
xlabel('每根接收天线的平均SNR [dB]', 'FontSize', 12)
ylabel('比特误码率 (BER)', 'FontSize', 12)
axis([min(par.SNRdB_list) max(par.SNRdB_list) 1e-4 1])
legend(par.detector, 'FontSize', 12)
set(gca, 'FontSize', 12)

end
相关推荐
AI科技星2 小时前
全域谱分析:无穷维超复数信息场分形统一场论——自然、量子、金融多重分形第一性原理完整体系(中英双语终稿)
人工智能·python·算法·金融·乖乖数学·全域数学
先吃饱再说3 小时前
为什么堆能 O(log n) 插入?拆解完全二叉树的数组魔法
算法·排序算法
留白_4 小时前
【决策树】泰坦尼克号生存预测
算法·决策树·机器学习
hqzing4 小时前
鸿蒙 PC 底层开发技术详解(七):二进制自签名算法的实现
算法·华为·harmonyos
AI科技星4 小时前
超复数全域经济周期场与信息谱场——金融与密码学底层理论重构《0·1·∞三元一体全域超复数统一场论》系列全集(六一字不漏完整合订终版)
人工智能·算法·金融·密码学·拓扑学·乖乖数学·全域数学
AI科技星4 小时前
《01无穷全域信息场论:算子G与宇宙本体高维完备公理大典》
人工智能·python·算法·金融·乖乖数学·全域数学
Tim_105 小时前
【C++】013、空类占多少字节?
算法
Ricky_Theseus5 小时前
并查集:连通性问题
算法
Tairitsu_H5 小时前
[LC优选算法#18] 前缀和 | 除⾃⾝以外数组的乘积 | 和为K的⼦数组 | 和可被K整除的⼦数组
算法·前缀和·哈希算法