首页/新闻资讯/正文详情

5G MIMO信道容量随距离衰减:MATLAB仿真源码拆解

发布时间:2026/9/26 14:01:47 来源:云帆数科 栏目:资讯中心
5G MIMO信道容量随距离衰减:MATLAB仿真源码拆解
简介面向5G通信系统设计与优化人员及通信专业学生一套研究通信距离对信道容量影响的仿真源码提供了可直接运行的m文件实现。压缩包共8个m文件大小仅9KB覆盖多输入多输出多路复用、混合预编码、天线导向矢量、非视距路径损耗、氧气吸收等关键计算模块便于拆解和复用。目前已有144人学习下载。仿真以香农容量公式为基础结合自由空间衰减、多径衰落与毫米波传播损耗模型量化了距离增加对信噪比及信道容量的影响同时对比不同天线配置和功率控制策略下的容量变化。读者可以借助源码观察容量随距离衰减的曲线理解5G网络覆盖与速率的权衡并扩展自定义场景为实际部署和参数优化提供参考。1. 5G通信系统里信道容量随距离衰减这套仿真源码拆出了什么做5G链路预算或毫米波覆盖仿真的人大概率卡过同一个问题用户离基站10米和300米容量到底掉多少手算香农公式容易但路径损耗、氧气吸收、MIMO预编码增益、多径信道全压在一起手算不现实。这套仿真源码就是把“通信距离增加→SNR下降→信道容量变化”这条链路拆成8个可执行的m文件。源码里既有MIMO_Multiplexing、MIMO_HybridPrecoding这样的预编码实现也有getPathLossNLOS、Oxygen_Absorption损耗模型还有CDL-A信道下的平均容量统计。跑出来的结果就是一张MIMO信道容量图像横轴是距离纵轴是容量。照着这篇笔记的操作你能复现这张图并解释曲线形态。适合三类人做5G网络规划与物理层算法的工程师拿通信仿真做课程设计的研究生以及想快速拿到一条可信距离-容量曲线的从业者。这条线没走通之前后面所有优化讨论都是空中楼阁。2. 从香农公式到距离-容量曲线8个m文件在链路里分别干什么2.1 距离是怎么一口一口吃掉容量的先回到最基础的香农公式C B·log2(1 SNR)。容量对SNR是对数关系这意味着高SNR区间里再增加SNR容量收益很小而低SNR区间里SNR一旦下降容量会快速崩塌。所以距离-容量曲线天然不是一条直线而是“先平缓、后陡峭”的形态仿真要复现的就是这个拐点。距离的影响主要通过接收功率进入SNR。自由空间损耗是20log10(d)到了5G毫米波的非视距场景TR 38.901 UMi模型的路径损耗斜率变成36.7log10(d)左右也就是说同样翻一倍距离损耗多掉的dB数远大于低频段。再加上5G NR里大规模MIMO带来的是阵列增益和空间复用增益远距离时信道矩阵秩下降、条件数变差本来能并传4个流最后只能传1到2个流这比单纯SNR下降还致命。源码把损耗拆成多个独立文件是有道理的。路径损耗是一个距离相关的主项氧气吸收是另一个频率相关的附加项两者随距离的衰减机制不同。如果把全部损耗揉进一个函数里你很难判断曲线拐点到底是路径损耗主导还是MIMO复用能力退化主导。拆开之后每条曲线、每个中间量都能单独画出来验证这才是仿真的价值。2.2 文件职责与调用关系先看这套源码里8个m文件各自的位置我拆包之后按职责整理成下面这张表。文件名职责在链路中的位置SphericalUnitVector.m把到达角、离开角转成三维单位方向矢量所有阵列运算的最前端getSteeringVector.m根据方向矢量生成阵列导向矢量波束指向和预编码权重的基础Coupling.m计算天线阵元间互耦并修正幅相大阵列、小间距时修正导向矢量getPathLossNLOS.m计算非视距路径损耗距离进入SNR的主项Oxygen_Absorption.m计算毫米波频段氧气分子吸收损耗距离进入SNR的附加项MIMO_Multiplexing.m空间复用容量计算理论复用上限MIMO_HybridPrecoding.m混合预编码容量计算接近实际基站架构的实现AverageCapacityCDL_A.mCDL-A信道模型下统计平均容量最终输出距离-容量统计值调用顺序上常见做法是先由SphericalUnitVector生成方向矢量交给getSteeringVector得到BS和UE两侧的导向矢量再用Coupling对阵列互耦做修正。与此同时getPathLossNLOS和Oxygen_Absorption根据当前距离算出总损耗折算成等效SNR。之后分两条线走一条进MIMO_Multiplexing算空间复用上限一条进MIMO_HybridPrecoding算混合预编码下的实际容量最后都汇总到AverageCapacityCDL_A里做多次快照平均。2.3 先按骨架把链路跑通不要急着改参数先把这条链路用最小骨架跑通。我一般会新建一个空脚本按下面的顺序调一遍确认每个文件能正确输入输出% 最小链路骨架验证8个m文件能串起来 fc 28e9; % 载波频率 28GHz毫米波典型频段 d 100; % 通信距离 100米 snrBase 20; % 参考SNR 20dB % 1) 球面单位矢量确定信号到达方向 [az, el] deal(deg2rad(30), deg2rad(10)); % 方位角30度俯仰角10度 u SphericalUnitVector(az, el); % 以源码内签名为准 % 2) 生成BS侧导向矢量8行8列UPA阵列 aBS getSteeringVector(8, 8, u, fc); % 常见做法尺寸方向频率 % 3) 互耦修正0.5倍波长间距时建议开启 aBS_corr Coupling(aBS, 8, 8, 0.5); % 0.5为阵元间距比值 % 4) 距离损耗折算成等效SNR pl getPathLossNLOS(fc, d, false); % false表示NLOS o2 Oxygen_Absorption(fc, d); % 氧气吸收dB值 snrEff snrBase - (pl o2); % 等效SNR单位dB % 5) 打印关键量确认链路通 fprintf(路径损耗 %.2f dB氧气吸收 %.4f dB等效SNR %.2f dB\n, ... pl, o2, snrEff);这骨架的意义是把链路里最容易被忽略的“方向矢量→导向矢量→损耗→SNR”的顺序固定下来。参数说明fc用28GHz是NR n257/n258频段d取100米是室外微蜂窝典型覆盖点snrBase给20dB是为后续距离扫描留出足够的衰退空间。跑通后你应该看到路径损耗几十dB、氧气吸收非常小、等效SNR明显下降这代表距离已经真正进入了容量计算的链路。3. 跑通第一张图MIMO_Multiplexing与混合预编码的单点容量3.1 参数配置头载波频率、天线阵列、带宽怎么定仿真最怕参数随手填。距离-容量仿真里载波频率、阵列规模、带宽这三个参数直接决定曲线形态是否合理。我拆这套源码时的习惯是先把配置头单独列出来放在脚本最前面后面所有函数都引用这两个变量避免改一处漏一处% 统一参数配置头 fc 28e9; % 载波频率 28GHz对应5G NR毫米波频段 bw 100e6; % 信道带宽 100MHzNR标准参数集 nrBS [8, 8]; % BS侧天线阵列8行8列共64阵元 nrUE [2, 2]; % UE侧天线阵列2行2列共4阵元 dList 10:10:500; % 距离扫描范围10米到500米 nReal 200; % 信道实现次数平均容量用 snrRef 20; % 参考SNR单位dB参数说明BS侧选64阵元是5G大规模MIMO的典型配置低于这个规模空间复用优势不明显高于这个规模仿真耗时明显增加UE侧4天线对应手机终端常见配置。距离从10米起步是因为毫米波覆盖半径通常就在几百米量级500米之后NLOS场景下SNR往往已经低到容量接近零。nReal取200是保证平均容量稳定性与耗时的折中想要曲线平滑可以加到500。3.2 导向矢量与球面单位矢量波束方向是怎么进信道的MIMO容量计算不是简单给信道矩阵加个SNR就完事。BS侧和UE侧的导向矢量决定了波束指向而波束指向又决定了信道矩阵里每个元素的相位关系。这套源码里getSteeringVector.m和SphericalUnitVector.m承担的就是这个职责。% 生成BS侧和UE侧的导向矢量 azBs 30 * pi/180; elBs 10 * pi/180; % BS侧角度 azUe -20 * pi/180; elUe 5 * pi/180; % UE侧角度 uBs SphericalUnitVector(azBs, elBs); uUe SphericalUnitVector(azUe, elUe); aBs getSteeringVector(nrBS(1), nrBS(2), uBs, fc); aUe getSteeringVector(nrUE(1), nrUE(2), uUe, fc); % 互耦修正阵元间距0.5倍波长时耦合最强 aBs Coupling(aBs, nrBS(1), nrBS(2), 0.5);导向矢量的物理含义是在某个来波方向上各个阵元因为空间位置不同接收到信号的相位差不同这些相位差构成的向量就是导向矢量。getSteeringVector本质上在算每个阵元相对参考点的时延差。互耦修正则是告诉你不修正的结果大阵列小间距时相邻阵元会互相耦合实际幅相比理论值偏出去好几个dB在高SNR区间不明显在远距离低SNR区间会被放大。3.3 距离循环与等效SNR计算单点容量验证通过后把距离写进主循环。这里我建议不要改动MIMO_Multiplexing.m内部而是把距离损耗换算成等效SNR再传入这样既保住了源码原始逻辑又让距离变量只在一个地方控制% 距离循环计算不同距离下的MIMO空间复用容量 capMimo zeros(size(dList)); for k 1:length(dList) d dList(k); pl getPathLossNLOS(fc, d, false); % NLOS路径损耗单位dB o2 Oxygen_Absorption(fc, d); % 氧气吸收单位dB snrEffLin 10^((snrRef - pl - o2) / 10); % 等效线性SNR capMimo(k) MIMO_Multiplexing(nrBS, nrUE, bw, snrEffLin, nReal); end % 绘图距离-容量曲线 figure; plot(dList, capMimo / 1e6, b-o, LineWidth, 1.5); xlabel(通信距离 (m)); ylabel(信道容量 (Mbps)); title(MIMO空间复用容量随距离变化); grid on;这段代码的核心逻辑是“损耗进SNRSNR进容量”。每个距离点上先算路径损耗和氧气吸收叠加后从参考SNR里扣掉得到等效线性SNR再交给MIMO_Multiplexing做容量计算。MIMO_Multiplexing内部常见做法是生成一组独立同分布的瑞利信道对信道矩阵做SVD后按奇异值分配功率最后统计平均容量。你不需要读懂它每一行但要知道输出单位是bps所以绘图时除以1e6转成Mbps。3.4 混合预编码跑出来和复用上限差多少MIMO_Multiplexing给的是理论复用上限实际基站不可能做到每根天线一个独立射频链成本控制不住。真正落地的是MIMO_HybridPrecoding.m它把预编码拆成模拟域和数字域两级模拟部分用移相器只调相位不调幅度数字部分在基带维度做精细处理。代价是模拟预编码码本有限波束指向精度受限。% 对比运行同一距离下复用上限 vs 混合预编码 capHybrid zeros(size(dList)); for k 1:length(dList) d dList(k); pl getPathLossNLOS(fc, d, false); o2 Oxygen_Absorption(fc, d); snrEffLin 10^((snrRef - pl - o2) / 10); capHybrid(k) MIMO_HybridPrecoding(nrBS, nrUE, bw, snrEffLin, nReal); end hold on; plot(dList, capHybrid / 1e6, r-s, LineWidth, 1.5); legend(空间复用上限, 混合预编码);两条曲线放一起看是有信息量的近距离处两者差距可能在20%到30%因为模拟预编码的量化相位误差吃掉了一部分阵列增益远距离处两者差距会缩小因为此时容量受限于SNR而非预编码精度波束方向准不准已经不是瓶颈。如果你发现远距离处混合预编码反而超过复用上限基本可以断定代码里某个环节把天线增益算了两次这个我在第5章会展开。4. 把距离写进信道路径损耗、氧气吸收与CDL-A平均容量4.1 NLOS路径损耗模型从自由空间到TR 38.901第2章提到自由空间损耗只有20log10(d)但5G毫米波实际部署几乎都是非视距所以源码里专门有getPathLossNLOS.m。这套模型按TR 38.901 UMi场景的常见写法是PL 26·log10(fc_GHz) 36.7·log10(d_m) 22.7其中fc以GHz为单位d以米为单位。和自由空间公式对比距离项系数从20涨到36.7说明同样的距离翻倍NLOS路径损耗多衰减约11dB。这就是毫米波覆盖半径天然短的根本原因不是频率高穿透差这么一句能概括的而是数学上损耗斜率本身变陡了。% 手动计算并对比两种模型 d 50:50:500; % 距离向量 fcGHz 28; % 单位GHz plFs 20*log10(d) 20*log10(fcGHz) 32.4; % 自由空间参考 plNlos 26*log10(fcGHz) 36.7*log10(d) 22.7; % TR38.901 UMi NLOS figure; plot(d, plFs, --, d, plNlos, -); xlabel(距离 (m)); ylabel(路径损耗 (dB)); legend(自由空间, UMi NLOS);参数说明fcGHz必须先转成GHz单位再进log10这是最容易错的地方。你会发现500米处两种模型差了将近40dB这40dB落在SNR上就是容量从几百Mbps直接掉到个位数Mbps。如果你拿到的getPathLossNLOS.m里fc用的是Hz那调用前就要做单位换算否则曲线整体平移看起来有点像样实际上物理含义全错。4.2 氧气吸收哪些频段必须开哪些频段可以关氧气吸收是毫米波特有的损耗项来源是氧分子对电磁波能量的共振吸收。需要强调的是它的频率选择性极强。我在拆Oxygen_Absorption.m之后对照TR 38.901的典型数值整理了一份参考表频段氧气吸收典型量级仿真建议28GHz约0.01 dB/km量级几百米内影响极小可关39GHz约0.02 dB/km量级影响可忽略可关60GHz约15 dB/km量级必须开启强吸收峰73GHz约0.5 dB/km量级建议开启量级可见注意这张表的量级是每公里如果你的距离扫描范围只有几百米28GHz下氧气吸收累计起来不到千分之一dB画在容量曲线上完全看不出变化。这不是代码bug而是物理机制在这个频段本来就不显著。% 对比28GHz和60GHz的氧气吸收 dTest 0:50:1000; o2_28 Oxygen_Absorption(28e9, dTest); o2_60 Oxygen_Absorption(60e9, dTest); figure; plot(dTest, o2_28, -, dTest, o2_60, --); xlabel(距离 (m)); ylabel(氧气吸收 (dB)); legend(28GHz, 60GHz);如果你跑的是60GHz的仿真Oxygen_Absorption这个文件就是决定曲线形态的关键角色之一。近距离时氧气吸收小远距离时它叠加在路径损耗上让容量曲线出现更早的下跌拐点。如果你跑的是28GHz直接把这个函数的结果打出来看一眼确认它在合理范围然后放心忽略它的影响。4.3 CDL-A信道下的平均容量SVD加等功率分配路径损耗和氧气吸收解决的是“平均功率掉多少”但信道容量还取决于信道矩阵的结构。5G标准测试场景里CDL-A是城区微蜂窝非视距的代表性信道包含35个散射簇每个簇有独立的时延、角度和功率。AverageCapacityCDL_A.m的作用就是在这个信道模型下做多次快照统计% CDL-A信道配置与平均容量计算 cdl nrCDLChannel; % 5G Toolbox标准对象 cdl.DelayProfile CDL-A; % 标准非视距场景 cdl.DelaySpread 100e-9; % 100ns时延扩展 cdl.CarrierFrequency fc; % 和前面配置头保持一致 cdl.SampleRate bw; % 采样率不低于带宽 cdl.TransmitAntennaArray.Size [nrBS(1) nrBS(2) 1 1 1]; cdl.ReceiveAntennaArray.Size [nrUE(1) nrUE(2) 1 1 1]; cdl.Seed 7; % 固定种子便于复现 avgCap 0; for r 1:nReal [H, ~] cdl(); % 生成一次信道实现 H H / norm(H, fro) * sqrt(prod(nrBS) * prod(nrUE)); % 归一化 [~, S, ~] svd(H); % 奇异值分解 lambda diag(S).^2; % 特征值即各流功率增益 c sum(log2(1 snrEffLin / length(lambda) * lambda)); avgCap avgCap c; end avgCap avgCap / nReal * bw; % 平均容量单位bps这段代码有两个关键点。一是归一化CDL-A信道对象输出的信道矩阵幅度是随机的如果不做归一化每次运行容量都会波动很大距离的影响会被随机性掩盖。二是等功率分配这里没做注水而是把SNR平均分到每个空间流上这是5G系统级仿真的常见假设因为实际调度器不知道瞬时信道特征值。如果你想让结果更乐观可以改成注水算法但那需要额外的功率分配迭代。4.4 全链路脚本距离扫描到容量曲线一步到位把前面三节串起来就是一个完整的距离-容量仿真主程序。我把参数配置、损耗计算、信道生成、容量统计全部放进同一个循环这样每次改距离步长或者天线配置只需要改配置头% 全链路距离-容量扫描脚本 fc 28e9; bw 100e6; nrBS [8 8]; nrUE [2 2]; dList 10:10:500; nReal 200; snrRef 20; capCdl zeros(size(dList)); for k 1:length(dList) d dList(k); pl getPathLossNLOS(fc, d, false); o2 Oxygen_Absorption(fc, d); snrEffLin 10^((snrRef - pl - o2) / 10); cdl nrCDLChannel; cdl.DelayProfile CDL-A; cdl.DelaySpread 100e-9; cdl.CarrierFrequency fc; cdl.SampleRate bw; cdl.TransmitAntennaArray.Size [8 8 1 1 1]; cdl.ReceiveAntennaArray.Size [2 2 1 1 1]; cdl.Seed k; % 每个距离点换种子 avg 0; for r 1:nReal [H, ~] cdl(); H H / norm(H, fro) * sqrt(64 * 4); [~, S, ~] svd(H); lambda diag(S).^2; avg avg sum(log2(1 snrEffLin / length(lambda) * lambda)); end capCdl(k) avg / nReal * bw; end plot(dList, capCdl / 1e6, g-^, LineWidth, 1.5); xlabel(通信距离 (m)); ylabel(平均容量 (Mbps)); title(CDL-A信道下5G系统距离-容量曲线); grid on;跑完这张图你就得到了一个真正带信道统计特性的距离-容量曲线。和前面MIMO_Multiplexing的曲线对比CDL-A版本会更低更抖因为多径衰落让信道矩阵的条件数变差了。这也是这套源码最有价值的地方它让你同时看到理论理想边界和标准信道模型下的实际预期两者之间的差距就是信道特征带来的损失。5. 避坑记录跑距离-容量仿真时必须绕开的五个问题5.1 距离单位混用曲线前半段直接失形现象跑出来的容量曲线在近距离段异常陡峭10米到50米掉得离谱后面反而平缓跟理论上“先平缓后陡峭”的形态完全相反。原因getPathLossNLOS.m里的公式可能是按米写的但调用时传入了千米或者反过来。TR 38.901的公式里距离项是log10(d)单位错了不会报错但会让整条路径损耗曲线平移只是由于对数关系平移量固定导致近距离段相对变化被放大。我排查过一次问题就出在dList写成10:10:500但代码里偷偷乘了0.001把米变成千米。解决在配置头下面加一行断言强制检查距离量级。assert(all(dList 1), dList单位应该是米检查是否混入了km数值);我现在的习惯是第一次跑曲线之前先单独打印一个距离点的路径损耗值比如100米处应该落在100到130dB之间如果看到才30dB那一定是单位错了。5.2 CDL-A采样率不够容量被系统性低估现象CDL-A跑出来的平均容量比MIMO_Multiplexing低得离谱低到全距离段都接近零或者曲线形态正确但整体偏低20%以上。原因nrCDLChannel的SampleRate设置太低比如默认1.92MHz或者只按1MHz仿真带宽配。CDL-A信道包含35个簇每个簇有时延采样率不够时簇的时延分辨率不足信道抽头数量减少频率选择性丢失多径分集增益出不来。这属于典型配置错误不是源码问题。解决把SampleRate设置成信道带宽的两倍以上100MHz带宽至少要配200MHz采样率。如果跑的是带宽聚合场景SampleRate要按总带宽覆盖的最大频率范围来定。cdl.SampleRate max(bw * 2, 100e6); % 至少两倍带宽判断标准很简单把信道对象生成一次看输出H的列数是否接近带宽对应的时间抽头数如果少得离谱采样率一定低了。5.3 信道矩阵没归一化距离变化被SNR掩盖现象每个距离点的容量都有几十Mbps的随机抖动滤波都滤不干净或者不同距离点的容量平均值几乎一样距离的影响完全看不出来。原因从nrCDLChannel取出的H没有做功率归一化导致每次信道实现的增益随机浮动。更隐蔽的情况是代码里已经做了归一化但归一化因子写错比如用了sqrt(nrBS)而不是sqrt(nrBS * nrUE)结果64发4收的场景里信道增益被系统性放大SNR虚高距离损耗全被掩盖。解决用Frobenius范数归一化这是最常见也最稳的做法。H H / norm(H, fro) * sqrt(prod(nrBS) * prod(nrUE));这条做完你才真正让距离损耗单独决定容量变化。如果归一化前后两条曲线差异巨大说明问题就在这一行。5.4 氧气吸收在28GHz跑不出效果别急着怀疑代码现象开了Oxygen_Absorption和不开容量曲线完全重合很多人会以为函数写得不对。原因28GHz频段氧气吸收本来就只有每公里0.01dB量级仿真距离只有几百米时累积损耗不到0.001dB对SNR的影响完全可以忽略。这是物理事实不是代码缺陷。解决先判断你的频段是否需要这个损耗项。60GHz必须开28GHz和39GHz可以跳过73GHz建议开。我在拆包时会把Oxygen_Absorption单独拎出来画一条距离-损耗曲线确认它在目标频段的量级合理再用进主循环。o2Test Oxygen_Absorption(60e9, 0:50:1000); plot(0:50:1000, o2Test); % 60GHz下应能看到明显上升曲线如果在60GHz下这条曲线还是平的那才需要回头检查函数实现大概率是吸收系数查表范围写窄了。5.5 混合预编码远距离出现容量断崖不一定是bug现象MIMO_HybridPrecoding在近距离和MIMO_Multiplexing接近到某个距离点突然掉到几乎为零曲线不光滑。原因混合预编码的模拟部分用的是码本波束波束增益是量化后的离散值。随着距离增加SNR下降波束增益不足以补偿损耗等效SNR直接跌破解调门限容量进入“悬崖区”。这是混合预编码架构的真实特性尤其在码本波束数少的时候更明显。解决先确认不是代码数值问题可以把模拟预编码改成理想无量化波束赋形跑一次对比。如果理想波束没有断崖说明断崖来源于码本量化这是物理限制不是bug。% 对比理想波束与码本波束的等效SNR snrIdeal snrRef - pl - o2 20 * log10(sqrt(64)); % 理想阵列增益 snrCodebook snrRef - pl - o2 10 * log10(max(real(aBs))); % 码本增益那之后我看到混合预编码曲线上的断崖第一反应不是调代码而是先看码本里波束的数量和间距。波束越少断崖越早这是天线架构决定的和算法实现无关。6. 进阶把单点容量改造成参数扫描用条件数判断复用能力的边界6.1 三种配置的距离-容量叠加对比单条曲线跑通之后最有价值的一步是把理论复用上限、混合预编码、CDL-A统计容量三条曲线叠在一张图里。这三条曲线的间距就是你可以向别人解释的系统损失第一条到第二条的差距是预编码架构损耗第二条到第三条的差距是标准信道模型下多径和簇结构带来的额外损失。figure; plot(dList, capMimo / 1e6, b-o, LineWidth, 1.5); hold on; plot(dList, capHybrid / 1e6, r-s, LineWidth, 1.5); plot(dList, capCdl / 1e6, g-^, LineWidth, 1.5); xlabel(通信距离 (m)); ylabel(平均容量 (Mbps)); legend(空间复用上限, 混合预编码, CDL-A统计); grid on;观察重点放在两条曲线的交叉点。如果混合预编码在远距离接近甚至超过CDL-A统计值说明CDL-A信道下的秩损失比预编码量化损失更严重如果反过来说明当前天线配置下信道秩还够是预编码精度先触底。这个交叉点就是你做网络规划时决定“这个距离要不要换更小码本或更多射频链”的参考位置。6.2 用条件数判断空间复用能力容量是宏观结果条件数是微观解释。同一段距离下信道矩阵的条件数越接近1说明各空间流之间越独立复用能力越强条件数大于10的6次方量级基本可以判定复用已经失效只能走单流波束赋形。在AverageCapacityCDL_A的循环里顺手把条件数存下来比单独跑完再看曲线更省时间。% 在CDL-A循环内部记录条件数 condHAll zeros(1, nReal); for r 1:nReal [H, ~] cdl(); H H / norm(H, fro) * sqrt(prod(nrBS) * prod(nrUE)); condHAll(r) cond(H); end fprintf(距离 %d 米平均条件数 %.1f\n, d, mean(condHAll));条件数超过阈值时的结论是这段距离不适合做高阶空间复用应该转向单流波束赋形或者降低调制阶数。那以后我每次跑这类仿真都会把单位、采样率、信道归一化三个检查项写在脚本最前面先跑单点验证再扫描距离看到曲线异常先去查这三个地方而不是直接改仿真模型。这套源码的价值不在某个函数有多高级而是让你把从距离到容量这条链路上的每个环节都拆开看清楚。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

