☰
MATLAB宏小区覆盖仿真:定向天线增益与路径损耗建模实践
2026/9/28 1:16:36 网站建设 项目流程

简介:这份资源是北京邮电大学移动通信仿真与规划课程设计实验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,主瓣方向会向下压,近处覆盖增强,远处覆盖减弱。这个变化在覆盖图上表现为暖色区域向基站收缩。你可以把不同下倾角的覆盖图放在一起对比,写进拓展实验报告。

从那以后我每次跑覆盖仿真,都强制先检查三个东西:距离单位、角度范围、天线增益是否真的生效。这三项确认了,后面基本不会出大错。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询