简介:在无线通信与MATLAB仿真学习中,大尺度衰落模型用于刻画信号远距离传播时的路径损耗与阴影衰落,是网络规划、覆盖评估和系统性能分析的重要基础。资源内容围绕这一主题展开,既解释路径损耗的对数距离公式与路径损耗指数选取,也演示对数正态阴影衰落的生成逻辑,并给出参数设置、损耗计算、随机阴影叠加、结果绘图等完整流程,适合通信专业学生、算法仿真初学者及从事无线网络设计的技术人员参考。内容重点覆盖参考距离、路径损耗指数、阴影衰落标准差等关键参数,读者可按示例思路对照调整参数,观察不同环境下接收信号功率的变化趋势,加深对模型物理意义的理解。压缩包体积约59KB,文件总数统计为0项,当前未提供文件类型明细;已有1860人学习浏览。整体可作为大尺度衰落建模入门与MATLAB实操的补充材料,帮助读者理解信号强度随距离与环境的波动规律。
1. 无线信号越走越弱:大尺度衰落模型在描述什么
在无线网络规划里,最常被问的问题不是“用哪种调制方式”,而是“这个站到底能覆盖多远”。答案很大程度上由大尺度衰落模型决定:信号在几百米到几公里尺度上衰减多少,路径损耗和阴影衰落各自贡献几何。大尺度衰落模型用来描述远距离传输中环境因素造成的功率损耗,它不关心多径引起的毫秒级抖动,只关心“平均来看信号弱了多少”。这篇文章把这个模型拆开讲清楚——公式里每个参数怎么定、用 MATLAB 怎么仿真、仿真结果怎么落进链路预算,并把几个容易翻车的地方指出来。适合正在做网络规划、课程设计或无线信道仿真的工程师和学生,照着代码跑一遍,就能看到一条“越走越弱”的真实衰落曲线。
2. 模型的两块基石:路径损耗指数与对数正态阴影衰落
2.1 路径损耗:为什么 d0 和 n 比公式本身更值得较真
路径损耗是大尺度衰落里确定性最强的那部分。信号在自由空间传播时能量球面扩散,接收功率按距离平方衰减,换算成 dB 就是每增加十倍距离多衰减 20 dB。真实环境里地面反射、植被吸收、建筑绕射都会让衰减变快,于是工程上普遍采用对数距离路径损耗模型:
PL(d) = PL(d0) + 10 * n * log10(d / d0)这里 PL(d) 是距离 d 处的路径损耗,PL(d0) 是参考距离 d0 处的路径损耗,n 是路径损耗指数。它的物理含义很直观:在双对数坐标系里,路径损耗是一条直线,斜率由 n 决定,n 越大信号随距离恶化越快。
实际使用中,有两个参数比公式本身更值得较真。第一个是参考距离 d0,它不能随便定。室内场景常用 1 m,室外蜂窝宏站常用 100 m 或 1 km。d0 选得不同,PL(d0) 就不同,对应的模型参数也不能直接搬用。常见做法是:d0 处的损耗优先用实测值,没有实测数据时用自由空间路径损耗公式估算,即 PL(d0) = 20 * log10(4 * pi * d0 / lambda),lambda 是载波波长。
第二个参数是路径损耗指数 n。不少初学者以为 n 取 2 就是默认答案,但那个值只适合理想自由空间。城市环境的典型取值在 2.7~3.5 之间,密集城区可能到 3~5,室内有隔断的办公环境甚至到 4~7。原文示例代码里 n = 3.7,对应的是密集城区宏蜂窝场景,不算夸张。不同环境下的参考取值可以按下面这张表快速对齐:
| 环境 | 路径损耗指数 n | 备注 |
|---|---|---|
| 自由空间 | 2.0 | 理想传播,实际很少达到 |
| 城市宏蜂窝 | 2.7~3.5 | 开阔街区,建筑遮挡中等 |
| 密集城区宏蜂窝 | 3.0~5.0 | 高楼密集,绕射损耗严重 |
| 室内视距 | 1.6~1.8 | 波导效应,衰减反而慢 |
| 室内非视距 | 3.0~4.5 | 穿墙损耗主导 |
顺带提醒一句,公式里的 d / d0 是无量纲比值,d 和 d0 必须统一单位。我在评审代码时见过不少把 d 写 5(km)、把 d0 写 100(m),最后曲线歪到完全没法解释的情况。这类问题我放在第 4 章的避坑清单里展开。
2.2 阴影衰落:8dB 标准差不是随便拍的,它来自实测统计
路径损耗只能描述“平均意义上的衰减”,真正在固定距离测接收功率,会发现每次结果都不一样。同一位置附近来回移动几米,接收功率可能波动几个 dB;换了街区、过了山头,波动更大。这部分由建筑物、地形等大尺寸障碍物引起的慢变化,就是阴影衰落。
阴影衰落的标准模型是对数正态分布:接收功率的 dB 值围绕路径损耗预测值呈高斯分布。为什么偏偏是高斯?因为信号穿过遮挡物时,每一层遮挡都是乘性损耗,多个遮挡因子相乘后取对数,就变成多个随机量的求和,按中心极限定理自然趋向正态。数学上表示为:
received_power_dB = PL(d) + X_sigma, X_sigma ~ N(0, sigma^2)这里的 sigma 是阴影衰落标准差,单位是 dB。原文代码里取 std_dev = 8,这其实是一个有代表性的工程取值:城市宏蜂窝环境的阴影衰落标准差典型范围在 6~10 dB 之间,8 dB 对应中等偏密集的城区。郊区开阔环境可能只有 4~6 dB,室内复杂环境可能到 10~12 dB。换环境时,这个值必须跟着换。
阴影衰落还有两个容易被忽略的特性。第一,它在时间上是慢变的,秒级甚至分钟级尺度内基本保持不变,所以单次快照测量看到的就是一个固定的随机偏移。第二,它的空间相关性很强,两点距离几十米内功率偏移往往是正相关的,这也是为什么网络规划里常用位置余量(location margin)来处理它,而不是当作独立噪声逐点处理。和小尺度衰落(瑞利、莱斯)完全不同,大尺度衰落模型处理的是空间平均后的趋势,两者在仿真的时间尺度和统计口径上要分开。
3. MATLAB 实现大尺度衰落:从单次仿真到可复用函数
3.1 参数定义与路径损耗计算:先统一单位,再算对数
仿真第一步是把参数写清楚。这里我用一个贴近真实宏蜂窝场景的配置:n = 3.7,d0 = 100 m,d 从 100 m 到 5000 m 按 100 m 步进扫描。
% 大尺度衰落模型:参数定义与路径损耗计算 n = 3.7; % 路径损耗指数,密集城区典型值 d0 = 100; % 参考距离 (m),室外场景取 100 m PL0 = 0; % 参考距离处的路径损耗,先置 0 便于观察增量 d = 100:100:5000; % 距离向量,100 m 到 5000 m,步进 100 m % 对数距离路径损耗模型 PL = PL0 + 10 * n * log10(d / d0);这段代码里最关键的是 log10(d / d0) 这一项。d 和 d0 都是米,比值无量纲,数学上才成立。PL0 = 0 意味着当前算出来的是“相对于参考点的损耗增量”,不是绝对接收功率。这一点先记着,后面做链路预算时我们会把它替换成真实损耗。
注意一个细节:这里我把 d0 设成距离向量的起点。如果像原示例那样 d0 = 1000、d 从 100 开始,log10(d / d0) 会产生负值,数学上没错——距离小于参考距离时损耗自然小于参考损耗——但画图时曲线会出现一段“回升”,容易让读图的人误以为模型有问题。我一般习惯让 d0 等于距离扫描范围的最小值,或者干脆用 1 m 做参考距离,这样整条曲线都是正的损耗,展示起来更清爽。
3.2 阴影衰落合并与可视化:randn 缩放的物理意义
路径损耗是平滑曲线,加上阴影衰落才像实测数据。实现方式是用 randn 生成标准正态随机数,再乘以标准差 sigma。这一步的物理意义要讲清楚:randn 产生的是 N(0, 1) 分布,乘以 8 dB 后变成 N(0, 64),也就是标准差为 8 dB 的随机偏移;把这个偏移加到路径损耗上,就得到了均值为 PL(d)、方差为 64 的对数正态衰落接收功率。
% 阴影衰落:生成对数正态随机偏移 std_shadow = 8; % 阴影衰落标准差 (dB) shadowing = std_shadow * randn(size(d)); % 标准正态随机数缩放 % 接收功率 = 路径损耗 + 阴影衰落(dB 域相加) received_power = PL + shadowing; % 可视化对比 figure('Color', 'w'); plot(d / 1000, received_power, 'b-', 'LineWidth', 1.0); hold on; plot(d / 1000, PL, 'r--', 'LineWidth', 1.5); xlabel('距离 (km)'); ylabel('接收功率 (dB)'); legend('含阴影衰落', '仅路径损耗', 'Location', 'best'); grid on;运行后会看到蓝色曲线在红色曲线附近上下摆动,摆动幅度大致在 ±15 dB 以内。这条锯齿状曲线很容易让第一次跑的人产生“代码是不是写错了”的怀疑,其实它是随机抽样的正常表现:每次运行 randn 结果都不同,蓝色曲线的形状也会跟着变。如果希望结果可复现,需要固定随机种子,下面会细说。
还有一个常见口径问题:received_power 到底是什么。如果 PL0 = 0,它只是“相对参考距离的接收功率衰减量”;如果 PL0 是自由空间损耗、又加上发射功率和天线增益,它才代表真实的接收电平。仿真时可以把“相对值”和“绝对值”分开看,但画图、写报告时一定要标清楚,否则后面做链路预算容易把量纲搞混。
3.3 封装成函数:把单次脚本变成可复用工具
单次脚本跑通后,最值得做的一步是把核心逻辑封装成 MATLAB 函数。这样换环境、换频率、对比不同参数时,不需要改主流程代码,只改输入参数。
function received_power = large_scale_fading(n, d0, PL0, d, std_shadow) % 大尺度衰落模型仿真 % 输入: % n - 路径损耗指数,密集城区取 3~5 % d0 - 参考距离 (m),建议等于距离向量起点 % PL0 - 参考距离处的路径损耗 (dB),可以是自由空间损耗 % d - 距离向量 (m) % std_shadow - 阴影衰落标准差 (dB),城市宏蜂窝典型 4~10 % 输出: % received_power - 接收功率相对值或绝对值 (dB) PL = PL0 + 10 * n * log10(d / d0); shadowing = std_shadow * randn(size(d)); received_power = PL + shadowing; end调用方式很简单:
d = 100:100:5000; p = large_scale_fading(3.7, 100, 0, d, 8); plot(d / 1000, p);函数化的收益在跑参数扫描时特别明显。比如要看 n 从 2.5 变到 4.5 对覆盖的影响,只需在循环里反复调用这个函数,收集不同 n 下的接收功率曲线。注意 randn 在函数内部每次调用都会重新随机,所以做对比实验时要在主脚本最前面加一句 rng(2024) 固定种子,保证不同参数下的差异来自参数本身而不是随机噪声。
4. 大尺度衰落仿真避坑:五个最常翻车的现场
仿真本身不复杂,但这几年我帮人排查过不少衰落模型的异常结果,问题几乎都集中在下面五个点上。按“现象 → 原因 → 解决”的套路逐个说,建议对照自己的代码过一遍。
4.1 参数与代码层的坑:负数对数、单位混乱、参数不随环境变
第一个坑:d 从 0 或 1 开始,曲线先大幅下跌再缓慢上升。原因是对数距离模型只在 d >= d0 时成立,d 小于 d0 时 log10(d / d0) 是负值,路径损耗变成负的,看起来像“信号越走越强”。解决方法是把 d0 设为距离向量的起点,或对 d < d0 的数据直接截断,不让它们进入模型。
第二个坑:单位混乱。d 用 km 表示,d0 却填 100 m,比值变成 1/0.1,计算结果整体偏移,斜率也完全对不上。原因很简单,log10(d / d0) 要求上下同单位、比值无量纲。解决办法是统一到 m 或统一到 km,代码里加注释标明单位,运行前先检查 d(1) 和 d0 的数值大小是否在合理量级。
第三个坑:换了一个环境,仿真曲线几乎不变。原因是路径损耗指数 n 和阴影衰落标准差 std_shadow 没有跟着变,还在用上一个场景的值。解决方法是把 n 和 std_shadow 做成函数参数,按第 2 章的典型值表逐项替换。我自己的习惯是把环境类型写成字符串参数,比如 'urban'、'suburban'、'indoor',在函数内部查表赋值,这样代码的可读性比裸传数字好得多。
4.2 结果与统计层的坑:单次仿真误读、dB 域平均、基准含义不清
第四个坑:连续运行两次,锯齿曲线形状完全不同,怀疑 randn 有 bug。这其实是随机仿真的正常现象,单次运行只是对统计分布的一次抽样。解决办法分两步:想完全复现结果,就在脚本开头写 rng(2024) 固定随机种子;想做有意义的结论,就不要看单次曲线,而是跑几百上千次蒙特卡洛,看统计分布或分位数。
第五个坑:直接把同一位置两次测量的 dB 接收功率做算术平均,或者把两条不同距离曲线的 dB 值求均值。dB 是对数域,线性域功率平均得到的“真实平均功率”大于 dB 域算术平均。最简单的例子:0 dBm 和 -20 dBm 的 dB 算术平均是 -10 dBm,但线性平均是约 -0.97 dBm,差了 9 dB。在链路预算里混用这两套口径,结果会严重偏离实测。解决办法是始终在 dB 域做加减,只有需要功率合成时才先转线性域、算完再转回 dB。
第六个坑和前面的 PL0 设定相关:算出来的接收功率是正的,比如 +30 dB,于是怀疑模型错了。原因一般是 PL0 = 0 且没加发射功率、天线增益,received_power 只是“损耗相对量”,不是真实接收电平。解决方法是明确给出发射功率 Pt、发射增益 Gt、接收增益 Gr,用链路预算公式 Pr = Pt + Gt + Gr - PL(d) 计算绝对接收功率。接下来这一章就专门讲这个。
5. 从仿真到链路预算:把衰落模型用进真实覆盖评估
5.1 链路预算的构成:路径损耗是骨架,阴影余量是肉
大尺度衰落模型仿真不能停在“画曲线”这一步,真正有价值的是把它接进链路预算,回答“覆盖半径到底多大”。链路预算的骨架就是把所有增益和损耗按 dB 域相加:
Pr(d) = Pt + Gt + Gr - PL(d) - shadow_margin其中 Pt 是发射功率(dBm),Gt 和 Gr 分别是收发天线增益(dBi),PL(d) 是路径损耗,shadow_margin 是为阴影衰落预留的余量。为什么需要余量?因为阴影衰落是随机量,如果预算里不留余量,边缘用户有一半概率接收功率低于设计门限。留 8 dB 余量,边缘覆盖可靠度大约 84%;留 1.65 * sigma ≈ 13.2 dB,可靠度约 95%。
以一个 2.4 GHz 宏蜂窝为例,参数按常见配置取:
| 参数 | 取值 | 说明 |
|---|---|---|
| 发射功率 Pt | 43 dBm | 约 20 W,宏基站典型 |
| 发射天线增益 Gt | 18 dBi | 定向天线 |
| 接收天线增益 Gr | 0 dBi | 手机内置天线 |
| 载波频率 | 2.4 GHz | 波长约 0.125 m |
| 参考距离 d0 | 100 m | 室外宏站参考点 |
| PL(d0) | 约 80 dB | 自由空间损耗估算 |
| 路径损耗指数 n | 3.7 | 密集城区 |
| 阴影标准差 sigma | 8 dB | 城市宏蜂窝 |
| 接收灵敏度 Pr_min | -100 dBm | 保证基本速率的最低电平 |
这里 PL(d0) 用自由空间公式估算:20 * log10(4 * pi * 100 / 0.125) ≈ 80 dB,实际模型中可以用实测替换。注意链路预算里全部是 dB 域加减,每一项都是独立的损耗或增益,这也是上一章避坑点里强调“不混用口径”的延续。
5.2 反算覆盖半径:从灵敏度倒推最大距离,并留出余量
把链路预算反过来用,就能从接收灵敏度倒推最大覆盖距离。先看不考虑阴影余量的理想情况。
% 链路预算反算覆盖半径(仅路径损耗) Pt = 43; Gt = 18; Gr = 0; % 发射功率和天线增益 (dB) Pr_min = -100; % 接收灵敏度 (dBm) PL_budget = Pt + Gt + Gr - Pr_min; % 允许的总路径损耗约 161 dB d0 = 100; PL0 = 80; n = 3.7; % 参考距离、参考损耗、损耗指数 d_max = d0 * 10^((PL_budget - PL0) / (10 * n)); fprintf('不考虑阴影余量,最大覆盖距离约 %.1f km\n', d_max / 1000);这段代码等同于把链路预算公式反转:已知允许损耗,求满足该损耗的最大距离。运行结果是十几公里量级,看起来覆盖能力很强,但这是在“所有用户都恰好落在平滑路径损耗曲线上”的假设下得到的,实际工程里完全不可用。接下来加阴影余量。
% 加入阴影衰落余量后的覆盖半径 sigma = 8; % 阴影衰落标准差 (dB) shadow_margin = 1.65 * sigma; % 95% 边缘覆盖概率对应系数 PL_budget_with_margin = PL_budget - shadow_margin; d_max_margin = d0 * 10^((PL_budget_with_margin - PL0) / (10 * n)); fprintf('留 %.1f dB 阴影余量后,最大覆盖距离约 %.1f km\n', ... shadow_margin, d_max_margin / 1000);加入 13.2 dB 余量后,覆盖半径明显收缩,这就是阴影衰落的真实代价。需要注意,1.65 对应的是标准正态分布的 95% 分位数,它表达的是“边缘覆盖概率”:小区边缘用户有 95% 概率不低于灵敏度。如果要求更高,比如 98%,系数要换成 2.05。工程上还常用“面积覆盖概率”的概念,需要把小区内所有位置的覆盖率做积分,比单纯查分位数更复杂。
到这里,大尺度衰落模型的仿真和工程用法已经闭环:模型参数 → MATLAB 仿真 → 链路预算 → 覆盖半径。但仿真结果靠不靠得住,最好再用统计手段自检一遍,这也是最后一章的进阶内容。
6. 进阶验证:用蒙特卡洛检验衰落模型的统计特性
6.1 蒙特卡洛抽样:看分布,不看单条曲线
单次仿真不能代表模型能力,跑到一定次数看统计分布才有意义。这里复用前面封装的 large_scale_fading 函数,在固定距离上做 10000 次抽样。
rng(2024); % 固定随机种子,保证结果可复现 M = 10000; % 仿真次数 d_target = 2000; % 关注距离 2000 m samples = zeros(M, 1); for k = 1:M samples(k) = large_scale_fading(3.7, 100, 0, d_target, 8); end运行结束后 samples 就是 2000 m 处接收功率的 10000 次独立抽样。理论预测:路径损耗均值为 10 * 3.7 * log10(2000 / 100) ≈ 48.1 dB,标准差 8 dB。
6.2 直方图与理论正态曲线对比
把抽样的直方图和理论正态 PDF 画在同一张图里,是最直观的模型自检方法。
% 提取理论均值和标准差 mu = 10 * 3.7 * log10(d_target / 100); sigma = 8; figure('Color', 'w'); histogram(samples, 60, 'Normalization', 'pdf'); hold on; x = linspace(mu - 4 * sigma, mu + 4 * sigma, 200); plot(x, normpdf(x, mu, sigma), 'r-', 'LineWidth', 2); xlabel('接收功率 (dB)'); ylabel('概率密度'); legend('蒙特卡洛仿真', '理论正态分布', 'Location', 'best'); grid on;如果直方图的中心位置和形状与红色理论曲线重合良好,说明路径损耗公式、d0 参考点、阴影衰落缩放这三个环节全部正确。如果直方图明显偏移,优先检查 d0 和 d_target 是否同单位、PL0 是否设了非零值;如果形状比理论曲线扁平,则可能是 randn 以外的随机源混入了模型,或者 sigma 用成了线性值。
这套脚本连同几组典型环境的参数配置,我整理在下载资源里,拿到手第一步就是把 rng(2024) 这一行跑通,再去改环境和距离参数。从那以后,我每次拿到一份衰落仿真代码,都强制先走一遍三件事:固定随机种子、确认 d0 与 d 同单位、把 PL0 的基准含义写在注释里,再谈曲线漂不漂亮。希望帮到你。
本文还有配套的精品资源,点击获取