毫米波雷达非接触式生命体征监测技术解析
毫米波雷达非接触式生命体征监测技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 14:01:41

WeChatAppEx.exe与xweb_elf.dll故障深度解析
WeChatAppEx.exe与xweb_elf.dll故障深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 14:01:41

通义灵码2.0迈入Agentic AI:TaoToken统一Key接入与settings.json配置实战
通义灵码2.0迈入Agentic AI:TaoToken统一Key接入与settings.json配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 14:01:35

基于CLI的本地化LLM代码评审工作流实战
基于CLI的本地化LLM代码评审工作流实战

1. 这不是又一个“LLM玩具”,而是一套可落地的代码评审工作流 open-code-review 这个名字听起来像某个开源项目,但其实它代表的是一类正在快速成型的技术实践:用大语言模型(LLM)作为核心能力,嵌入到真实开发… · 2026/9/26 14:35:01

Atlas 300V 24G 推理卡部署 YOLOv5 实战:模型转换与调优指南
Atlas 300V 24G 推理卡部署 YOLOv5 实战:模型转换与调优指南

如果你身边有人突然丢过来一句“帮我看看 atlas 这个卡能不能跑 yolo”,大概率不是指那家做数据管理平台的公司,也不是某个拿人当数据表操作的 AI,而是华为昇腾生态里的 Atlas 系列推理设备。最近这个词在技术社区的热度明显上来了&#xff0… · 2026/9/26 14:35:01

