系列导航:目录 | 上一章:什么是无线电 | 下一章:电路基础
本章目标:读完本章,你将能够
- 用振幅、频率、相位描述一个正弦信号,把相位差换算成时间差,算出峰值、峰峰值和有效值;
- 用积化和差公式解释“两个频率相乘会产生和频与差频”,这是混频器和超外差接收机的数学基础;
- 熟练进行复数的四则运算,在直角坐标和极坐标之间互相转换;
- 理解并证明欧拉公式 ,把正弦信号看成复平面上旋转的相量;
- 用相量计算同频正弦的叠加,并用它解释多径衰落;
- 熟练使用 dB、dBm、dBμV、dBi、dBd 和 S 表读数,做出一份完整的链路预算;
- 用 NumPy 处理复数和数组,用 Matplotlib 画图。
前置知识:高中三角函数(和角公式)和对数。第一、三节用到导数和定积分的基本概念,第三节用到泰勒级数(只需知道“函数可以展开成幂级数”)。
无线电工程师每天都在和四样数学工具打交道:
- 正弦函数:载波、本振、音频,无线电里几乎所有信号都由正弦波构成;
- 复数:电容、电感的阻抗,正交(IQ)信号,软件无线电里的每一个采样点,都是复数;
- 相量:把“同频正弦的加减和求导”变成“复数的加减和乘法”,第 03 章分析交流电路全靠它;
- 分贝:从 100 W 的发射机到 0.2 μV 的接收灵敏度,功率相差 17 个数量级,没有分贝几乎没法讨论。
本章把这四样工具一次讲清楚。每一样都结合无线电的实际例子:负载上的电压、混频器、多径衰落、S 表读数、链路预算。最后用一节介绍 NumPy 和 Matplotlib,后面所有章节的代码都建立在它们之上。
一、正弦信号:无线电的“原子”
1. 三个参数
一个正弦信号可以写成
它由三个参数完全确定:
| 符号 | 名称 | 单位 | 含义 |
|---|---|---|---|
| 振幅(峰值) | V、A、V/m 等 | 偏离零点的最大值 | |
| 频率 | Hz | 每秒重复的次数; 是角频率,单位 rad/s | |
| 初相位 | 弧度或度 | 时刻处在一个周期的哪个位置 |
本教程统一用余弦 作为“标准”正弦信号,正弦函数可以用 换过来。角度在公式里一律用弧度,在叙述和图表里为了直观常用度, rad。
2. 相位差就是时间差
把 改写成 ,可以看出:初相位 相当于把波形在时间上提前了
称为超前, 称为滞后。
图 1:100 W 发射机接 50 Ω 假负载时,负载两端的电压(f = 7.1 MHz)。虚线超前 60°,相当于提前 T/6。
例如在 7.1 MHz,周期 ns,60° 的相位差对应 ns 的时间差。在射频电路里,“相位”和“时间延迟”是同一件事的两种说法:一段电缆、一个滤波器让信号延迟了多少纳秒,就等于让它的相位滞后了多少度。
3. 峰值、峰峰值和有效值
描述正弦电压的“大小”,常用三个量:
- 峰值 :最大值,即振幅 ;
- 峰峰值 :从最低点到最高点,示波器上最容易直接读出;
- 有效值(均方根值,RMS):产生相同平均功率的直流电压。
有效值的定义是“平方的平均值再开方”:
对正弦信号,利用 :
因为 在一个周期内的积分为零。所以
电阻 上的平均功率是 。我们平时说的“220 V 市电”“100 W 发射机”,指的都是有效值和平均功率。
例:100 W 发射机接 50 Ω 假负载。 附录代码算出:
代码还对一个周期的采样直接求了均方根,结果 70.7107 V,和公式一致。反过来,如果你用示波器(配合衰减器)测出假负载上的峰峰值,就能算出发射功率:
4. 积化和差:两个频率相乘,产生和频与差频
由余弦的和角公式
两式相加再除以 2,得到积化和差公式:
令 、,它告诉我们:两个不同频率的正弦信号相乘,结果是两个新的频率:差频 和和频 ,原来的 、 反而不见了。
图 2:14.2 MHz 的信号乘以 5.2 MHz 的本振,结果正好是 9.0 MHz 和 19.4 MHz 两个余弦之和。
附录代码在 2 μs 内取了 20 万个采样点,两边的最大误差只有 ,也就是计算机的舍入误差。
这个公式是整个无线电接收技术的基石。接收机里有一个叫混频器的电路,它把收到的信号和本机振荡器(本振)的信号相乘。比如要收 14.2 MHz 的短波电台,让本振工作在 5.2 MHz,相乘后得到 9.0 MHz 和 19.4 MHz;再用一个固定在 9.0 MHz 的滤波器取出差频,就把任意电台“搬”到了一个固定的中频上。想收别的电台,只需改变本振频率。这就是阿姆斯特朗发明的超外差原理,第 15 章会详细讨论(包括这个方案带来的“镜像频率”问题,见练习 2)。
另一个常用的特例是 :
一个正弦信号经过“平方”这样的非线性运算,就会产生直流分量和二倍频(二次谐波)。检波器、倍频器的原理是它,发射机为什么会产生谐波干扰、为什么必须加滤波器,原因也是它。**线性电路不会产生新频率,非线性电路会。**这是射频电路里反复出现的主题。
5. 同频正弦相加,还是同频正弦
另一个经常遇到的问题是:两个同频率但振幅、相位不同的正弦信号相加,结果是什么?比如
可以证明结果仍是同一频率的正弦,只是振幅和相位变了。用和角公式展开、合并、再凑回一个余弦,能算出来,但很繁琐。接收天线同时收到直射波和地面反射波时,遇到的就是这个问题。下面两节介绍的复数和相量,能把它变成简单的向量加法。
二、复数
1. 定义
引入一个数 ,规定
形如 (、 为实数)的数称为复数, 是实部, 是虚部。数学和物理书里常用 ,电子工程里习惯用 ,因为 已经被电流占用了。Python 也用 j:3 + 4j 就是一个复数。
复数可以画在复平面上:横轴是实部,纵轴是虚部, 对应点 ,或者从原点指向它的箭头。
2. 四则运算
按普通代数运算,遇到 就换成 :
| 运算 | 公式 |
|---|---|
| 加减 | |
| 乘法 | |
| 共轭 | , |
| 除法 | (分子分母同乘分母的共轭) |
以 、 为例,附录代码给出:
| 运算 | 结果 |
|---|---|
加减法就是向量的加减(平行四边形法则),这一点后面画相量图时会用到。
3. 极坐标形式
复平面上的点也可以用长度和角度描述:
称为模, 称为辐角。反过来,,。工程上常把复数写成 ,例如 。
注意 atan2:辐角不能简单地用 计算,因为它分不清 和 。例如 在第三象限,辐角应为 ,而 。附录代码同时算了这两种方法,
atan2给出了正确的 。NumPy 的np.angle内部用的就是 atan2。
图 3:左:复数的直角坐标与极坐标。右:复数乘法,模相乘、角相加;乘以 j 就是逆时针旋转 90°。
极坐标的好处在乘法上特别明显。附录代码算出 ,,而
正好是 ,。**复数相乘,模相乘,辐角相加。**为什么会这样,欧拉公式会给出答案。
一个特例:,所以乘以 就是把向量逆时针旋转 90°,长度不变。,见图 3 右。第 03 章会看到,电感上电压超前电流 90°,正是因为它的阻抗里有一个 。
三、欧拉公式
1. 公式与证明
这就是欧拉公式。它把指数函数和三角函数联系在一起,是整个信号处理和射频工程最常用的公式。
证明用泰勒级数。我们知道
把 代入 ,利用 、、,周期为 4:
把实部和虚部分开,实部恰好是 的级数,虚部恰好是 的级数。证毕。
附录代码对 逐项累加这个级数:
| 累加项数 | 部分和 | 与 的误差 |
|---|---|---|
| 2 | ||
| 3 | ||
| 4 | ||
| 6 | ||
| 9 | ||
| 12 |
12 项之后误差已经只有 量级,收敛到 。取 ,得到著名的 ,代码算出的结果是 ,同样只是舍入误差。
有了欧拉公式,极坐标就可以写成指数形式:
复数乘法“模相乘、角相加”也就一目了然:,指数相乘就是指数相加。
2. 旋转的相量
令 , 就是复平面单位圆上一个以角速度 逆时针旋转的点,每秒转 圈。它在实轴上的投影是 ,在虚轴上的投影是 :
图 4:旋转的相量 。右上:投影到虚轴,得到正弦;左下:投影到实轴,得到余弦(时间轴向下)。
这给了我们看待正弦信号的新视角:一个正弦信号,就是一个旋转相量在实轴上的投影。
把欧拉公式和它的共轭 相加、相减,得到
一个实数余弦等于两个反向旋转的相量之和:一个逆时针转(频率 ),一个顺时针转(频率 ),虚部正好抵消。这就是频谱图上会出现“负频率”的原因,第 04 章讲傅里叶变换、第 19 章讲 IQ 信号时还会回来。
四、相量
1. 定义
对于一个频率已知的正弦信号,利用欧拉公式可以写成
括号里分成了两部分: 是旋转,所有同频率的信号都一样; 是一个不随时间变化的复数,记录了这个信号独有的振幅和相位。后者就叫相量(phasor),通常用大写字母表示:
在一个只有单一频率的系统里(比如第 03 章的交流电路,或者只看载波的天线问题), 是公共因子,可以先扔掉,只对相量运算,最后再乘回去取实部。
2. 同频正弦相加 = 相量相加
因为取实部和加法可以交换顺序,
**同频正弦相加,只需把相量相加。**回到第一节第 5 小节的问题:
所以
图 5:左:相量图,两个相量首尾相接,像力的合成一样。右:时域核对,逐点相加的结果(绿)和相量算出的正弦(虚线)完全重合。
附录代码在一个周期内取了 360 万个点逐点相加,找到最大值 11.1803,出现在 处,即相位 3.43°,和相量计算完全一致。注意合成振幅 11.18 小于 ,因为两个分量的相位相差 90°,不是同时达到最大。
3. 应用:多径衰落
接收天线常常同时收到两路信号:一路直射过来,另一路经地面、楼房或山体反射过来。反射路径比直射路径长 ,所以反射波晚到,相位滞后
设反射波的振幅是直射波的 倍(),以直射波为参考,合成信号的相量是
它的模的平方为
- 路程差是波长的整数倍时,,两路同相叠加,;
- 路程差是半波长的奇数倍时,,两路反相抵消,。
图 6:直射波加反射波的合成强度随路程差的变化。路程差每变化一个波长,信号就经历一次起伏;反射越强,谷底越深。
当 时,附录代码算出最强为 1.8 倍(+5.11 dB),最弱只有 0.2 倍(−13.98 dB),起伏达 19.1 dB。如果反射波和直射波一样强(),谷底就是 0,信号完全消失。
这就是多径衰落。在 2 米波段(145 MHz, m),如果直射波从身后来、反射波从前方的楼房反射回来,两者相向传播,你每移动 m,路程差就变化一个波长,经历一次衰落。开车以 60 km/h(16.67 m/s)行驶时,每秒要穿过 16.1 个“零点”,听起来就是信号一阵一阵地“哒哒”抖动,英文叫 picket fencing(栅栏效应)。
这给手台用户一个很实用的建议:信号差的时候,往旁边挪半米试试,也许就从谷底移到了峰顶。第 10 章会进一步讨论多径和衰落的统计规律。
4. 求导变成乘以 jω
相量的另一个重要性质:
对正弦信号求导,在相量上就是乘以 :振幅乘以 ,相位超前 90°。这让微分方程变成了代数方程。
把它用到电感和电容上(第 03 章详细推导):
- 电感:,相量形式 ,所以电感的阻抗是 ;
- 电容:,相量形式 ,所以电容的阻抗是 。
在 7.1 MHz,附录代码算出 1 μH 电感的阻抗是 ,100 pF 电容的阻抗是 。有了复数阻抗,交流电路就可以像直流电路一样用欧姆定律计算,只是所有量都换成了复数。
五、分贝
1. 为什么要用分贝
图 7:无线电里常见的功率电平,放在同一把“分贝尺”上。上方是对应的线性功率。
无线电里的功率跨度极大:一台 1500 W 的功率放大器输出 dBm,而 1 Hz 带宽内的热噪声只有 dBm,两者相差 236 dB,即 倍以上。用瓦特写出来,一个是 1500,一个是 ,根本没法放在同一张表里比较。
分贝的第二个好处更重要:信号经过一连串放大器、电缆、天线和传播路径,每一级都是乘上一个增益或损耗;取对数之后,乘法变成加法:
这就是为什么无线电工程师总是用 dB 来做“链路预算”。
2. 定义
两个功率之比的分贝数定义为
其中 是以 10 为底的对数。比值大于 1 时 dB 为正(增益),小于 1 时为负(损耗),等于 1 时为 0 dB。
如果比较的是电压(或电流、场强),由于功率与电压的平方成正比(),在相同阻抗下:
所以电压翻倍是 +6 dB,功率翻倍是 +3 dB,两者说的是同一件事。注意前提是阻抗相同;比较 50 Ω 和 75 Ω 系统上的电压时,不能直接用 。
3. 速算
记住两个数就够了:3 dB ≈ ×2,10 dB = ×10。其他的都能拼出来,例如 13 dB = 10 dB + 3 dB ≈ ×20,7 dB = 10 dB − 3 dB ≈ ×5,−3 dB ≈ ×½。附录代码列出了 1~10 dB 的精确倍数,以及好记的近似值:
| dB | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 精确倍数 | 1.2589 | 1.5849 | 1.9953 | 2.5119 | 3.1623 | 3.9811 | 5.0119 | 6.3096 | 7.9433 | 10 |
| 速算 | 1.25 | 1.6 | 2 | 2.5 | 3.2 | 4 | 5 | 6.3 | 8 | 10 |
4. 绝对电平:dBm、dBW、dBμV
分贝本来只表示比值。如果固定一个参考值,它就能表示绝对大小:
| 单位 | 参考值 | 常见用途 |
|---|---|---|
| dBm | 1 mW | 射频功率,最常用 |
| dBW | 1 W | 大功率发射机、卫星 EIRP |
| dBμV | 1 μV | 接收机输入电压、EMC 测量 |
| dBμV/m | 1 μV/m | 电场强度 |
,所以 dBW = dBm − 30。附录代码列出了几个常见功率:
| 功率 | 1 mW | 1 W | 5 W | 25 W | 100 W | 1500 W |
|---|---|---|---|---|---|---|
| dBm | 0.00 | 30.00 | 36.99 | 43.98 | 50.00 | 61.76 |
在 50 Ω 系统里,0 dBm 对应的电压是 V dBμV,所以
例如手台灵敏度 dBm 相当于 dBμV,也就是 0.2 μV。
5. dBc、dBFS、dBi 和 dBd
还有几个以“相对于什么”命名的分贝单位:
- dBc:相对于载波(carrier)功率。例如“谐波抑制 −43 dBc”表示谐波比载波弱 43 dB;
- dBFS:相对于满量程(full scale),用于 ADC 和软件无线电,0 dBFS 是 ADC 能表示的最大值;
- dBi:天线增益,相对于各向同性(isotropic)天线;
- dBd:天线增益,相对于半波偶极子(dipole)。
dBi 和 dBd 之间差一个固定值:半波偶极子本身相对各向同性天线的增益。半波偶极子的方向图是
它的方向性系数等于最大辐射强度与平均辐射强度之比:
附录代码用数值积分算出 ,即 dBi。所以
看天线广告时要留意:同一副天线,标 dBi 的数字比标 dBd 的大 2.15。只写“dB”不写参考的增益数字,最好打个问号。第 09 章会推导这个方向图。
6. S 表
业余电台面板上的S 表(信号强度表)用 S1~S9 表示收到的信号强度,S9 以上用“S9 + 多少 dB”表示。IARU 第一区的技术建议规定:每个 S 单位相差 6 dB(电压的 2 倍),在 50 Ω 输入端:
- HF(30 MHz 以下):S9 = −73 dBm,即 50 μV;
- VHF 及以上:S9 = −93 dBm,即 5 μV。
附录代码由此推出各级读数:
| S 读数 | HF 电平 | HF 电压 | VHF 电平 | VHF 电压 |
|---|---|---|---|---|
| S1 | −121 dBm | 0.199 μV | −141 dBm | 0.020 μV |
| S3 | −109 dBm | 0.793 μV | −129 dBm | 0.079 μV |
| S5 | −97 dBm | 3.159 μV | −117 dBm | 0.316 μV |
| S7 | −85 dBm | 12.574 μV | −105 dBm | 1.257 μV |
| S9 | −73 dBm | 50.059 μV | −93 dBm | 5.006 μV |
HF 的 S9 + 20 dB 就是 −53 dBm。通联时对方报告“你的信号 S7”,你就知道它大约在 −85 dBm。不过要注意,许多电台的 S 表并没有严格按这个标准校准,读数只能作参考。
7. 分贝不能直接相加
一个常见的错误是把两个用 dBm 表示的功率直接相加。正确的做法是先换回瓦特,相加,再换回 dBm:
| 功率 A | 功率 B | A + B |
|---|---|---|
| 0 dBm | 0 dBm | 3.01 dBm |
| −100 dBm | −110 dBm | −99.59 dBm |
| −100 dBm | −120 dBm | −99.96 dBm |
两个相等的功率相加,总功率加 3 dB;一个比另一个弱 20 dB 时,它的贡献几乎可以忽略。这在计算噪声时很有用:290 K 下的热噪声功率谱密度是 dBm/Hz,在 12.5 kHz 的 FM 信道带宽内是 dBm。第 14 章讨论灵敏度时会用到这个数字。
(“dB 加 dB”在另一种意义下是对的:增益和损耗可以直接加减,因为它们表示的是乘法关系。一个 20 dB 的放大器后面接一段 3 dB 损耗的电缆,总增益就是 17 dB。)
8. 链路预算
把第 01 章的平方反比公式推广到收发天线都有增益的情况:
这就是 Friis 传输公式,第 10 章会详细推导。其中 称为自由空间路径损耗(FSPL)。取分贝:
常数 32.45 是把 用 km、 用 MHz 表示时 的值。用它重算第 01 章的例子(5 W、145 MHz、10 km、各向同性天线),得到 −58.69 dBm,和当时的结果一致。
下面是一条更完整的 2 米波段链路:一台 25 W 的车载电台,经过馈线和天线,与 30 km 外的另一个电台通联。天线增益和馈线损耗是假设的典型值,并假设视距无遮挡:
| 项目 | 增益 / 损耗 | 电平 |
|---|---|---|
| 发射功率 25 W | +43.98 dB | 43.98 dBm |
| 发射端馈线损耗(假设) | −1.50 dB | 42.48 dBm |
| 发射天线增益(假设) | +6.00 dB | 48.48 dBm |
| 自由空间路径损耗(30 km) | −105.22 dB | −56.74 dBm |
| 接收天线增益(假设) | +3.00 dB | −53.74 dBm |
| 接收端馈线损耗(假设) | −1.00 dB | −54.74 dBm |
图 8:链路预算的“瀑布图”。每一级增益或损耗都只是在 dB 上加减。
接收功率 −54.74 dBm,比灵敏度高 66.3 dB。这 66 dB 的余量用来抵消现实中的各种额外损耗:山体和建筑物的遮挡、多径衰落、天线没对准、雨雪……第 10 章会逐一讨论。用 dB 做链路预算的好处在于:想改一个条件(比如换一副增益更高的天线),只需在表里改一行加减。
六、对数坐标
第 01 章的电磁波谱、天线尺寸、平方反比图都用了对数坐标:坐标轴上等距离的刻度代表等倍数而不是等差。1、10、100、1000 之间的距离相等。读对数坐标时记住两点:
- 每一大格(一个十倍程)代表乘以 10。两个大刻度之间的小刻度依次是 2、3、…、9 倍,越往右越挤;
- 在双对数坐标上,幂函数 是一条直线,斜率等于 。所以第 01 章图 7 里,接收功率(dBm)对距离(对数坐标)的曲线是一条直线:距离每增加 10 倍,功率下降 20 dB。
纵轴用 dB 表示时,它本身就已经是对数了,所以纵轴不需要再取对数坐标。
七、Python 上手:NumPy 与 Matplotlib
本教程的所有计算和配图都用 Python 完成。只需要两个库:
- NumPy:数组运算,原生支持复数;
- Matplotlib:画图。
安装好 Python 3 之后,在命令行运行:
python -m pip install numpy matplotlib
附录 C 会详细介绍环境配置。下面这段代码把本章的几个计算串起来:
import numpy as np
z1, z2 = 3 + 4j, 1 - 2j
print(z1 * z2, z1 / z2) # 复数的乘除
print(abs(z1), np.angle(z1, deg=True)) # 模和辐角(度)
V = 10 * np.exp(1j * np.radians(30)) + 5 * np.exp(1j * np.radians(-60))
print(abs(V), np.angle(V, deg=True)) # 相量相加
P = np.array([0.001, 1, 5, 100]) # 功率,单位 W
print(10 * np.log10(P / 1e-3)) # 一次性换算成 dBm
输出:
(11-2j) (-1+2j)
5.0 53.13010235415598
11.180339887498949 3.434948822922008
[ 0. 30. 36.98970004 50. ]
几个要点:
- 复数是 Python 的内置类型:
3 + 4j直接就是复数,abs()求模;NumPy 的np.angle(z, deg=True)求辐角,np.exp(1j * theta)就是欧拉公式; - 向量化:NumPy 的函数作用在整个数组上,例如最后一行一次算出了四个功率的 dBm,不需要写循环。后面处理成千上万个采样点时,这既简洁又快;
- 画图:Matplotlib 的基本用法是
plt.plot(x, y)画曲线、plt.xlabel()加坐标轴标题、plt.show()显示。附录代码最后画出了图 4 的简化版。每一章的配图脚本make_figures.py都放在文章旁边,可以对照着学习更多画法。
小结
- 正弦信号 由振幅、频率、相位三个参数确定。相位差等于时间差:。正弦电压的有效值 ,电阻上的平均功率 。
- 积化和差:。两个频率相乘产生和频与差频,这是混频器和超外差接收机的原理;非线性运算会产生新频率,线性运算不会。
- 复数 ,辐角用 atan2 计算。加减按分量,乘除按极坐标:模相乘除、角相加减。乘以 等于旋转 90°。
- 欧拉公式 ,可由泰勒级数证明。 是复平面上旋转的相量,正弦信号是它的投影; 等于两个反向旋转相量之和,由此引出负频率。
- 相量 记录正弦信号的振幅和相位。同频正弦相加就是相量相加,求导就是乘以 ,由此得到电感、电容的阻抗 、。
- 多径衰落:直射波与反射波的合成 在 与 之间起伏,路程差每变化一个波长起伏一次。
- 分贝:功率比 ,电压比 (同阻抗)。3 dB ≈ ×2,10 dB = ×10。dBm 以 1 mW 为参考,50 Ω 下 dBμV ≈ dBm + 107;dBi = dBd + 2.15;S9 在 HF 为 −73 dBm、VHF 为 −93 dBm,每个 S 单位 6 dB。增益和损耗可以直接加减,两个功率相加则必须先换回瓦特。
- 链路预算:,。
下一章,我们用这些工具分析电路:电阻、电容、电感、复数阻抗,以及无线电里最重要的电路之一——LC 谐振回路。
练习题
- (有效值) 用示波器测得 50 Ω 假负载两端的电压峰峰值为 63.2 V。发射机的输出功率是多少?
- (混频与镜像) 一台接收机的中频是 9.0 MHz。要接收 7.100 MHz 的信号,本振调到 16.100 MHz。(a) 混频后得到哪两个频率?(b) 另外还有一个输入频率,和这个本振混频后也会落在 9.0 MHz 上,它是多少?
- (复数运算) 计算 和 ,结果分别写成直角坐标和极坐标形式。
- (相量) (a) 三个振幅都是 1、相位分别为 0°、120°、240° 的同频正弦相加,结果是什么?(b) 把 写成 的形式。
- (dB 速算) 不用计算器,估算 23 dB、17 dB、−7 dB、36 dB 各对应多少倍功率,再用计算器核对。
- (绝对电平) (a) 0.5 W 是多少 dBm?(b) 50 Ω 系统中的 −107 dBm 约等于多少 dBμV、多少 μV?(c) HF 波段对方报告你的信号从 S5 升到了 S9,信号功率增加了多少 dB、多少倍?
- (馈线损耗) 一段 30 m 长的同轴电缆,假设它在 145 MHz 的损耗为 6 dB/100 m。电台输出 50 W,到达天线的功率是多少?
- (多径) 如果反射波振幅只有直射波的一半(),合成信号的最强和最弱分别是多少 dB?
- (编程:链路预算) 修改附录代码第 9 部分,把距离从 30 km 改为 60 km,接收功率和余量各是多少?距离每增加一倍,路径损耗增加多少 dB?
- (噪声相加) 两个互不相关的噪声源功率相等,叠加后总噪声比单个噪声源高多少 dB?如果两路信号完全同相(比如练习 8 中直射波和反射波同相、),叠加后功率又高多少 dB?两者为什么不同?
参考答案
- V, V, 9.99 W,约 10 W。或者直接用 W。
- (a) 差频 9.0 MHz,和频 23.2 MHz。中频滤波器选出 9.0 MHz。(b) 输入为 25.1 MHz 时,差频 MHz,同样落进中频。25.1 MHz 称为 7.1 MHz 的镜像频率,它和有用信号关于本振对称。如果不在混频器前面把它滤掉,25.1 MHz 上的电台就会混进来。第 15 章专门讨论这个问题。
- ; 。用极坐标核对:;相除则是 。
- (a) 三个相量 、、 首尾相接构成一个闭合的等边三角形,和为 0(代码算出的模是 )。这就是三相交流电在平衡负载下中性线电流为零的原因。(b) ,相量为 ,所以总相量为 ,即 。
- 23 dB = 20 + 3 ≈ 100 × 2 = 200(精确值 199.5);17 dB = 20 − 3 ≈ 100 ÷ 2 = 50(50.1);−7 dB = −10 + 3 ≈ 0.1 × 2 = 0.2(0.1995);36 dB = 30 + 6 ≈ 1000 × 4 = 4000(3981)。
- (a) 26.99 dBm。(b) 0 dBμV,即约 1 μV(精确地说是 −0.01 dBμV)。(c) S5 到 S9 是 4 个 S 单位,24 dB,功率增加 251 倍(电压增加 16 倍)。
- 损耗 dB,到达天线的功率 33.0 W,有约 17 W 变成了电缆里的热量。接收时,天线收到的信号同样要损失 1.8 dB。所以在 VHF/UHF,低损耗电缆和尽量短的馈线很重要。
- 最强 +3.52 dB,最弱 −6.02 dB,起伏 9.5 dB,比 时的 19.1 dB 小得多(图 6 中的橙色虚线)。
- 60 km 时 FSPL = 111.24 dB,接收功率 −60.76 dBm,余量 60.2 dB。距离加倍,FSPL 增加 6.02 dB(自由空间里的“6 dB 每倍程”规律)。
- 不相关的噪声按功率相加: +3.01 dB。同相的两路信号按电压(相量)相加:振幅加倍,功率变为 4 倍,+6.02 dB(就是 时多径的峰值,)。区别在于相关性:同相信号的电压时时刻刻都在互相加强;不相关的噪声有时加强、有时抵消,平均下来只有功率可加。天线阵列和分集接收正是利用了这一差别:把多路信号同相相加,信号增加 6 dB,而噪声只增加 3 dB。
参考资料
- W. H. Hayt, J. E. Kemmerly, J. D. Phillips, S. M. Durbin. Engineering Circuit Analysis. 9th ed. McGraw-Hill, 2018. 第 10 章(正弦稳态分析与相量)。
- R. G. Lyons. Understanding Digital Signal Processing. 3rd ed. Prentice Hall, 2010. 附录 A(复数)、第 8 章(正交信号)。
- P. J. Nahin. An Imaginary Tale: The Story of √−1. Princeton University Press, 1998.
- ARRL. The ARRL Handbook for Radio Communications. 最新版. “Electrical Fundamentals” 与 “Radio Fundamentals” 章节。
- IARU Region 1. Technical Recommendation R.1: S-meter calibration. 1981.
- T. S. Rappaport. Wireless Communications: Principles and Practice. 2nd ed. Prentice Hall, 2002. 第 4 章(自由空间传播与链路预算)、第 5 章(多径衰落)。
附录:完整代码
下面的代码复现了本章所有数值:正弦信号的峰值与有效值、相位差折合的时间差、积化和差的数值验证、复数运算、欧拉公式的泰勒级数逼近、相量相加及其时域核对、多径衰落、电感和电容的阻抗、分贝速算表、dBm 与 dBμV、S 表、功率相加、热噪声、半波偶极子的 dBi,以及链路预算,最后画出旋转相量与它的投影。只依赖 numpy 和 matplotlib,保存为 example.py 后运行 python example.py 即可。
"""无线电自学教程 02:数学工具箱 —— 附录代码
1. 正弦信号:峰值、峰峰值、有效值;相位差折合成时间差;
2. 积化和差:两个余弦相乘得到和频与差频(混频器的数学原理);
3. 复数运算:加减乘除、模与辐角、极坐标;
4. 欧拉公式:用泰勒级数逼近 e^{jθ},验证 e^{jπ} + 1 = 0;
5. 相量:两个同频正弦相加,用相量求和并用时域采样核对;
6. 多径:直射波与反射波的相量和,衰落的深度与快慢;
7. 阻抗预览:电感 jωL、电容 1/(jωC);
8. 分贝:速算口诀、dBm 与 dBμV、S 表、功率相加、半波偶极子的 dBi;
9. 链路预算:自由空间路径损耗与一条 2 米波段链路的预算表;
最后画出旋转相量与它在实轴上的投影。
运行:python example.py
"""
import cmath
import math
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["Microsoft YaHei", "SimHei", "DejaVu Sans"]
plt.rcParams["axes.unicode_minus"] = False
C = 299_792_458.0 # 光速 [m/s]
def db(x):
"""功率比 → dB。"""
return 10 * np.log10(x)
def dbm(p_watt):
return 10 * np.log10(p_watt / 1e-3)
def watt(p_dbm):
return 1e-3 * 10 ** (p_dbm / 10)
def polar_str(z):
return f"{abs(z):.4f}∠{np.degrees(np.angle(z)):.2f}°"
def rect_str(z):
sign = "+" if z.imag >= 0 else "-"
return f"{z.real:.3f} {sign} j{abs(z.imag):.3f}"
# ---------------- 1. 正弦信号 ----------------
print("=== 1. 正弦信号:100 W 发射机接 50 Ω 假负载 ===")
P, R = 100.0, 50.0
v_rms = math.sqrt(P * R)
v_p = v_rms * math.sqrt(2)
print(f"有效值 V_rms = sqrt(P·R) = {v_rms:.2f} V,峰值 V_p = {v_p:.2f} V,峰峰值 V_pp = {2 * v_p:.2f} V")
t = np.linspace(0, 1, 100_000, endpoint=False) # 一个周期(归一化)
v = v_p * np.cos(2 * np.pi * t)
print(f"数值积分:一个周期内 v^2 的平均值开方 = {np.sqrt(np.mean(v**2)):.4f} V")
f, phi = 7.1e6, 60.0
print(f"7.1 MHz 时,60 度相位差相当于 {phi / 360 / f * 1e9:.2f} ns 的时间差")
# ---------------- 2. 积化和差 ----------------
print("\n=== 2. 积化和差:cos a · cos b = [cos(a-b) + cos(a+b)] / 2 ===")
f1, f2 = 14.2e6, 5.2e6
t = np.linspace(0, 2e-6, 200_001)
lhs = np.cos(2 * np.pi * f1 * t) * np.cos(2 * np.pi * f2 * t)
rhs = 0.5 * (np.cos(2 * np.pi * (f1 - f2) * t) + np.cos(2 * np.pi * (f1 + f2) * t))
print(f"两边最大误差 {np.max(np.abs(lhs - rhs)):.1e}")
print(f"{f1 / 1e6} MHz × {f2 / 1e6} MHz → 差频 {(f1 - f2) / 1e6:.1f} MHz,和频 {(f1 + f2) / 1e6:.1f} MHz")
# ---------------- 3. 复数运算 ----------------
print("\n=== 3. 复数运算 ===")
z1, z2 = 3 + 4j, 1 - 2j
print(f"z1 = {z1},z2 = {z2}")
print(f"z1 + z2 = {z1 + z2},z1 - z2 = {z1 - z2}")
print(f"z1 · z2 = {z1 * z2},z1 / z2 = {z1 / z2}")
print(f"|z1| = {abs(z1)},arg z1 = {np.degrees(np.angle(z1)):.2f}°,共轭 = {z1.conjugate()}")
print(f"极坐标:z1 = {polar_str(z1)},z2 = {polar_str(z2)},z1·z2 = {polar_str(z1 * z2)}")
print(f" 模相乘 {abs(z1) * abs(z2):.4f},角相加 "
f"{np.degrees(np.angle(z1) + np.angle(z2)):.2f}°")
print(f"arg(-1 - 1j):atan(b/a) 给出 {np.degrees(np.arctan(-1 / -1)):.0f}°,"
f"atan2 给出 {np.degrees(np.arctan2(-1, -1)):.0f}°(正确)")
# ---------------- 4. 欧拉公式 ----------------
print("\n=== 4. 欧拉公式:e^{jθ} = cos θ + j sin θ ===")
theta = np.pi / 3
target = complex(np.cos(theta), np.sin(theta))
partial = 0
for n in range(12):
partial += (1j * theta) ** n / math.factorial(n)
if n in (1, 2, 3, 5, 8, 11):
print(f"泰勒级数前 {n + 1:2d} 项:{partial.real:.6f} + j{partial.imag:.6f},"
f"误差 {abs(partial - target):.1e}")
print(f"cos(π/3) + j sin(π/3) = {target.real:.6f} + j{target.imag:.6f}")
print(f"e^(jπ) + 1 = {cmath.exp(1j * np.pi) + 1:.1e}")
# ---------------- 5. 相量相加 ----------------
print("\n=== 5. 相量:10 cos(ωt + 30°) + 5 cos(ωt - 60°) ===")
p1 = 10 * cmath.exp(1j * np.radians(30))
p2 = 5 * cmath.exp(1j * np.radians(-60))
ps = p1 + p2
print(f"V1 = {rect_str(p1)},V2 = {rect_str(p2)}")
print(f"V1 + V2 = {rect_str(ps)} = {polar_str(ps)}")
wt = np.linspace(0, 2 * np.pi, 3_600_001)
s = 10 * np.cos(wt + np.radians(30)) + 5 * np.cos(wt - np.radians(60))
k = np.argmax(s)
print(f"时域采样核对:最大值 {s[k]:.4f},出现在 ωt = {np.degrees(wt[k]):.2f}°,"
f"即相位 {-np.degrees(wt[k]) % 360:.2f}°")
# ---------------- 6. 多径 ----------------
print("\n=== 6. 多径:直射波 1 + 反射波 0.8·e^{-jΔφ} ===")
a_ref = 0.8
print(f"同相叠加:{1 + a_ref:.1f} 倍({20 * np.log10(1 + a_ref):+.2f} dB),"
f"反相抵消:{1 - a_ref:.1f} 倍({20 * np.log10(1 - a_ref):+.2f} dB),"
f"起伏 {20 * np.log10((1 + a_ref) / (1 - a_ref)):.1f} dB")
lam = C / 145e6
speed = 60 / 3.6
print(f"145 MHz:λ = {lam:.3f} m。直射波与反射波相向而来时,零点间隔 λ/2 = {lam / 2:.3f} m")
print(f"车速 60 km/h({speed:.2f} m/s)时,每秒穿过 {speed / (lam / 2):.1f} 个零点")
# ---------------- 7. 阻抗预览 ----------------
print("\n=== 7. 阻抗:Z_L = jωL,Z_C = 1/(jωC) ===")
f = 7.1e6
w = 2 * np.pi * f
L, Cap = 1e-6, 100e-12
zl, zc = 1j * w * L, 1 / (1j * w * Cap)
print(f"f = 7.1 MHz:1 μH 电感 Z = {zl.real:.0f} + j{zl.imag:.2f} Ω,"
f"100 pF 电容 Z = {zc.real:.0f} - j{-zc.imag:.2f} Ω")
# ---------------- 8. 分贝 ----------------
print("\n=== 8. 分贝 ===")
print("dB 数 精确倍数 口诀")
trick = {1: "1.25", 2: "1.6", 3: "2", 4: "2.5", 5: "3.2", 6: "4", 7: "5", 8: "6.3",
9: "8", 10: "10"}
for n in range(1, 11):
print(f"{n:4d} {10 ** (n / 10):9.4f} {trick[n]}")
print("功率与 dBm:")
for p in (1e-3, 1.0, 5.0, 25.0, 100.0, 1500.0):
print(f" {p:>8g} W = {dbm(p):7.2f} dBm")
v0 = math.sqrt(1e-3 * 50)
print(f"50 Ω 上 0 dBm 的电压 = {v0:.4f} V = {20 * np.log10(v0 / 1e-6):.2f} dBμV")
print("S 表(IARU 第一区建议:每个 S 单位 6 dB,50 Ω):")
for s_unit in (1, 3, 5, 7, 9):
hf = -73 - 6 * (9 - s_unit)
vhf = hf - 20
print(f" S{s_unit}:HF {hf:5d} dBm({math.sqrt(watt(hf) * 50) * 1e6:7.3f} μV),"
f"VHF {vhf:5d} dBm({math.sqrt(watt(vhf) * 50) * 1e6:7.3f} μV)")
print(f" S9+20 dB(HF)= {-73 + 20} dBm")
print("功率相加(不相关信号):")
for a, b in ((0, 0), (-100, -110), (-100, -120)):
print(f" {a} dBm + {b} dBm = {dbm(watt(a) + watt(b)):.2f} dBm")
kT = 1.380649e-23 * 290
print(f"290 K 热噪声:{dbm(kT):.2f} dBm/Hz;12.5 kHz 带宽内 {dbm(kT * 12.5e3):.2f} dBm")
th = np.linspace(1e-6, np.pi - 1e-6, 200_001)
pattern = (np.cos(np.pi / 2 * np.cos(th)) / np.sin(th)) ** 2 # 半波偶极子的功率方向图
D = 2 / np.trapezoid(pattern * np.sin(th), th) # D = 4π U_max / ∮U dΩ
print(f"半波偶极子方向性系数 D = {D:.4f} = {db(D):.2f} dBi,所以 0 dBd = {db(D):.2f} dBi")
# ---------------- 9. 链路预算 ----------------
print("\n=== 9. 链路预算:145 MHz,30 km,视距无遮挡 ===")
const = 20 * np.log10(4 * np.pi * 1e3 * 1e6 / C)
print(f"FSPL = 20lg(d/km) + 20lg(f/MHz) + {const:.2f} dB")
d, f = 30e3, 145e6
fspl = 20 * np.log10(4 * np.pi * d / (C / f))
budget = [("发射功率 25 W", dbm(25.0)), ("发射端馈线损耗(假设)", -1.5),
("发射天线增益(假设)", 6.0), ("自由空间路径损耗", -fspl),
("接收天线增益(假设)", 3.0), ("接收端馈线损耗(假设)", -1.0)]
level = 0.0
for name, val in budget:
level += val
print(f" {val:+8.2f} dB → {level:8.2f} dBm {name}")
print(f"接收功率 {level:.2f} dBm,比灵敏度 -121 dBm 高 {level + 121:.1f} dB")
print(f"核对:只用 FSPL 算第 01 章的 5 W、10 km:{dbm(5.0) - 20 * np.log10(4 * np.pi * 1e4 / (C / 145e6)):.2f} dBm")
# ---------------- 画图:旋转相量与它的投影 ----------------
wt = np.linspace(0, 4 * np.pi, 400)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4), gridspec_kw=dict(width_ratios=[1, 2]))
ax1.plot(np.cos(wt), np.sin(wt), color="#b0afa9")
ang = np.radians(50)
ax1.annotate("", xy=(np.cos(ang), np.sin(ang)), xytext=(0, 0),
arrowprops=dict(arrowstyle="-|>", color="#2a78d6", lw=2))
ax1.plot([np.cos(ang)] * 2, [0, np.sin(ang)], "--", color="#eb6834")
ax1.set_aspect("equal")
ax1.set_title(r"$e^{j\omega t}$ 在复平面上旋转")
ax2.plot(wt, np.cos(wt), color="#eb6834", label=r"实部 $\cos\omega t$")
ax2.plot(wt, np.sin(wt), color="#2a78d6", label=r"虚部 $\sin\omega t$")
ax2.set_xlabel(r"$\omega t$ (rad)")
ax2.legend()
for ax in (ax1, ax2):
ax.grid(True, color="#e6e5e1")
fig.tight_layout()
plt.show()
运行后的完整输出:
=== 1. 正弦信号:100 W 发射机接 50 Ω 假负载 ===
有效值 V_rms = sqrt(P·R) = 70.71 V,峰值 V_p = 100.00 V,峰峰值 V_pp = 200.00 V
数值积分:一个周期内 v^2 的平均值开方 = 70.7107 V
7.1 MHz 时,60 度相位差相当于 23.47 ns 的时间差
=== 2. 积化和差:cos a · cos b = [cos(a-b) + cos(a+b)] / 2 ===
两边最大误差 2.8e-14
14.2 MHz × 5.2 MHz → 差频 9.0 MHz,和频 19.4 MHz
=== 3. 复数运算 ===
z1 = (3+4j),z2 = (1-2j)
z1 + z2 = (4+2j),z1 - z2 = (2+6j)
z1 · z2 = (11-2j),z1 / z2 = (-1+2j)
|z1| = 5.0,arg z1 = 53.13°,共轭 = (3-4j)
极坐标:z1 = 5.0000∠53.13°,z2 = 2.2361∠-63.43°,z1·z2 = 11.1803∠-10.30°
模相乘 11.1803,角相加 -10.30°
arg(-1 - 1j):atan(b/a) 给出 45°,atan2 给出 -135°(正确)
=== 4. 欧拉公式:e^{jθ} = cos θ + j sin θ ===
泰勒级数前 2 项:1.000000 + j1.047198,误差 5.3e-01
泰勒级数前 3 项:0.451689 + j1.047198,误差 1.9e-01
泰勒级数前 4 项:0.451689 + j0.855801,误差 4.9e-02
泰勒级数前 6 项:0.501796 + j0.866295,误差 1.8e-03
泰勒级数前 9 项:0.500000 + j0.866021,误差 4.2e-06
泰勒级数前 12 项:0.500000 + j0.866025,误差 3.6e-09
cos(π/3) + j sin(π/3) = 0.500000 + j0.866025
e^(jπ) + 1 = 0.0e+00+1.2e-16j
=== 5. 相量:10 cos(ωt + 30°) + 5 cos(ωt - 60°) ===
V1 = 8.660 + j5.000,V2 = 2.500 - j4.330
V1 + V2 = 11.160 + j0.670 = 11.1803∠3.43°
时域采样核对:最大值 11.1803,出现在 ωt = 356.57°,即相位 3.43°
=== 6. 多径:直射波 1 + 反射波 0.8·e^{-jΔφ} ===
同相叠加:1.8 倍(+5.11 dB),反相抵消:0.2 倍(-13.98 dB),起伏 19.1 dB
145 MHz:λ = 2.068 m。直射波与反射波相向而来时,零点间隔 λ/2 = 1.034 m
车速 60 km/h(16.67 m/s)时,每秒穿过 16.1 个零点
=== 7. 阻抗:Z_L = jωL,Z_C = 1/(jωC) ===
f = 7.1 MHz:1 μH 电感 Z = 0 + j44.61 Ω,100 pF 电容 Z = 0 - j224.16 Ω
=== 8. 分贝 ===
dB 数 精确倍数 口诀
1 1.2589 1.25
2 1.5849 1.6
3 1.9953 2
4 2.5119 2.5
5 3.1623 3.2
6 3.9811 4
7 5.0119 5
8 6.3096 6.3
9 7.9433 8
10 10.0000 10
功率与 dBm:
0.001 W = 0.00 dBm
1 W = 30.00 dBm
5 W = 36.99 dBm
25 W = 43.98 dBm
100 W = 50.00 dBm
1500 W = 61.76 dBm
50 Ω 上 0 dBm 的电压 = 0.2236 V = 106.99 dBμV
S 表(IARU 第一区建议:每个 S 单位 6 dB,50 Ω):
S1:HF -121 dBm( 0.199 μV),VHF -141 dBm( 0.020 μV)
S3:HF -109 dBm( 0.793 μV),VHF -129 dBm( 0.079 μV)
S5:HF -97 dBm( 3.159 μV),VHF -117 dBm( 0.316 μV)
S7:HF -85 dBm( 12.574 μV),VHF -105 dBm( 1.257 μV)
S9:HF -73 dBm( 50.059 μV),VHF -93 dBm( 5.006 μV)
S9+20 dB(HF)= -53 dBm
功率相加(不相关信号):
0 dBm + 0 dBm = 3.01 dBm
-100 dBm + -110 dBm = -99.59 dBm
-100 dBm + -120 dBm = -99.96 dBm
290 K 热噪声:-173.98 dBm/Hz;12.5 kHz 带宽内 -133.01 dBm
半波偶极子方向性系数 D = 1.6409 = 2.15 dBi,所以 0 dBd = 2.15 dBi
=== 9. 链路预算:145 MHz,30 km,视距无遮挡 ===
FSPL = 20lg(d/km) + 20lg(f/MHz) + 32.45 dB
+43.98 dB → 43.98 dBm 发射功率 25 W
-1.50 dB → 42.48 dBm 发射端馈线损耗(假设)
+6.00 dB → 48.48 dBm 发射天线增益(假设)
-105.22 dB → -56.74 dBm 自由空间路径损耗
+3.00 dB → -53.74 dBm 接收天线增益(假设)
-1.00 dB → -54.74 dBm 接收端馈线损耗(假设)
接收功率 -54.74 dBm,比灵敏度 -121 dBm 高 66.3 dB
核对:只用 FSPL 算第 01 章的 5 W、10 km:-58.69 dBm