1. 项目标题拆解与问题场景分析
1.1 从标题能读出哪些关键信息
先说结论:这个项目的完整名称是“【5G通信】5G毫米波UDN中带有位置感知波束成形的链路级模型干涉评估【含Matlab源码 15044期】”,做通信仿真的人一眼就能看出来,这里面其实包含了四个相互关联的技术栈,分别是5G毫米波通信、UDN超密集组网、位置感知波束成形算法,以及链路级性能评估方法。很多人第一次看这个标题会误以为它只是一个普通的波束赋形demo,但实际上它是在做一个典型的“位置信息如何反哺物理层设计”的闭环验证,这也是近年来5G-A和6G预研里特别热门的方向。
先说5G毫米波。这里的毫米波通常指的是24.25GHz到52.6GHz这个频段范围,波长在毫米级别,所以叫毫米波。相比Sub-6GHz频段,毫米波最大的特点就是带宽极大,单载波就能拿到400MHz甚至800MHz的连续带宽,这让它在需要超高吞吐的场景下非常有吸引力。但同时,毫米波也有两个非常致命的物理特性,一个是路损大,一个是绕射能力差,稍微有个遮挡信号就断了。这就直接引出了波束成形技术的必要性——你不能像传统基站那样全向发射,必须把能量集中到一个很窄的方向上打出去,才能在接收端获得可用的信噪比。
再说UDN,也就是Ultra-Dense Network,超密集网络。这个概念的提出背景很现实:既然单基站功率有限、覆盖范围小,那干脆就在热点区域密集部署大量小基站,让每个用户附近总有合适的服务节点。UDN的部署密度可以达到每平方公里上千个基站的程度,带来的问题也随之而来——站间干扰极其严重,单纯的波束成形如果不做干扰协调,性能反而会急剧恶化。这实际上引出了一个核心问题:在毫米波UDN场景下,如何利用用户的位置信息来辅助波束管理和大规模MIMO的预编码设计,从而在控制干扰的同时提升链路的可靠性。
链路级模型和干涉评估这两个词是仿真层面的描述。链路级仿真面向的是单条或多条链路,关注的是收发端之间的信号处理细节,比如调制编码方式、信道估计误差、波束赋形权值计算、信道均衡等,而不是网络级的资源调度或移动性管理。干涉评估在这里应该理解为英文interference evaluation的直译,指的是对这种带波束成形的链路在存在邻区干扰情况下的SINR分布、误码率、吞吐量等指标进行系统性的度量。
综合来看,本项目解决的痛点可以这样概括:传统毫米波波束成形通常依赖信道估计结果来设计权值,但在UDN的高动态场景下,信道估计开销大、反馈时延长,导致波束对准延迟严重。而位置感知波束成形则试图通过已知的用户位置信息(例如通过GPS、UWB、SLAM等方式获得)直接计算出发射角和接收角,从而大幅减少波束扫描和信道估计的开销,再配合干扰评估来验证这种方案在密集部署场景下是否真的能撑住链路质量。这对做5G物理层算法验证、波束管理协议设计以及系统级仿真平台搭建的人来说,都是有参考价值的。
1.2 这类项目到底适合谁学习、能用来做什么
从我的实际经验来看,这类带Matlab源码的通信仿真项目适合的人群很明确:
第一类是刚进入无线通信物理层算法岗的工程师和研究生。你可能会面临一个很尴尬的场景:学校里学的都是理想化的理论模型,但实际工作中要求你快速验证一个波束成形算法在特定信道模型下的性能表现,这时候一套能跑的链路级仿真代码就是最直接的抓手。你可以通过改参数、加干扰、替换信道模型来理解算法在不同条件下的行为差异。
第二类是做系统级仿真和标准提案预研的从业者。在3GPP RAN1会议上,很多公司提交的波束管理相关提案都需要用链路级或系统级仿真结果来支撑。位置感知波束成形恰好是Rel-18以后针对AI/ML辅助波束管理的一个重要研究方向,你如果在前期能用Matlab把这条链路跑通,后面再往系统级仿真平台(如NS3、Vienna 5G仿真器)迁移,会省很多力气。
第三类是准备毕业设计或竞赛论文的高年级本科生和研究生。这个方向非常适合作为课题:一方面它兼具理论深度和工程实操性,另一方面你可以在仿真平台上从参数配置、算法设计、性能对比三个维度展开论述,论文结构非常清晰。
这个项目能做的事情也很多。往下走,你可以基于它扩展出波束跟踪算法,因为位置信息是随时间变化的,怎么预测下一时刻的最优波束方向本身就是热点;往横向走,你可以把它改造成基于深度学习的位置感知波束预测框架,把Matlab生成的仿真数据用作训练集和测试集;往系统走,你可以把链路级结果作为输入,配合系统级仿真评估多用户调度下的网络吞吐量表现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统建模与核心原理详解
2.1 毫米波信道模型的数学表述与参数选择逻辑
在链路级仿真里,信道模型是整个系统的地基。毫米波信道的特殊性决定了我们不能直接沿用传统瑞利衰落信道的建模方式,而必须采用基于簇的几何信道模型。目前最常用的是3GPP TR 38.901中定义的IMT-2020信道模型框架,在Matlab中可以通过5G Toolbox直接生成,但如果你要自己手动实现以加深理解,它的核心表达式是这样给出的:
假设基站侧配置了Nt根发射天线,用户侧配置了Nr根接收天线,那么下行链路的信道矩阵H可以建模为:
[
H = \sqrt{\frac{N_t N_r}{N_{cl} N_{ray}}} \sum_{i=1}^{N_{cl}} \sum_{l=1}^{N_{ray}} \alpha_{i,l} \cdot a_r(\theta_{i,l}^r, \phi_{i,l}^r) \cdot a_t(\theta_{i,l}^t, \phi_{i,l}^t)^H
]
其中Ncl表示簇的数量,Nray表示每个簇内的射线数量,αil是第i个簇第l条射线的复增益,at和ar分别表示发射端和接收端的阵列响应矢量。θ和φ上的上标分别代表发射端离开方位角、离开俯仰角,以及接收端到达方位角、到达俯仰角。
对均匀线性阵列而言,发射端的阵列响应矢量可以写成:
[
a_t(\theta) = \frac{1}{\sqrt{N_t}} [1, e^{j\frac{2\pi}{\lambda}d \sin(\theta)}, e^{j\frac{2\pi}{\lambda}d \cdot 2 \sin(\theta)}, \dots, e^{j\frac{2\pi}{\lambda}d \cdot (N_t - 1) \sin(\theta)}]^T
]
如果在仿真里使用均匀平面阵列,则需要在x轴和y轴两个维度上分别计算导向矢量,然后取Kronecker积。
在做这套模型参数选择时有几个关键点你需要特别注意。第一个是簇和射线的数量配置。3GPP标准中室内热点场景一般是Ncl=12到20、每簇Nray=20到40,但在链路级仿真中如果全做完,计算复杂度会非常高,尤其是后面还要叠加波束成形和干扰计算。我的建议是仿真初期可以取Ncl=8、每簇Nray=10,先验证算法逻辑;等结果合理后再逐步加大簇数观察信道空间选择性对性能的影响。
第二个是角度扩展的分布模型。毫米波信道中每个簇的出发角和到达角不再是单值,而是在簇中心角度附近服从拉普拉斯分布,其标准差在3度到15度之间。这个角度扩展直接决定了信道的空间相关性,进而影响波束成形的性能上限。在UDN场景中,基站与用户之间的距离通常只有10到50米,此时角度扩展相对较大,你在设置仿真参数时不能照搬宏站场景下的角度扩展值。
第三个是路损模型。3GPP 38.901中定义了UMi(城市微蜂窝)和InH(室内热点)两类场景,毫米波频段下这两类场景的路损计算公式有差异。以UMi大街场景为例,NLOS情况下的路损可以用以下公式近似:
[
PL_{UMi-NLOS} = 32.4 + 21.0 \log_{10}(d_{3D}) + 20 \log_{10}(f_c) + \chi_\sigma
]
其中d3D的单位是米,fc的单位是GHz,χσ是阴影衰落余量,标准差通常取7.8dB。注意这个公式只适用于0.5米到1000米的距离范围,超过这个范围需要重新参考标准。
2.2 UDN部署场景中基站配置与干扰拓扑设计
在UDN场景下部署毫米波基站,关键是确定基站数量、用户数量、基站间距以及频谱复用方式。这个设计一定要贴近真实的密集组网形状,不然仿真出来结果缺乏工程意义。
参考3GPP TR 38.901中定义的UMi场景,通常采用六边形或网格状异构部署方式。在本项目中,我建议采用一个简化的多层UDN场景:在200米乘以200米的区域内随机或按网格部署16个毫米波微基站,每个基站覆盖半径为20到30米,系统带宽设为400MHz,载频设在28GHz。用户随机分布在站点覆盖范围内,每个用户关联到距离最近且满足信噪比门限的基站。
在UDN中,一个重要问题是相邻基站之间的干扰管理。由于毫米波波束比较窄,理论上波束间的空间隔离度比较好,但实际中当用户位于小区边缘时,相邻基站的大规模MIMO波束有可能指向同一个用户区域,这时候干扰就不可忽视。你的仿真场景里应该区分两种干扰场景:
一种是单用户场景下,只考虑服务基站对目标用户的信号和单个干扰基站的干扰信号,适合做算法的初步验证;另一种是多用户场景下,考虑多个干扰基站同时存在,并且每个干扰基站服务各自的用户,此时干扰结构更接近实际UDN运行状态。
在Matlab中,可以通过计算目标基站与用户之间的夹角、干扰基站与用户之间的夹角,利用天线方向图函数来获得有效的天线增益。为了更贴近真实毫米波系统的方向图特性,可以给基站配置大规模天线阵列,然后通过控制波束的指向来形成方向性增益,也就是说需要在仿真代码里把基站的发射天线阵列方向图模型写进去。通常取基站侧配置8乘8的均匀平面阵列,用户侧配置4乘4的均匀平面阵列。如果是更简化的场景,也可以只考虑水平面到达角和离开角,用均匀线性阵列来做初步评估。
频谱复用也是影响干涉评估结果的重要因素。在本项目中我建议采用全频率复用,即所有基站共享400MHz带宽,这样才能体现出干扰协调和波束成形的价值。如果你采用部分频率复用,尽管干扰降低了,但是每个基站可用带宽变少,系统容量的优势就不明显了。
以下是UDN仿真场景的一种典型参数配置,可以作为初始参考:
| 参数名称 | 取值 | 说明 |
|---|---|---|
| 载波频率 | 28 GHz | 毫米波典型频段,也适合扩展到39GHz |
| 系统带宽 | 400 MHz | 单载波带宽 |
| 子载波间隔 | 120 kHz | 基于参数集numerology 3的设计 |
| 基站数量 | 16个 | 部署在200m乘200m区域内 |
| 用户数量 | 16到64个 | 每个基站服务1到4个用户 |
| 基站发射功率 | 33dBm到40dBm | 微基站功率等级 |
| 基站天线阵列 | 8乘8均匀平面阵列 | 水平和垂直方向都可以扫描 |
| 用户天线阵列 | 4乘4均匀平面阵列 | 也可用1乘4线性阵列简化 |
| 调制方式 | QPSK到64QAM | 自适应调制编码 |
| 信道模型 | 3GPP 38.901 UMi | 包含LOS/NLOS概率转移 |
在实际的代码实现中,你需要先用函数生成基站和用户的位置,再根据位置信息计算所有基站和用户之间的距离、角度,然后才能生成信道矩阵并计算波束成形权值。位置信息的处理在这个场景中非常关键,因为它同时决定了三个核心要素:路径损耗大小、信道空间方向、以及波束成形权值的计算依据。
2.3 位置感知波束成形的原理与相比传统方法的优势
波束成形的本质是根据信道状态信息来调整天线阵列各阵元的相位和幅度加权,使电磁波在目标方向上形成主瓣。
那么位置感知波束成形和传统的基于信道估计的波束成形有什么本质区别呢?传统方式依赖于导频信号进行信道估计,获得完整的信道矩阵后再计算预编码矩阵,在FDD系统中用户还需要把信道信息反馈给基站,这个过程引入的开销和时延都很大。在高动态的UDN场景中,用户移动、基站密集,信道变化速度很快,传统的估计-反馈-预编码流程往往跟不上信道变化,导致波束对准误差增大。
位置感知的思路是另一个维度:既然基站和用户的位置都可以高精度获取,为什么不直接由位置信息推算收发端的角度呢?发射端根据基站坐标和用户坐标算出信号应该沿哪个方向发射,接收端根据接收信号的到达方向来完成波束对准。这样省去信道估计和反馈的环节,只需要周期性更新位置信息,就可以维持波束方向正确。
从英文文献角度看,位置感知波束成形的专用术语叫做location-aware beamforming,在5G毫米波系统中通常与beam tracking结合起来使用,适用的定位方案包括GPS实时动态测量、UWB室内定位、5G自身定位参考信号等。3GPP Rel-16引入了定位参考信号,Rel-17又针对定位精度做了进一步增强,所以在实际网络中是可以用通信链路本身完成位置感知的,并不完全依赖外部定位系统。
位置感知波束成形在UDN场景里有三个明显优势。第一个是开销低。传统波束管理需要周期性做波束扫描,NR里的SSB波束扫描在初始接入阶段要扫完所有候选波束,开销和时延都大。而位置感知方案可以用位置信息直接缩小波束搜索空间,甚至直接计算出最优波束,把扫描开销降到最低。
第二个是对准精度高。在毫米波频段,阵列孔径较大、波束宽度很窄,传统扫描方法受限于候选波束粒度,可能无法对准最优方向。而位置信息配合高精度阵列响应计算,可以实现波束指向的精确匹配。
第三个是抗干扰能力强。在一个已知波束方向信息的多基站协同场景中,可以通过空间协调合理规划不同基站的波束方向,避免多个强信号同时照射同一个用户形成严重干扰。这种方案在密集组网中比单纯的每个基站独立波束扫描要可靠得多。
需要特别提醒的是,位置感知波束成形并不是在所有场景下都能取代传统信道估计方法。它的性能上限取决于位置精度:如果定位误差大于波束主瓣宽度的一半,则波束对准误差就会迅速恶化。在28GHz频段、8乘8阵列的条件下,半功率波束宽度大约在10到15度之间,也就是说定位角度误差要控制在5到7度以内,这基本相当于在50米距离上定位精度需要达到4到6米左右,还是可以实现的。把位置不确定度的建模直接嵌入仿真里有两种做法:一种是在计算角度时叠加高斯随机误差,另一种是把定位误差建模为用户实际位置周围一个圆盘内的概率分布,然后通过蒙特卡洛方式考察算法平均性能。
3. 位置感知波束成形算法设计与Matlab实现方案
3.1 整体仿真链路架构与核心函数划分
链路级仿真平台的搭建,重点是模块划分清晰、每段功能可以单独验证。基于我以往的项目经验,一个结构合理的毫米波链路级仿真平台应该分成参数初始化模块、场景生成模块、信道生成模块、波束成形模块和性能统计模块。
具体的模块功能划分可以参考下面这个结构:
matlab复制% ChannelSim_UDN_LocationBeamforming.m
% 主控制模块
% 功能:加载参数,生成场景,调用各处理模块,最后统计性能
clear; close all; clc;
rng(42); % 设置随机种子,保证实验结果可复现
%% 步骤一:加载仿真参数配置
params = configUDNParams();
%% 步骤二:生成UDN网络拓扑(基站位置、用户位置)
[bsPos, userPos, bsIdx] = generateUDNTopology(params);
%% 步骤三:根据位置信息计算角度/距离并生成信道
[channel, angleInfo] = generateMmWaveChannel(params, bsPos, userPos, bsIdx);
%% 步骤四:设计位置感知波束成形权值
[wf, wr] = designLocationBeamforming(params, angleInfo);
%% 步骤五:加入多小区同频干扰,计算SINR和BER
[sinrVal, berVal] = evaluateLinkPerformance(params, channel, wf, wr, bsIdx);
%% 步骤六:可视化与结果导出
plotResults(sinrVal, berVal, params);
主控模块遵循标准的顺序执行逻辑:先配置参数,再生成场景拓扑,第三步生成信道,然后是波束成形,最后评估性能并画出结果图形。这样的好处是各个阶段相互独立,你可以只改动拓扑生成函数来测试不同的场景布局,而不需要动后续的波束成形函数。
参数配置文件configUDNParams需要集中定义几乎所有可以调整的物理参数,方便实验中进行批量修改。它的核心内容如下:
matlab复制function params = configUDNParams()
params.fc = 28e9; % 载波频率 28GHz
params.bw = 400e6; % 系统带宽 400MHz
params.scs = 120e3; % 子载波间隔 120kHz
params.numSCs = 4096; % FFT点数
params.numBS = 16; % 基站数目
params.numUsers = 32; % 用户数目
params.areaSize = 200; % 仿真区域边长 200m
params.numTxAnt = [8 8]; % 基站阵列维度 8x8
params.numRxAnt = [4 4]; % 用户阵列维度 4x4
params.numClusters = 8; % 信道簇数
params.numRays = 10; % 每簇射线数
params.txPower = 33; % 基站发射功率 dBm
params.noiseFigure = 7; % 用户接收机噪声系数 dB
params.posErrSigma = 1.0; % 位置感知误差标准差 米
params.modOrder = 4; % 调制阶数 4=QPSK
params.numFrames = 20; % 仿真帧数
params.snrRange = -10:5:30; % 扫描信噪比范围 dB
end
这里有个容易疏忽的位置:参数配置中posErrSigma是位置感知误差的标准差,这个值对波束成形的效果影响很大。如果设为0,就是理想的位置感知;如果设得很大,相当于是靠非常粗略的估计做波束方向预测。这个模块值得单独测试,因为它是本项目研究的核心,也是链路级仿真区别于传统方案的明显特征。
3.2 UDN场景生成与位置信息计算
UDN场景生成模块最重要的事情就是保持几何关系的正确性。要确保所有后续角度计算都是基于真实坐标完成的,而不是在生成信道的时候临时随机去取角度,否则整个位置感知逻辑就有问题了。
matlab复制function [bsPos, userPos, userBSIdx] = generateUDNTopology(params)
% 在正方形区域内均匀部署基站
gridLen = sqrt(params.numBS); % 按网格排列基站
gridPos = linspace(10, params.areaSize - 10, gridLen);
[X, Y] = meshgrid(gridPos, gridPos);
bsPos = [X(:), Y(:)]; % 基站坐标矩阵
% 每个基站有numUsersPerBS个用户
numUsersPerBS = round(params.numUsers / params.numBS);
userPos = zeros(params.numUsers, 2);
userBSIdx = zeros(params.numUsers, 1);
userCount = 0;
for bsIdx = 1:params.numBS
for uIdx = 1:numUsersPerBS
userCount = userCount + 1;
% 用户随机分布在该基站覆盖半径内
r = 8 + 15 * rand; % 随机距离 8~23米
theta = 2 * pi * rand; % 随机角度
userPos(userCount, :) = bsPos(bsIdx, :) + r * [cos(theta), sin(theta)];
% 防止位置超出仿真区域
userPos(userCount, :) = min(max(userPos(userCount, :), 5), params.areaSize - 5);
userBSIdx(userCount) = bsIdx;
end
end
end
生成基站之后,需要计算每个用户关联到的目标基站,以及该目标基站到用户的水平距离、垂直距离、水平离开角、竖直离开角。在位置感知波束成形中,这些角度被当作权重设计的依据:基站的发射阵列在这里需要提供准确的方位角和俯仰角信息,用户在接收端也是根据位置信息调配自己的接收波束方向。
计算用户与其服务基站之间角度的函数可以写成一个独立模块,这个模块是位置感知算法的最核心部分。它的准确度直接决定了后面权值计算质量的高低。
matlab复制function angleInfo = computeAngles(bsPos, userPos, bsIdx)
numBS = size(bsPos, 1);
numUsers = size(userPos, 1);
angleInfo = struct();
angleInfo.aod_az = zeros(numUsers, 1); % 离开方位角
angleInfo.aod_el = zeros(numUsers, 1); % 离开俯仰角
angleInfo.aoa_az = zeros(numUsers, 1); % 到达方位角
for uIdx = 1:numUsers
bsIndex = bsIdx(uIdx);
dx = userPos(uIdx, 1) - bsPos(bsIndex, 1);
dy = userPos(uIdx, 2) - bsPos(bsIndex, 2);
dz = 0; % 默认同一水平高度
% 水平距离,用于计算方位角
dist2D = sqrt(dx^2 + dy^2);
dist3D = sqrt(dist2D^2 + dz^2);
% 基站到用户的离开方位角
angleInfo.aoa_az(uIdx) = atan2(dy, dx);
% 离开俯仰角,如果考虑高度差异则非零
angleInfo.aoa_el(uIdx) = atan2(dz, dist2D);
% 用户到基站的到达方位角(简化为相差pi)
angleInfo.aoa_az(uIdx) = angleInfo.aoa_az(uIdx) + pi;
end
end
在基站与用户之间存在高度差的情况下,必须在角度中添加俯仰角的计算。这也是为什么配置中建议用均匀平面阵列而不是均匀线性阵列的原因——均匀平面阵列可以在方位和俯仰两个维度同时调波束方向,适应室内外密集场景中不同高度的站址差异。在实现3D波束成形时,发射权值需要在两个维度上做Kronecker积,接收则同理。
3.3 毫米波信道生成与位置误差注入
信道生成模块要做的最重要事情,就是保证所有空间角度和复增益的生成规则都符合物理传播规律,同时还要加入位置误差。这一块的完整代码量比较大,核心思路如下:
matlab复制function [channel, angleInfo] = generateMmWaveChannel(params, bsPos, userPos, bsIdx)
numUsers = size(userPos, 1);
numBS = size(bsPos, 1);
% 1. 计算理想位置下的角度信息
angleInfo = computeAngles(bsPos, userPos, bsIdx);
% 2. 对角度信息注入位置误差(模拟实际定位不准)
if params.posErrSigma > 0
posErr = params.posErrSigma * randn(numUsers, 2);
userPosEst = userPos + posErr;
angleInfoEst = computeAngles(bsPos, userPosEst, bsIdx);
else
angleInfoEst = angleInfo;
end
angleInfoEst.trueAOA = angleInfo.aoa_az; % 存真实到达角用于评估
% 3. 生成信道矩阵
% 为每个用户保存它与所有基站之间的信道(方便后续算干扰)
channel = cell(numUsers, numBS);
for uIdx = 1:numUsers
for bsIter = 1:numBS
% 只有服务基站对应的信道需要细致生成
% 干扰基站信道可以降复杂度处理
h = generateSingleChannel(params, bsPos(bsIter, :), userPos(uIdx, :), bsIter == bsIdx(uIdx));
channel{uIdx, bsIter} = h;
end
end
end
关于位置误差注入,更严谨的做法是对每个用户生成一组蒙特卡洛随机位置样本,分别计算每个样本对应的方向和信道,最后在接收端合并考察不同误差样本下算法的误码率分布。但如果仿真时间有限,可以采用简化的方式:把位置误差转换为角度误差直接叠加在角度信息上。由于角度和位置之间存在非线性关系(要用反正切算),对位置误差做统计处理更符合实际场景,且对后续波束指向误差的刻画更真实。
单链路信道生成函数generateSingleChannel中需要根据距离决定视距或非视距状态。在毫米波频段,LOS和NLOS信道特性差异巨大,需要分开处理。工程上比较常用的一种做法是根据2D距离生成LOS概率,UMi场景下50米距离的LOS概率大约为0.5到0.7,UE在20米距离时大概率是LOS。在仿真中可以用随机数先判断LOS还是NLOS,然后分别调用不同的路损与角度参数配置。
在阵列响应生成时,需要把方向角和俯仰角同时考虑进去。以均匀平面阵列为例,假设天线在x方向排了N1个阵元,间距为dx,在y方向排了N2个阵元,间距为dy,那么对于离开方位角θ和俯仰角φ,阵列响应矢量的第(p,q)个元素可以表示为:
[
a_{p,q}(\theta, \phi) = \exp(j \frac{2\pi}{\lambda} (p d_x \sin\theta \cos\phi + q d_y \sin\phi))
]
其中p从0到N1减1,q从0到N2减1。将这个二维阵列响应拉成列向量后,就可以用于后续的权值计算。
3.4 位置感知波束成形权值计算与波束指向校准
位置感知波束成形权值计算在本项目中用到的是发射端根据位置估计出方位角和俯仰角后,直接用阵列导向矢量进行相位共轭匹配,这样做等同于构造了确定性波束,使得波束主瓣对服务用户方向增益最大。它的本质是一种最大比发射的简化空间形式,数学上写成:
[
w_{BS}(u) = a_t(\theta_u^{est}, \phi_u^{est})
]
其中au是估计出来的离开角。用户端的接收权值可以相应配置为到达方向的导向矢量,通过保持与实际信道主分量匹配来获得阵列增益。实现上可用如下函数来完成:
matlab复制function [wf, wr] = designLocationBeamforming(params, angleEst)
numUsers = size(angleEst.aoa_az, 1);
numBS = size(params.bsPos, 1);
% 为每个用户准备发射和接收权值
wf = cell(numBS, numUsers); % wf{bsIdx, uIdx}
wr = cell(numUsers, 1);
for uIdx = 1:numUsers
% 接收端权值:根据估计到达角
aoaAz = angleEst.aoa_az(uIdx);
aoaEl = angleEst.aoa_el(uIdx);
wr{uIdx} = UPA_array_response(params.numRxAnt, aoaAz, aoaEl);
% 发射端权值:只计算服务基站对用户的波束
bsServing = angleEst.servingBS(uIdx);
aodAz = angleEst.aod_az(uIdx);
aodEl = angleEst.aod_el(uIdx);
wf{bsServing, uIdx} = UPA_array_response(params.numTxAnt, aodAz, aodEl);
end
end
这里有一个对毫米波系统性能影响非常大的细节:对于均匀平面阵列,如果仅垂直放置线性阵列,只能在水平或垂直某一维度调节波束方向,无法在空间任意方向对准。所以用均匀平面阵列计算导向矢量时要小心排列顺序,保证向量拼接的顺序和后续信道矩阵的阵元排列顺序一致,否则信道增益计算结果是错的。
在实际编写导向矢量函数时,可以采用如下代码生成水平维度和垂直维度的Kronecker积:
matlab复制function arrayResp = UPA_array_response(arrayDim, azAngle, elAngle)
% arrayDim = [numElX, numElY]
Nx = arrayDim(1);
Ny = arrayDim(2);
d = 0.5; % 阵元间距,半波长
% 均匀平面阵列按x-y顺序摆放
rowX = (0:Nx-1).';
rowY = (0:Ny-1).';
phaseX = exp(1j * 2 * pi * d * rowX * sin(elAngle) * cos(azAngle));
phaseY = exp(1j * 2 * pi * d * rowY * sin(elAngle) * sin(azAngle));
arrayResp = kron(phaseY, phaseX) / sqrt(Nx * Ny);
end
在毫米波频率下,阵元间距通常取半波长,这样可以避免产生栅瓣,同时保证阵列孔径足够大以获得较高方向增益。若阵元间距大于半波长,方向图会出现多个波束主瓣,降低方向选择性,这在UDN干扰场景中会造成难以预测的冲突。
但是位置感知给出的波束方向是基于几何关系的理想方向,实际信道中NLOS径可能来自完全不同的方向。因此一个新的问题是:如果用户处于非视距环境,直接用位置感知做相位对齐是否会失效?答案是会,需要结合空间波束搜索和跟踪方法进行修正。常见方案是:先用位置感知得到一个较窄的候选波束集合并完成初始对准,再通过少量导频符号在候选波束集合范围内进行精细跟踪和校准。这种结合策略也被称为position-aided beam tracking,是目前文献里比较主流的研究方法。在本项目中,如果你做的是简化链路级仿真,可以在LOS概率较高的场景下,仅用位置感知权值,也能达到较好的效果;NLOS概率高的场景建议在方案对比中加入基于信道估计的权值作为参照。
3.5 链路性能评估中的干涉计算与SINR统计方法
链路级评估的重点之一是干扰计算。对于目标用户u,假设其关联基站为b0,同频干扰基站编号为b1到bK,那么接收信号可以建模为:
[
y_u = \sqrt{P_{b_0}} g_{b_0,u}^H w_{b_0,u} s_u + \sum_{k=1}^{K} \sqrt{P_{b_k}} g_{b_k,u}^H w_{b_k,u_k} s_{u_k} + n_u
]
这里的gbu表示从干扰基站bk到用户u的信道矩阵,wbk,u是干扰基站对它所服务的uk用户的发射权值,su是目标用户信号。公式中第一部分为目标信号,第二部分是所有同频干扰基站的干扰信号之和,第三部分为噪声。
有了信号模型,就可以直接推导SINR。经过接收合并后,SINR的通用形式为:
[
\text{SINR}u = \frac{P |w_{r,u}^H H_{b_0,u} w_{b_0,u}|^2}{P_{\text{noise}} + \sum_{k=1}^K P_{b_k} |w_{r,u}^H H_{b_k,u} w_{b_k,u}|^2}
]
在这个计算过程中,干扰项的各分子项并非简单的随机变量,因为干扰基站的发射权值已经对准了它们各自的用户。然而对于目标用户来说,干扰信道的空间相关性较弱,所以干扰信号强度本质上取决于目标用户与干扰基站之间的相对位置和波束方向隔离度。这正是位置感知波束成形的一个显著优点:如果网络能够统筹调度,让相邻基站波束方向错开,则干扰可以被大幅抑制。
从代码角度来实现SINR的计算,需要遍历每个用户,对它的服务基站信号和所有干扰基站信号分别完成一次信道矩阵、发射权值、接收权值的乘积运算。在Matlab中需要注意一种常见的性能陷阱:如果你通过多级循环去扫描大维度信道矩阵,运行时间会非常长,尤其是毫米波信道矩阵尺寸较大且参与干扰的基站数量多时,如果每层循环重复分配矩阵,很可能会直接卡死。一个比较实用的思路是用矩阵批量计算替代循环递推,并在仿真中为每个信道只生成一次并缓存到内存中,后续计算发射权值或接收合并时不重复生成。
链路级误码率评估可以用简单方式:计算SINR后,根据调制方式查表得到理论误码率。比如QPSK在AWGN下的误码率近似公式为[
P_e \approx 0.5 \cdot \text{erfc}(\sqrt{\frac{\text{SINR}}{2}})
]
但如果你希望通过传输整个帧的比特数据来仿真真实的误码率,就需要在发射端加入调制、加扰、信道编码(可选)、波束成形加权,接收端做逆处理并统计错误比特数。通常这类物理层链路仿真在中高信噪比区间运行速度较慢,因为要逐帧做多径信道和所有收发处理,消耗时间较多。综合考虑下,建议先用信号级SINR统计方式获得初步的SINR累积分布函数曲线,再选取几个典型信噪比点做具体误码率仿真校验。
4. 链路级仿真核心结果与调参经验
4.1 三种链路方案的性能对比与图谱分析
在完成一个可运行的仿真原型之后,我强烈建议把三套方案放在一起做基准对比:理想信道估计波束成形、位置感知波束成形(无误差)和位置感知波束成形(含定位误差)。只看单个方案的绝对性能,你会很难判断算法好坏。只有放在同一个坐标系里对比,才能发现位置感知方案的性能边界在哪里。
如果实现正确,结果趋势应该满足这样几个规律:
第一,理想信道估计方案在低信噪比时性能不错,因为它在每个快照都精确匹配信道,能获取全部多径增益;但它的开销是隐含的,没有纳入误码率评估。如果想体现这个开销,可以在有效吞吐量计算公式中扣除导频和反馈开销的占比。
第二,理想位置感知方案在高信噪比时非常逼近理想信道估计方案,因为绝大多数能量集中在视距主径方向上,位置感知可以直接对准主径。此时两者的性能差异主要源于NLOS径上丢失的可利用能量。
第三,含定位误差的位置感知方案在信道稀疏、误差较小时性能接近零误差情形,但当定位误差增大到一定临界值后,曲线会出现明显的平台效应或突然坍塌。你可以扫描posErrSigma从0.5米到10米的范围,绘制不同误差条件下吞吐量的曲线,用来确定位置感知方案的误差容忍门限。这类结果在写论文或者技术报告中非常有说服力。
在Matlab中画图时,建议使用半对数坐标来显示BER曲线,横轴用SNR或SINR,纵轴采用log10形式的BER。在毫米波链路中,信噪比跨越范围很大,从负值一直到30dB以上,采用线性坐标几乎看不清低信噪比区间的差异。使用semilogy函数会更直观。
绘制SINR累积分布函数曲线时,还可以对比多个布点方案。UDN场景下性能不仅取决于算法,还取决于网络拓扑和用户分布。固定基站网格位置、随机用户分布,和全部随机分布引起的极端干扰场景,结果差异还挺大。建议仿真时至少统计多条运行结果取平均,才能得出统计稳定的结论。
4.2 影响仿真结果的关键因素与调参优先级
在做这类链路级仿真时我常会遇到一个困惑:结果与文献对不上。假设所有代码逻辑都推导正确,再审视参数配置,往往会发现问题出在过于理想化或过于简化的某些前提上。
下面列出四个非常影响最终结果的调参优先级:
第一位是信道LOS概率和NLOS径的功率占比。毫米波信道中NLOS径与LOS径的功率差可达15到25dB。如果你在配置中把NLOS的簇功率设得过高,位置感知算法的优势会被削弱。反过来如果强制所有链路都是LOS,那算法的适用面又太假。建议在生成信道时,把每个簇的功率归一化到总功率为1,并且LOS场景下第一个簇分配大约60%以上能量,NLOS场景则平均分配各簇能量。
第二位是天线阵列大小和阵元间距。这个参数直接决定波束宽度和能够获得的最大阵列增益。8乘8阵列相比4乘4阵列有9dB的额外增益,对链路预算影响极大。如果你发现仿真结果里SNR很高但性能没有预期好,先检查阵列导向矢量是否归一化,以及发射端与接收端阵列尺寸是否匹配。
第三位是位置误差分布。位置误差在仿真中有两种典型的错误设置方式:一种是把角度误差直接设置成固定值,而不是由位置误差推算,另一种是位置误差的标准差没有转换为水平面上的距离误差,导致方位角和距离估计不一致。正确的做法是直接在用户水平坐标上叠加高斯误差,然后由含误差的位置重新计算角度,这样误差反映在角度上才是真实可信的。
第四位是基站的发射功率和噪声系数设置。如果你想做的是小区边缘干扰评估,发射功率不应设得过低导致噪声主导;但过高则可能因为基站间干扰增强而掩盖算法的增益。一般建议先固定SNR=15dB附近的区域,做单基站无干扰测试,验证基本的链路性能无误后,再加入完整干扰场景做对比。
4.3 干涉评估中典型的三种干扰抑制效果验证方法
干涉评估的最终目的是验证算法是否能够有效抑制UDN场景中的多基站同频干扰,以及系统整体覆盖性能是否满足设计要求。在实际操作中,可以用三种不同方法来从不同角度验证算法效果:
方法一:遍历目标用户的SINR并绘制累积分布函数曲线。对比有无干扰两种场景下的CDF,如果加干扰之后中位SINR下降超过8到10dB,说明UDN场景的干扰非常严重。之后叠加波束成形算法,观察CDF曲线是否向无干扰场景回移。特别是在CDF=5%到10%对应的边缘用户端点上,曲线回移越明显,说明算法对小概率覆盖事件改善越好。
方法二:针对特定用户做波束方向图可视化,观察目标方向的增益和干扰方向的天线增益凹陷。你可以用Matlab的pattern或自定义方向图绘制代码,将8乘8均匀平面阵列的方向图画成热力图。当地面部署16个基站时,所选用户可以同时受到多个干扰基站的入射干扰,从图上可直观看到天线分别在目标方向和干扰方向上的实际增益差异。如果你的算法是真正有效的,那么干扰方向上的等效增益应该比目标方向低20dB甚至更多。
方法三:逐步增加干扰基站个数,比如从1个增加到15个,观察系统平均吞吐量或误码率的退化趋势。位置感知波束成形和没有距离信息的固定全向发射方案,在这种退化测试中的差异会逐渐拉开——如果位置感知有效,曲线应该呈缓坡下降,而固定全向方案会呈悬崖式下跌。这类扫描图作为论文插图或者汇报图都非常受欢迎,因为它直观展示了密集组网条件对系统性能带来的变化。
4.4 源码调试与运行提速的实战技巧
Matlab仿真平台有一个普遍痛点:毫米波多用户多基站信道生成和波束成形矩阵计算的运算量非常大,经常一跑就是几个小时。下面几个技巧可以让你省下大量无用等待时间。
优先使用预分配和数据缓存。许多用户写循环时习惯在循环内部动态拼接数组或创建新矩阵,Matlab每次都会重新分配内存,这种写法在矩阵规模变大以后会急剧变慢。在代码开始前,先用zeros或cell预分配所有生成数据的存储空间。
将信道生成改成批量矩阵运算。信道生成中,簇和射线的循环可以改成将所有簇、射线的角度和功率一次性生成,然后采用矩阵kron操作算阵列响应。当簇数在8个、每个簇10条射线的规模下,循环往往不是瓶颈,但随着天线阵列增大,每次循环计算导向矢量的成本可能会线性增长。采用矩阵化方式重写导向矢量计算的核心部分,往往能将整体运行时长缩短一半以上。
蒙特卡洛外层循环不要放在最大的全参数扫描循环内部。比如要把误码率仿真结果平均20次,同时又扫描16个SNR点,直接写三层嵌套循环会非常耗时。更合理的方式是让内层循环负责多个频点或用户之间相对独立的计算,外层循环只做统计平均。如果某个用户数很大,可以先选择固定少量用户位置而把重点放在信道快照的随机性上,也就是说减少每轮位置重生成次数,增加多信道快照的迭代次数,这样可以用较少的仿真时长获得具有统计意义的性能结论。
在许可情况下使用并行计算工具Parallel Computing Toolbox,用parfor替代部分独立循环。注意parfor不适合用在有依赖关系的迭代中,比如不能在所有random变量都需要严格重现的场合下直接用。正确做法是最外层每个蒙特卡洛循环用不同随机种子分别跑多个随机数流,然后把各worker的结果汇总求平均。
把调试阶段的循环次数设小。在正式跑大批量数据前,先设numFrames=2、SNR点数为3,快速确认代码没有报错、数组尺寸匹配、结果趋势合理,再逐步增加。任何仿真工程都适用这条经验,一次设置过大的参数出现bug,排查起来会非常痛苦。
4.5 中断恢复与波形级仿真扩展方向
如果你需要在更复杂的波形级参数下运行物理层仿真,例如验证OFDM调制解调、信道编码和资源映射对基带波形的影响是否满足性能需求,可以将已有的信号级SINR评估流程升级到基带波形仿真。相比信号的符号级计算,波形级仿真是需要逐子载波生成OFDM调制信号,再经过多径信道进行卷积,并在接收端做同步和均衡。它的优点是能够真实评估信道估计误差、相位噪声、非线性功放等多种损伤对系统的影响,缺点是运算量大幅增大。
实际项目中,建议先用源码自带的简单模型完成系统概念验证,再根据需要逐层添加复杂度。如果你的目标是写论文,结论通常建立在一定规模蒙特卡洛仿真的基础上;如果你的目标是出原型样机或接入更上层的网络级仿真平台,建议用Matlab内置的5G Toolbox做完整的波形级仿真,调用nrDLSCH、nrOFDMModulate等现成函数。但是这样引入的Toolbox依赖会更强,不具备通用Matlab环境时可能无法运行。
中断恢复这个技巧本身是一个值得单独拿出来讲的经验。假设你的蒙特卡洛循环已经跑了一半,因为停电或系统内存不足中断了,当你修改参数重新启动时,总时长会被浪费掉。在代码里做成断点保存的机制可以大幅提高长期实验效率:每完成一组配置或一个SNR点,就把当前中间变量保存到本地文件,并设置总进度计数,重启后直接跳到未完成的部分继续运行。实现起来只需在循环末尾加一句save语句,同时在函数开头增加判断是否恢复现场的逻辑。
这种断点续跑方案对于长时间仿真任务非常有效,我在跑大场景多用户毫米波仿真时几乎默认就会加上这个机制。因为毫米波信道生成和矩阵运算耗时远超你的预期,一次全参数仿真可能要执行几个小时到十几个小时,如果中途崩溃却无存档,损失甚至超过代码本身出错。
4.6 结果可视化的核心思路与出图规范
判断仿真结果有没有价值的直观方式,是有没有一套完整且高效的图表来呈现它。在链路级仿真中,常规出图对象有三类,我建议在写作或汇报时都覆盖到。
第一类是覆盖性能类图表,用SINR累积分布函数和调制编码方式对应的吞吐量来描述。用户分布在一个区域内,处于不同位置时SINR差异非常大,如果只报一个平均SINR,意义有限。较好的做法是统计用户SINR的CDF曲线,同时标出CDF为5%和50%对应点,可对覆盖范围和用户中位性能做定量描述。
第二类是方向图类图表,做波束成形项目时建议画几张平面阵列3D方向图。用一个服务用户、两个干扰用户和一个目标用户的情形,将目标方向、干扰方向和最终天线增益注释在图上,这种图非常直观,一眼能看出波束是否准确指向目标。Matlab中可以使用自定义函数计算阵列因子,然后使用surf或pcolor画图,也可以借助phased.ArrayGain等系统对象来画方向图。
第三类是性能对比图表,通常是BER-SNR曲线或吞吐量-SNR曲线。这条曲线需要包含理想信道估计、理想位置感知、含误差位置感知等几个参照方案,并且需要覆盖多个调制编码方式档位。在实际画图时,需要特别仔细处理横纵坐标的单位和量程设置,线宽和点型要区分清楚,否则在论文或汇报场景中会显得不够专业。
出图建议保持矢量格式储存,Matlab中可以用exportgraphics或print命令导出为PDF或EPS格式,这类格式在插入论文文稿时不会因缩放而失真。
4.7 本项目可扩展的四个方向
链路级验证项目天然具有很好的扩展空间。如果你的论文或工作汇报需要进一步深化或拓展,可以从下面四个方向中选择一种进行延伸:
第一,在算法端扩展:把位置感知波束成形与基于深度学习的波束预测结合起来。用Matlab生成包含位置、速度、历史波束索引和标签的大型数据集,再用深度神经网络预测最优波束索引。这类研究思路在5G-A以及未来标准化预研中很受欢迎,而且容易出对比效果良好的实验图。
在实际代码中,Matlab本身提供了深度学习工具箱,可以对全连接网络和卷积网络进行训练。但真正困难的不是训练代码本身,而是如何把无线信道的时序特征映射为神经网络输入输出空间。建议先用位置坐标和位置变化值作为输入特征,输出最合适的波束索引;后续再加入接收信号强度、到达时间等辅助特征以提高预测准确率。
第二,在系统架构端扩展:将链路级结果映射到系统级仿真。在NS3的毫米波模块中,每一条链路同样需要底层信道的SINR输入。你可以把链路级仿真得到的SINR统计结果做成查找表,接入NS3的mmWavePhy模块。这个方法能显著提高系统级仿真效率,同时又保留物理层算法的精度特征,是很多做系统级性能评估的人会优先考虑的做法。
第三,在定位感知端扩展:对位置感知中定位误差来源建模得更准确。将基站测量得到的到达角、到达时间观测量直接作为输入,在仿真中通过对观测量做最小二乘解算来估计用户坐标,相比直接叠加位置误差的做法更接近真实定位流程。定位本身就需要结合信道环境建模,因此你在生成信道的同时也能得到到达时间量测,这能形成一个闭环。在定位误差不是简单高斯分布而是存在非视距偏差时,这种建模方式更能体现误差对波束成形的真实影响。
第四,在多用户调度端扩展:将单用户位置感知波束成形升级到多用户MIMO场景。在每根射频链路对应的波束数量约束下,通过用户调度和配对来最大化系统总吞吐量。当一个基站服务多个用户时,选择哪些用户在同一时频资源上被调度,直接决定空间复用增益和用户间干扰程度。位置信息在这里可以用来预测不同用户之间的空间隔离度,依此构造用户配对准则,这是一个非常实用的增强方向。
5. 常见问题排查与Matlab工程化心得
5.1 代码运行过程中的典型报错与解决方法
这个项目的源码虽然已经封装好功能模块,但是在你修改参数或自行扩展算法时,还是很容易踩到一些典型的坑。下面把我在调试类似通信仿真项目时最常遇到的几个问题整理成一张速查表。
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 矩阵维度不一致导致运行报错 | 阵列响应向量长度与信道矩阵维度不匹配,通常是因为发射阵列和接收阵列维度的排列顺序搞混 | 在函数入口处打印size信息进行核对,让发射天线数与UPA_array_response返回值保持一致 |
| BER曲线随SNR增加反而抬升 | 位置误差值设置得过大会导致波束指向偏移严重,也可能是因为发射权值和接收权值没有归一化,导致信号功率起伏异常 | 检查位置误差的标准差范围,检查positionError是否在合理的米级范围内;对权值做单位功率归一化 |
| 仿真运行太慢 | 多层for循环中做了重复的大型矩阵生成,或者蒙特卡洛循环数量过大 | 预分配输出数组,将无依赖的循环改成矩阵运算,或使用parfor并行。减小暂时不必要的信道簇数、帧数先验证逻辑 |
| 没有干扰时性能很好,加入干扰后崩溃 | UDN干扰基站的发射权值没有正确归一化,或者干扰信道矩阵与干扰基站索引对应混乱导致把服务基站的信号也算进干扰 | 打印干扰链路的平均接收功率,确认干扰信号的功率低于目标信号功率。检查每个用户关联基站索引的一致性 |
| parfor并行结果和串行结果不一致 | 在for循环内部使用随机数生成器但没有为每个迭代设置独立随机流 | 为每个循环迭代单独设置随机器,或者使用带有RandStream的并行随机数生成方式,保证并行执行结果可复现 |
在编写Matlab的过程中,矩阵维度问题最为常见,其次是复共轭和转置操作使用出错。在毫米波信道公式中,导向矢量通常是列向量,信道矩阵在计算时通常写为H,维度为Nr乘Nt,因此接收信号的计算要特别注意转置符号的使用。Matlab中默认的转置是共轭转置,如果忘记了转置运算符的区别,会导致相位信息反转,在接收端表现为信号抵消。可以考虑使用round(angle(wr_u * H * wt_u) / pi),检查相位对齐是否正确;如果相位在0附近说明对齐是对的,如果接近正负π则说明发射权值或接收权值中存在某个共轭方向错误。
5.2 复现结果之前的必备检查清单
无论你是想验证Matlab源码自带的仿真结果,还是打算在源码上做二次开发,建议先按下面清单逐项核对,并在每项之前检查是否存在遗漏:
-
仿真随机种子是否固定。如果你的实验必须可复现,在主运行脚本最前面把rng设置固定下来。但需要注意做蒙特卡洛平均时更合适的方式是每个批次给不同种子然后汇总结果,而不是所有仿真都使用同一组随机数。
-
仿真带宽和子载波间隔是否匹配。早期测试中,采用的带宽太宽导致每条子载波上噪声功率分布与理论预期不一致是一个常见问题。比如400MHz带宽搭配120kHz子载波间隔时,应有超过3000个子载波在传数据;若FFT点数设置过小,子载波间隔就不符合参数配置的预期。
-
天线阵列维度和天线位置编号顺序是否清晰。均匀线阵和均匀面阵的响应向量差别明显,如果你使用8乘8平面阵列却在后续加权时把它当成64维线性阵列来用,需要在计算时统一按矩阵行索引或列索引顺序展开,否则信号方向会出现错误。
-
是否需要考虑极化建模。3GPP信道中极化与天线方向特征会对毫米波信道产生影响,但常规单极化天线平面阵列可以忽略这部分。若你后续加了双极化天线,就需要把信道矩阵维度翻倍,并且在发射权值、接收加权中都增加极化维度处理。
5.3 将仿真代码迁移到更高版本或替代平台的注意事项
一些用户的Matlab版本可能与源码开发的版本不同,打开程序时出现函数不存在或Toolbox缺失的情况都时有发生。在检查程序前先输入ver命令查看已装的工具箱列表。这个代码所依赖的核心工具箱大致有Signal Processing Toolbox、Communications Toolbox和Phased Array System Toolbox;Parallel Computing Toolbox主要用于加速并非必需。如果你使用的是Matlab 2023a及以上版本,API接口更丰富,但也可能产生一些新版本特有的函数命名冲突问题。建议先用which命令检查每个关键函数路径,看是否存在用户自建函数名与工具箱函数重名的情况。
如果你的工作环境不允许使用商业Matlab,可以尝试用Octave做基本语法兼容,但需要放弃大量工具箱函数。在迁移到Python方向时,需要重构数据结构,用NumPy来实现矩阵乘法,信道生成可以考虑接入开源的Sionna仿真框架,但整体代码重写成本很高。
5.4 我总结的几个实操经验
把这类毫米波UDN链路级仿真项目完整做下来以后,我有一些体会可以分享。
定位误差设置并不是越小越好,虽然误差小意味着位置感知精度更高,但零误差的仿真结果在论文中容易被审稿人质疑场景模型缺少实际意义。你的实验结论中应明确说明算法在不同误差等级下的适用边界。当定位误差达到8到10米时,位置感知波束成形性能可能退化到与固定方向波束接近甚至更差的程度。这并不代表算法不好,而说明算法的应用场景有明确的范围要求。
在做SINR和BER的折中分析时,SINR的均值和中位数差异往往能揭示很多隐藏问题。如果在高SNR区间内BER曲线出现错误平层,那么大概率是导频污染或干扰结构模型过于简单导致的。UDN场景中涉及多基站的情况下,非常建议在高SNR区间多做几步蒙特卡洛采样,而不是只采少量样本。高信噪比的误差平层结果恰恰是判断干扰模型正确性的关键依据。
另外关于量化结果是多次平均还是单次运行,我的建议是仿真结果的有效性取决于独立随机实验的数量,而不只是循环模拟次数。你在代码中建议把随机基站位置一并纳入蒙特卡洛循环,这比固定布站只换信道要更能代表典型UDN特征的统计结论。如果因运算时间限制无法运行上千次,也至少要保证100次以上的位置采样和500次以上的信道快照,才能让收益和误码率的置信区间有意义。
