ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MATLAB宏小区覆盖仿真:定向天线增益与路径损耗建模实践

MATLAB宏小区覆盖仿真:定向天线增益与路径损耗建模实践 简介这份资源是北京邮电大学移动通信仿真与规划课程设计实验2的配套材料面向通信工程、电子信息等专业修读该课程的学生以及需要完成宏小区覆盖仿真实验的读者。内容围绕定向天线增益仿真与宏小区覆盖实验展开包含可直接运行的源程序与完整实验报告帮助读者理解站点选址、天线增益计算、路径损耗建模等关键环节。压缩包共8个文件以7个m脚本文件和1份docx实验报告为主脚本覆盖主流程与各功能模块报告则记录实验过程与结果分析整体约2.92MB结构清晰便于对照学习。目前已有511人学习下载说明该实验在校内具有一定参考价值。读者可借助源码复现宏小区覆盖流程结合报告梳理实验思路并在此基础上完成拓展实验与报告撰写适合作为课程设计参考与仿真入门练习。1. 宏小区覆盖仿真到底在算什么从定向天线增益到小区边界做移动通信网络规划时宏小区覆盖是绕不开的第一道坎。很多人以为覆盖就是拿个半径画个圆但真实网络里基站天线不是全向灯球它是有方向性的——定向天线在水平面和垂直面都有增益方向图主瓣方向增益高旁瓣和背向增益低。北京邮电大学这门移动通信仿真与规划课程设计的实验2核心就是让你用 MATLAB 把定向天线增益算出来再叠加上路径损耗最终得到宏小区的覆盖效果。这套资源包含完整的源程序main.m、main1.m、main2.m、GetBestSite.m、GetBinGain.m、GetBinGainmultiple.m、GetPathLoss.m和一份移动网络报告.docx适合通信工程专业学生、刚入行做无线网络规划的新人以及想用 MATLAB 复现覆盖仿真流程的工程师。它解决的不是“怎么调天线”这种现场问题而是让你在电脑上把覆盖预测的完整链路跑通一遍理解每个参数背后的物理意义。2. 定向天线增益与路径损耗仿真链路的两块基石2.1 天线增益为什么要分水平面和垂直面定向天线的增益不是一个标量而是随方向变化的函数。工程上通常把三维方向图拆成水平面方向图和垂直面方向图分别用两个函数描述然后通过角度关系合成总增益。实验里的 GetBinGain.m 和 GetBinGainmultiple.m 就是干这个的。GetBinGain 处理单个天线GetBinGainmultiple 处理多天线或者多扇区的情况。为什么要这么拆因为宏小区通常用三扇区站型每个扇区一个定向天线水平面半功率波束宽度常见 65 度垂直面下倾角可以电调或机械调。如果你把天线当成全向的覆盖预测会严重偏离实际——主瓣方向覆盖远旁瓣方向干扰大这些都得靠方向图函数来体现。常见做法是先定义水平面增益函数比如用高斯近似或者查表插值再定义垂直面增益函数同样处理最后根据终端相对基站的方向角查两个面的增益相加得到总增益。代码里一般会有一个角度转弧度的步骤因为 MATLAB 的三角函数默认用弧度。这里容易翻车的地方是角度范围水平面通常取 -180 到 180 度垂直面取 -90 到 90 度如果输入角度超出范围插值会外推结果可能离谱。2.2 路径损耗模型怎么选、参数怎么设路径损耗是覆盖仿真的另一块基石。实验里的 GetPathLoss.m 应该实现了某种传播模型常见的是 COST-231 Hata 模型或者自由空间加修正项。宏小区覆盖场景下COST-231 Hata 用得比较多因为它适用于 1500 MHz 到 2000 MHz 频段、小区半径 1 到 20 公里的情况。公式里涉及频率、基站高度、终端高度、距离、以及城市修正因子。参数设错一个覆盖半径能差出好几公里。我一般会先确认频段。如果实验报告里写的是 2.6 GHz那 COST-231 Hata 就不太适用了得换其他模型或者用自由空间加经验修正。但北邮这个实验大概率用的是经典模型因为课程设计重在流程不在最新频段。GetPathLoss.m 里应该有一个距离向量然后逐点算损耗。注意距离单位公式里通常用公里但代码里可能用米需要除以 1000。这个单位换算坑每年都有学生栽进去。2.3 主程序怎么串起来main.m 的调用逻辑main.m 是入口它一般做几件事定义仿真区域、生成基站和终端位置、调用天线增益函数、调用路径损耗函数、计算接收功率、判断是否覆盖、最后画图。main1.m 和 main2.m 可能是不同场景的变体比如单基站和多基站或者不同天线配置。GetBestSite.m 从名字看是选最佳站点可能是根据覆盖或者容量准则挑基站位置。下面给一个典型的调用骨架你可以对照自己的 main.m 看结构% main.m 典型结构 clear; clc; close all; % 1. 参数定义 freq 2000; % 频率 MHz hb 30; % 基站天线高度 m hm 1.5; % 终端高度 m txPower 43; % 发射功率 dBm antennaGainMax 18; % 天线最大增益 dBi % 2. 生成网格 x 0:100:5000; % 水平方向 0 到 5 km步长 100 m y 0:100:5000; [X, Y] meshgrid(x, y); % 3. 计算距离和角度 dx X - 2500; % 假设基站位于 (2500, 2500) dy Y - 2500; dist sqrt(dx.^2 dy.^2) / 1000; % 转成 km azimuth atan2d(dy, dx); % 水平角度 % 4. 天线增益 gainH GetBinGain(azimuth); % 水平面增益 gainV 0; % 简化垂直面暂设 0 gainTotal gainH gainV; % 5. 路径损耗 pathLoss GetPathLoss(dist, freq, hb, hm); % 6. 接收功率 rxPower txPower antennaGainMax gainTotal - pathLoss; % 7. 覆盖判断 threshold -100; % 接收灵敏度 dBm coverage rxPower threshold; % 8. 画图 figure; imagesc(x, y, rxPower); colorbar; title(接收功率分布 dBm);这段代码的逻辑说明先定参数再生成网格然后算每个网格点到基站的距离和水平角。天线增益函数接收角度向量返回增益向量。路径损耗函数接收距离向量和频率、高度参数返回损耗向量。接收功率等于发射功率加天线最大增益加方向性增益减路径损耗。最后用阈值判断覆盖。参数说明freq 影响路径损耗斜率hb 和 hm 影响修正项txPower 和 antennaGainMax 决定覆盖半径的基准。如果你把 freq 从 2000 改成 900同样距离下损耗会小一些覆盖会变大。阈值 -100 dBm 是常见参考实际系统可能用 -110 或 -105取决于业务类型。提示跑 main.m 之前先确认所有子函数都在当前工作目录或者 MATLAB 路径里。缺一个函数报错信息可能指向奇怪的地方。3. 从源码到覆盖图一步步复现实验流程3.1 环境准备与文件检查拿到压缩包后先解压。里面应该有实验2宏小区覆盖.zip 本身、实验2_宏小区覆盖文件夹、移动网络报告.docx、以及一堆 .m 文件。把 .m 文件全部放在同一个文件夹里用 MATLAB 打开这个文件夹作为当前工作目录。MATLAB 版本不用太新R2016a 以上基本都能跑因为代码里大概率没用新语法。检查一下有没有拼写错误的函数名比如 GetBinGainmultiple 这种长名字少个字母就找不到函数。常见做法是先在命令行敲which GetPathLoss看 MATLAB 能不能找到。如果返回 not found说明路径不对。另一个检查点是看 main.m 里有没有硬编码的文件路径比如load(C:\Users\...\data.mat)这种要改成相对路径或者注释掉。3.2 运行 main.m 并解读第一张覆盖图直接运行 main.m。如果一切正常会弹出一个或多个图窗。第一张图通常是接收功率分布用 imagesc 或者 surf 画的。颜色越暖表示功率越高越冷表示越低。你会看到基站附近功率高远处功率低而且因为定向天线主瓣方向明显比旁瓣方向覆盖远。如果图是圆的说明天线增益没起作用可能 gainH 全是 0检查 GetBinGain 的输入角度是不是没传对。第二张图可能是覆盖判决图用黑白或者二值显示。白色表示覆盖黑色表示不覆盖。这张图能直观看出覆盖盲区。如果盲区形状很奇怪比如出现同心圆环那可能是路径损耗函数里距离单位搞错了或者天线增益插值出了问题。3.3 调整参数观察覆盖变化实验报告里通常会要求做拓展实验比如改变天线倾角、改变发射功率、改变频率看覆盖怎么变。你可以手动改 main.m 里的参数然后重新跑。比如把 txPower 从 43 改成 46覆盖半径会增大但增大幅度不是线性的因为路径损耗是对数关系。把天线最大增益从 18 改成 15覆盖会缩小。把频率从 2000 改成 2600同样距离损耗增加覆盖缩小。下面给一个参数扫描的代码片段可以一次跑多个功率值画在一张图上对比% 参数扫描不同发射功率下的覆盖半径 txPowerList [40, 43, 46]; colors {b, r, g}; figure; hold on; for i 1:length(txPowerList) txPower txPowerList(i); % 这里复用前面的距离和损耗计算 rxPower txPower antennaGainMax gainTotal - pathLoss; % 取主瓣方向azimuth 接近 0的一条线 [~, idx] min(abs(azimuth(1,:))); % 找水平角最接近 0 的列 plot(dist(:, idx), rxPower(:, idx), colors{i}, LineWidth, 1.5); end xlabel(距离 km); ylabel(接收功率 dBm); legend(40 dBm, 43 dBm, 46 dBm); grid on;逻辑说明这段代码在同一个距离剖面上比较不同发射功率的接收功率曲线。参数说明txPowerList 是你要扫描的功率值colors 控制曲线颜色。注意 idx 的找法azimuth 是矩阵取第一行找最接近 0 的列这样得到的是主瓣方向的一条径向线。如果你直接取 dist 和 rxPower 的某一列可能不是主瓣方向对比就没意义。3.4 报告文档里该写什么移动网络报告.docx 是实验报告模板里面应该有实验目的、原理、步骤、结果、分析。你跑完代码后把生成的图截下来贴进去然后在分析部分写清楚参数变化对覆盖的影响。比如发射功率增加 3 dB覆盖半径大约增加多少这个可以从曲线上读。天线倾角变化对覆盖的影响可以通过修改垂直面增益函数来模拟。报告里不要只贴图要写清楚你改了什么参数为什么这么改结果符合什么预期有没有意外。注意报告里的图要有坐标轴标签和标题不然扣分。MATLAB 画图时加上 xlabel、ylabel、title别偷懒。4. 避坑与排查那些年我们跑仿真翻过的车4.1 现象运行 main.m 报错“未定义函数或变量 GetBinGain”原因MATLAB 当前工作目录不是 .m 文件所在目录或者函数文件名和调用名大小写不一致。MATLAB 在 Windows 上不区分大小写但在 Linux 上区分如果你在 Linux 跑GetBinGain 和 getbingain 是两回事。解决用cd命令切换到 .m 文件所在目录或者把目录添加到路径addpath(你的路径)。然后which GetBinGain确认能找到。如果还不行检查文件名是不是有空格或者特殊字符。4.2 现象覆盖图是全向的圆形没有方向性原因GetBinGain 返回的增益全是 0或者主程序里根本没调用天线增益函数直接把 gainTotal 设成了 0。也可能是角度计算错误比如用 atan 而不是 atan2d导致角度范围不对插值全落在旁瓣。解决在 main.m 里加一行disp(range(gainH))看增益范围。如果范围是 0说明函数没起作用。检查 GetBinGain 内部看它是不是根据输入角度查表或者计算。如果是查表确认角度向量和表的角度范围匹配。常见错误是表里角度是 -180 到 180但输入角度是 0 到 360导致插值全在边界外。4.3 现象路径损耗出现负值或者异常大原因距离单位搞错。公式里距离用公里代码里传了米损耗算出来偏大或者距离用米公式里当公里损耗偏小甚至负值。另一个原因是频率单位公式里用 MHz代码里传了 Hz。解决在 GetPathLoss 里加断点或者打印中间变量。确认 dist 的最大值是不是合理比如 5 公里场景dist 最大应该是 5 左右如果是 5000那就是米。频率如果是 2000那就是 MHz如果是 2e9那就是 Hz。单位统一后再跑。4.4 现象多基站场景下 GetBestSite.m 选出的站点不合理原因GetBestSite 的准则可能是基于覆盖或者容量但输入参数没给对。比如它期望接收一个候选站点列表和终端分布但你只传了站点列表终端分布用了默认值导致选择偏差。解决打开 GetBestSite.m 看函数签名和注释。确认输入参数的维度和含义。常见做法是候选站点是 N×2 矩阵每行一个坐标终端分布是 M×2 矩阵。函数可能计算每个候选站点到所有终端的路径损耗然后选平均损耗最小的。如果你传的终端分布是空的它可能报错或者返回随机站点。4.5 现象报告里的图和代码跑出来的图不一致原因报告里的图可能是用不同参数跑的或者用了平滑处理。也可能是报告里的图是示意图不是真实仿真结果。解决以代码跑出来的图为准报告里写清楚你用的参数。如果报告模板里有示例图不要直接抄自己跑一遍。如果图看起来太粗糙可以加密网格比如把步长从 100 米改成 50 米图会更细腻但计算量增大。5. 进阶技巧用 main2.m 做多扇区对比与覆盖优化main2.m 通常是拓展实验的入口可能涉及多扇区或者不同天线配置的对比。我一般会用它来做一个事情固定基站位置分别跑三扇区和全向天线看覆盖差异。三扇区每个扇区水平面波束宽度 65 度朝向分别是 0 度、120 度、240 度。全向天线就是增益恒为 0 dBd 或者 2 dBi。跑完之后把两张覆盖图并排画出来能直观看到定向天线在小区边缘的覆盖优势以及扇区之间的重叠区域。具体操作复制 main.m 为 main_sector.m修改天线增益部分。对每个扇区计算终端相对该扇区的水平角然后调用 GetBinGain 得到增益。三个扇区的增益取最大值作为该点的总天线增益。这样模拟的是终端选择最强扇区的情况。代码片段如下% 三扇区增益合成 sectorAzimuth [0, 120, 240]; % 三个扇区朝向 gainTotal -inf(size(X)); % 初始化 for s 1:3 % 计算相对每个扇区的水平角 azRel azimuth - sectorAzimuth(s); % 归一化到 -180 到 180 azRel mod(azRel 180, 360) - 180; % 该扇区增益 gainS GetBinGain(azRel); % 取最强 gainTotal max(gainTotal, gainS); end逻辑说明对每个扇区先算终端方向与扇区朝向的夹角归一化到 -180 到 180 度然后查天线增益。三个扇区的增益取逐点最大值代表终端选择最佳扇区。参数说明sectorAzimuth 是扇区朝向常见三扇区是 0/120/240也可以根据实际站型调整。归一化那一步很关键不做的话角度可能超出函数定义域。跑完这个你可以再改一下下倾角。垂直面增益函数里通常有一个下倾角参数比如电下倾 6 度。把下倾角从 0 改到 6主瓣方向会向下压近处覆盖增强远处覆盖减弱。这个变化在覆盖图上表现为暖色区域向基站收缩。你可以把不同下倾角的覆盖图放在一起对比写进拓展实验报告。从那以后我每次跑覆盖仿真都强制先检查三个东西距离单位、角度范围、天线增益是否真的生效。这三项确认了后面基本不会出大错。希望帮到你。本文还有配套的精品资源点击获取
返回列表