基于Friis自由空间方程绘制收发距离与接收信号强度图时dBm值异常求助
解决Friis自由空间方程接收功率dBm转换错误的问题
嘿,我仔细看了你的代码,发现几个关键问题导致接收功率(PR)的dBm数值不对,咱们一步步来修正这些问题:
1. 波长计算逻辑错误
你现在的代码里直接把波长的计算结果平方了,这不符合Friis公式的正确形式。Friis公式要求的是**(波长/(4πd))的平方**,而不是先把波长平方。正确的波长计算应该是先算出实际波长,再代入公式:
lambda = 3e8 / f; % 先计算波长(单位:米)
而不是你写的Wavelength = (3*10^8/f).^2;,这一步错误会让后续的接收功率计算完全偏离真实值。
2. dBm转换用错了对数函数
Matlab里的log()是自然对数(ln),但dB的计算必须用以10为底的对数,也就是log10()。你当前的转换代码:
PR1 = 10*log(PR/(10*10.^-3)) ;
得改成这样:
PR1 = 10*log10(PR / 1e-3); % 1e-3是1毫瓦,对应dBm的基准功率
另外,10*10.^-3可以简化成1e-3,代码看起来更清爽。
3. 距离单位的一致性问题
你的图表xlabel标注的是“D (distance in Km)”,但代码里的d = 1:0.1:20如果是米的话,就会出现单位不匹配的问题。Friis公式里的距离和波长单位必须统一(都用米),所以要么把d转换成千米,要么把d的数值转换成米来计算:
% 比如如果d原本是米,转换成千米用于图表显示 d_km = d ./ 1000; % 或者直接定义千米单位的d,再转成米用于计算 d_km = 0.001:0.0001:0.02; d_m = d_km * 1000;
单位不统一的话,计算出来的功率值肯定不对。
修正后的完整代码
clc; close all; clear all; % 参数定义,统一单位 d_km = 0.001:0.0001:0.02; % 1米到20米,以千米为单位用于图表 d_m = d_km * 1000; % 转换成米,和波长单位一致 f = 2100e6; % 2100MHz,用科学计数法更直观 lambda = 3e8 / f; % 计算波长(米) PT = 50.12; % 发射功率(瓦) % 正确计算接收功率(瓦) PR = PT * (lambda ./ (4*pi*d_m)).^2; % 转换为dBm单位 PR_dBm = 10*log10(PR / 1e-3); % 绘制双图对比 subplot(2,1,1); plot(d_km, PR); xlabel('Distance (Km)'); ylabel('Received Power (W)'); title('Received Power in Watts vs Distance'); subplot(2,1,2); plot(d_km, PR_dBm); xlabel('Distance (Km)'); ylabel('Received Power (dBm)'); title('Received Power in dBm vs Distance');
结果验证
修正后,你会看到:
- 功率(瓦)随距离增加呈平方反比下降
- 转换为dBm后,功率随距离增加呈线性下降(对数把平方反比关系转换成了线性关系)
这完全符合Friis自由空间传播模型的预期。
内容的提问来源于stack exchange,提问作者Yashlin Naidoo
相关产品推荐
相关产品推荐