Higgsfield实操指南:AI视频生成的可控工作流与参数调优
Higgsfield实操指南:AI视频生成的可控工作流与参数调优

我最早注意到Higgsfield,是去年底做短视频压力测试的时候。当时项目组临时要求三天内出一支产品宣传demo,传统渲染流程根本来不及,我几乎把所有能跑的AI视频方案都试了一遍。Higgsfield是最后跑通的那个,也是让我第一次觉得“文生… · 2026/9/26 14:35:01

YooAsset资源管理设计哲学:三态模式、Handle与热更新全解析
YooAsset资源管理设计哲学:三态模式、Handle与热更新全解析

在Unity项目里,资源管理大概是讨论热度最高、翻车率也最高的模块之一。AssetBundle怎么打、怎么加载、怎么卸载、怎么热更,每个项目都能讲出一段血泪史。YooAsset这个名字近两年在国内团队里越来越常见,很大一个原因是它把“资源管理”从一堆… · 2026/9/26 14:35:01

从0到1搭建AI Agent平台:核心架构、技术选型与工程实践
从0到1搭建AI Agent平台:核心架构、技术选型与工程实践

先给你讲个真实场景:上个月有朋友跑来问我,说团队每天要花两小时整理报表、回客服消息、写日报周报,问我有什么办法。我给他搭了一套 AI Agent 平台,现在他的“团队”里多了几个不用交社保的“同事”——一个盯着数据报表&#xf… · 2026/9/26 14:35:01

自建桌面通信型CRM系统:客户管理、多渠道整合与任务提醒实战
自建桌面通信型CRM系统:客户管理、多渠道整合与任务提醒实战

1. 项目概述:DeskcommCRM到底要解决什么先聊一个很多团队都绕不开的真实场景:客户在微信上问了一句“你们这个报价还能不能再低点”,负责接待的同事回复完就切去做别的事了,三天后老板问这个客户进展如何,谁都想不起来… · 2026/9/26 14:34:54

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码