无线电自学教程 02:数学工具箱——正弦、复数、相量与分贝

0 阅读6分钟

系列导航:目录 | 上一章:什么是无线电 | 下一章:电路基础

本章目标:读完本章,你将能够

  • 用振幅、频率、相位描述一个正弦信号,把相位差换算成时间差,算出峰值、峰峰值和有效值;
  • 用积化和差公式解释“两个频率相乘会产生和频与差频”,这是混频器和超外差接收机的数学基础;
  • 熟练进行复数的四则运算,在直角坐标和极坐标之间互相转换;
  • 理解并证明欧拉公式 ejθ=cos⁡θ+jsin⁡θe^{j\theta} = \cos\theta + j\sin\theta,把正弦信号看成复平面上旋转的相量;
  • 用相量计算同频正弦的叠加,并用它解释多径衰落;
  • 熟练使用 dB、dBm、dBμV、dBi、dBd 和 S 表读数,做出一份完整的链路预算;
  • 用 NumPy 处理复数和数组,用 Matplotlib 画图。

前置知识:高中三角函数(和角公式)和对数。第一、三节用到导数和定积分的基本概念,第三节用到泰勒级数(只需知道“函数可以展开成幂级数”)。

无线电工程师每天都在和四样数学工具打交道:

  1. 正弦函数:载波、本振、音频,无线电里几乎所有信号都由正弦波构成;
  2. 复数:电容、电感的阻抗,正交(IQ)信号,软件无线电里的每一个采样点,都是复数;
  3. 相量:把“同频正弦的加减和求导”变成“复数的加减和乘法”,第 03 章分析交流电路全靠它;
  4. 分贝:从 100 W 的发射机到 0.2 μV 的接收灵敏度,功率相差 17 个数量级,没有分贝几乎没法讨论。

本章把这四样工具一次讲清楚。每一样都结合无线电的实际例子:负载上的电压、混频器、多径衰落、S 表读数、链路预算。最后用一节介绍 NumPy 和 Matplotlib,后面所有章节的代码都建立在它们之上。

一、正弦信号:无线电的“原子”

1. 三个参数

一个正弦信号可以写成

v(t)=Acos⁡(2πft+φ)=Acos⁡(ωt+φ)v(t) = A\cos(2\pi f t + \varphi) = A\cos(\omega t + \varphi)

它由三个参数完全确定:

符号名称单位含义
AA振幅(峰值)V、A、V/m 等偏离零点的最大值
ff频率Hz每秒重复的次数;ω=2πf\omega = 2\pi f 是角频率,单位 rad/s
φ\varphi初相位弧度或度t=0t = 0 时刻处在一个周期的哪个位置

本教程统一用余弦 cos⁡\cos 作为“标准”正弦信号,正弦函数可以用 sin⁡x=cos⁡(x−90°)\sin x = \cos(x - 90°) 换过来。角度在公式里一律用弧度,在叙述和图表里为了直观常用度,180°=π180° = \pi rad。

2. 相位差就是时间差

把 cos⁡(ωt+φ)\cos(\omega t + \varphi) 改写成 cos⁡[ω(t+φ/ω)]\cos[\omega(t + \varphi/\omega)],可以看出:初相位 φ\varphi 相当于把波形在时间上提前了

Δt=φω=φ360° T\Delta t = \frac{\varphi}{\omega} = \frac{\varphi}{360°}\,T

φ>0\varphi > 0 称为超前,φ<0\varphi < 0 称为滞后。

fig1_sinusoid.png

图 1:100 W 发射机接 50 Ω 假负载时,负载两端的电压(f = 7.1 MHz)。虚线超前 60°,相当于提前 T/6。

例如在 7.1 MHz,周期 T=140.8T = 140.8 ns,60° 的相位差对应 140.8/6=23.47140.8/6 = 23.47 ns 的时间差。在射频电路里,“相位”和“时间延迟”是同一件事的两种说法:一段电缆、一个滤波器让信号延迟了多少纳秒,就等于让它的相位滞后了多少度。

3. 峰值、峰峰值和有效值

描述正弦电压的“大小”,常用三个量:

  • 峰值 VpV_p:最大值,即振幅 AA;
  • 峰峰值 Vpp=2VpV_{pp} = 2V_p:从最低点到最高点,示波器上最容易直接读出;
  • 有效值(均方根值,RMS)VrmsV_{\mathrm{rms}}:产生相同平均功率的直流电压。

有效值的定义是“平方的平均值再开方”:

Vrms=1T∫0Tv2(t) dtV_{\mathrm{rms}} = \sqrt{\frac{1}{T}\int_0^T v^2(t)\,dt}

对正弦信号,利用 cos⁡2x=1+cos⁡2x2\cos^2 x = \dfrac{1 + \cos 2x}{2}:

1T∫0TVp2cos⁡2(ωt) dt=Vp2T∫0T1+cos⁡2ωt2 dt=Vp22\frac{1}{T}\int_0^T V_p^2\cos^2(\omega t)\,dt = \frac{V_p^2}{T}\int_0^T \frac{1 + \cos 2\omega t}{2}\,dt = \frac{V_p^2}{2}

因为 cos⁡2ωt\cos 2\omega t 在一个周期内的积分为零。所以

 Vrms=Vp2≈0.707 Vp \boxed{\ V_{\mathrm{rms}} = \frac{V_p}{\sqrt 2} \approx 0.707\,V_p\ }

电阻 RR 上的平均功率是 P=Vrms2/RP = V_{\mathrm{rms}}^2/R。我们平时说的“220 V 市电”“100 W 发射机”,指的都是有效值和平均功率。

例:100 W 发射机接 50 Ω 假负载。 附录代码算出:

Vrms=PR=100×50=70.71 V,Vp=100.00 V,Vpp=200.00 VV_{\mathrm{rms}} = \sqrt{PR} = \sqrt{100\times 50} = 70.71\ \mathrm{V},\qquad V_p = 100.00\ \mathrm{V},\qquad V_{pp} = 200.00\ \mathrm{V}

代码还对一个周期的采样直接求了均方根,结果 70.7107 V,和公式一致。反过来,如果你用示波器(配合衰减器)测出假负载上的峰峰值,就能算出发射功率:

P=Vrms2R=(Vpp/22)2R=Vpp28RP = \frac{V_{\mathrm{rms}}^2}{R} = \frac{(V_{pp}/2\sqrt2)^2}{R} = \frac{V_{pp}^2}{8R}

4. 积化和差:两个频率相乘,产生和频与差频

由余弦的和角公式

cos⁡(a+b)=cos⁡acos⁡b−sin⁡asin⁡b,cos⁡(a−b)=cos⁡acos⁡b+sin⁡asin⁡b\cos(a+b) = \cos a\cos b - \sin a\sin b,\qquad \cos(a-b) = \cos a\cos b + \sin a\sin b

两式相加再除以 2,得到积化和差公式:

 cos⁡a⋅cos⁡b=12cos⁡(a−b)+12cos⁡(a+b) \boxed{\ \cos a\cdot\cos b = \frac{1}{2}\cos(a-b) + \frac{1}{2}\cos(a+b)\ }

令 a=2πf1ta = 2\pi f_1 t、b=2πf2tb = 2\pi f_2 t,它告诉我们:两个不同频率的正弦信号相乘,结果是两个新的频率:差频 f1−f2f_1 - f_2 和和频 f1+f2f_1 + f_2,原来的 f1f_1、f2f_2 反而不见了。

fig2_mixing.png

图 2:14.2 MHz 的信号乘以 5.2 MHz 的本振,结果正好是 9.0 MHz 和 19.4 MHz 两个余弦之和。

附录代码在 2 μs 内取了 20 万个采样点,两边的最大误差只有 2.8×10−142.8\times10^{-14},也就是计算机的舍入误差。

这个公式是整个无线电接收技术的基石。接收机里有一个叫混频器的电路,它把收到的信号和本机振荡器(本振)的信号相乘。比如要收 14.2 MHz 的短波电台,让本振工作在 5.2 MHz,相乘后得到 9.0 MHz 和 19.4 MHz;再用一个固定在 9.0 MHz 的滤波器取出差频,就把任意电台“搬”到了一个固定的中频上。想收别的电台,只需改变本振频率。这就是阿姆斯特朗发明的超外差原理,第 15 章会详细讨论(包括这个方案带来的“镜像频率”问题,见练习 2)。

另一个常用的特例是 a=ba = b:

cos⁡2(ωt)=12+12cos⁡(2ωt)\cos^2(\omega t) = \frac{1}{2} + \frac{1}{2}\cos(2\omega t)

一个正弦信号经过“平方”这样的非线性运算,就会产生直流分量和二倍频(二次谐波)。检波器、倍频器的原理是它,发射机为什么会产生谐波干扰、为什么必须加滤波器,原因也是它。**线性电路不会产生新频率,非线性电路会。**这是射频电路里反复出现的主题。

5. 同频正弦相加,还是同频正弦

另一个经常遇到的问题是:两个同频率但振幅、相位不同的正弦信号相加,结果是什么?比如

10cos⁡(ωt+30°)+5cos⁡(ωt−60°)= ?10\cos(\omega t + 30°) + 5\cos(\omega t - 60°) = \ ?

可以证明结果仍是同一频率的正弦,只是振幅和相位变了。用和角公式展开、合并、再凑回一个余弦,能算出来,但很繁琐。接收天线同时收到直射波和地面反射波时,遇到的就是这个问题。下面两节介绍的复数和相量,能把它变成简单的向量加法。

二、复数

1. 定义

引入一个数 jj,规定

j2=−1j^2 = -1

形如 z=a+jbz = a + jb(aa、bb 为实数)的数称为复数,a=Re za = \mathrm{Re}\,z 是实部,b=Im zb = \mathrm{Im}\,z 是虚部。数学和物理书里常用 ii,电子工程里习惯用 jj,因为 ii 已经被电流占用了。Python 也用 j:3 + 4j 就是一个复数。

复数可以画在复平面上:横轴是实部,纵轴是虚部,z=a+jbz = a + jb 对应点 (a, b)(a,\ b),或者从原点指向它的箭头。

2. 四则运算

按普通代数运算,遇到 j2j^2 就换成 −1-1:

运算公式
加减(a+jb)±(c+jd)=(a±c)+j(b±d)(a + jb) \pm (c + jd) = (a \pm c) + j(b \pm d)
乘法(a+jb)(c+jd)=(ac−bd)+j(ad+bc)(a + jb)(c + jd) = (ac - bd) + j(ad + bc)
共轭z∗=a−jbz^* = a - jb, zz∗=a2+b2\ z z^* = a^2 + b^2
除法a+jbc+jd=(a+jb)(c−jd)c2+d2\dfrac{a + jb}{c + jd} = \dfrac{(a + jb)(c - jd)}{c^2 + d^2}(分子分母同乘分母的共轭)

以 z1=3+4jz_1 = 3 + 4j、z2=1−2jz_2 = 1 - 2j 为例,附录代码给出:

运算结果
z1+z2z_1 + z_24+2j4 + 2j
z1−z2z_1 - z_22+6j2 + 6j
z1z2z_1 z_2(3+8)+j(−6+4)=11−2j(3 + 8) + j(-6 + 4) = 11 - 2j
z1/z2z_1 / z_2(3+4j)(1+2j)1+4=−5+10j5=−1+2j\dfrac{(3 + 4j)(1 + 2j)}{1 + 4} = \dfrac{-5 + 10j}{5} = -1 + 2j
z1∗z_1^*3−4j3 - 4j

加减法就是向量的加减(平行四边形法则),这一点后面画相量图时会用到。

3. 极坐标形式

复平面上的点也可以用长度和角度描述:

∣z∣=a2+b2,θ=arg⁡z=atan2⁡(b, a)|z| = \sqrt{a^2 + b^2},\qquad \theta = \arg z = \operatorname{atan2}(b,\ a)

∣z∣|z| 称为模,θ\theta 称为辐角。反过来,a=∣z∣cos⁡θa = |z|\cos\theta,b=∣z∣sin⁡θb = |z|\sin\theta。工程上常把复数写成 ∣z∣∠θ|z|\angle\theta,例如 3+4j=5∠53.13°3 + 4j = 5\angle 53.13°。

注意 atan2:辐角不能简单地用 arctan⁡(b/a)\arctan(b/a) 计算,因为它分不清 (a, b)(a,\ b) 和 (−a, −b)(-a,\ -b)。例如 −1−j-1 - j 在第三象限,辐角应为 −135°-135°,而 arctan⁡−1−1=45°\arctan\frac{-1}{-1} = 45°。附录代码同时算了这两种方法,atan2 给出了正确的 −135°-135°。NumPy 的 np.angle 内部用的就是 atan2。

fig3_complex_plane.png

图 3:左:复数的直角坐标与极坐标。右:复数乘法,模相乘、角相加;乘以 j 就是逆时针旋转 90°。

极坐标的好处在乘法上特别明显。附录代码算出 z1=5∠53.13°z_1 = 5\angle 53.13°,z2=2.2361∠−63.43°z_2 = 2.2361\angle -63.43°,而

z1z2=11−2j=11.1803∠−10.30°z_1 z_2 = 11 - 2j = 11.1803\angle -10.30°

正好是 5×2.2361=11.18035 \times 2.2361 = 11.1803,53.13°+(−63.43°)=−10.30°53.13° + (-63.43°) = -10.30°。**复数相乘,模相乘,辐角相加。**为什么会这样,欧拉公式会给出答案。

一个特例:j=1∠90°j = 1\angle 90°,所以乘以 jj 就是把向量逆时针旋转 90°,长度不变。jz1=j(3+4j)=−4+3jjz_1 = j(3 + 4j) = -4 + 3j,见图 3 右。第 03 章会看到,电感上电压超前电流 90°,正是因为它的阻抗里有一个 jj。

三、欧拉公式

1. 公式与证明

 ejθ=cos⁡θ+jsin⁡θ \boxed{\ e^{j\theta} = \cos\theta + j\sin\theta\ }

这就是欧拉公式。它把指数函数和三角函数联系在一起,是整个信号处理和射频工程最常用的公式。

证明用泰勒级数。我们知道

ex=∑n=0∞xnn!=1+x+x22!+x33!+x44!+⋯e^x = \sum_{n=0}^{\infty}\frac{x^n}{n!} = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \cdots
cos⁡θ=1−θ22!+θ44!−⋯ ,sin⁡θ=θ−θ33!+θ55!−⋯\cos\theta = 1 - \frac{\theta^2}{2!} + \frac{\theta^4}{4!} - \cdots,\qquad \sin\theta = \theta - \frac{\theta^3}{3!} + \frac{\theta^5}{5!} - \cdots

把 x=jθx = j\theta 代入 exe^x,利用 j2=−1j^2 = -1、j3=−jj^3 = -j、j4=1j^4 = 1,周期为 4:

ejθ=1+jθ−θ22!−jθ33!+θ44!+jθ55!−⋯e^{j\theta} = 1 + j\theta - \frac{\theta^2}{2!} - j\frac{\theta^3}{3!} + \frac{\theta^4}{4!} + j\frac{\theta^5}{5!} - \cdots

把实部和虚部分开,实部恰好是 cos⁡θ\cos\theta 的级数,虚部恰好是 sin⁡θ\sin\theta 的级数。证毕。

附录代码对 θ=π/3\theta = \pi/3 逐项累加这个级数:

累加项数部分和与 cos⁡π3+jsin⁡π3\cos\frac{\pi}{3} + j\sin\frac{\pi}{3} 的误差
21.000000+j1.0471981.000000 + j1.0471985.3×10−15.3\times10^{-1}
30.451689+j1.0471980.451689 + j1.0471981.9×10−11.9\times10^{-1}
40.451689+j0.8558010.451689 + j0.8558014.9×10−24.9\times10^{-2}
60.501796+j0.8662950.501796 + j0.8662951.8×10−31.8\times10^{-3}
90.500000+j0.8660210.500000 + j0.8660214.2×10−64.2\times10^{-6}
120.500000+j0.8660250.500000 + j0.8660253.6×10−93.6\times10^{-9}

12 项之后误差已经只有 10−910^{-9} 量级,收敛到 0.5+j0.8660250.5 + j0.866025。取 θ=π\theta = \pi,得到著名的 ejπ+1=0e^{j\pi} + 1 = 0,代码算出的结果是 1.2×10−16j1.2\times10^{-16}j,同样只是舍入误差。

有了欧拉公式,极坐标就可以写成指数形式:

z=∣z∣∠θ=∣z∣ ejθz = |z|\angle\theta = |z|\,e^{j\theta}

复数乘法“模相乘、角相加”也就一目了然:∣z1∣ejθ1⋅∣z2∣ejθ2=∣z1∣∣z2∣ ej(θ1+θ2)|z_1|e^{j\theta_1}\cdot|z_2|e^{j\theta_2} = |z_1||z_2|\,e^{j(\theta_1 + \theta_2)},指数相乘就是指数相加。

2. 旋转的相量

令 θ=ωt\theta = \omega t,ejωte^{j\omega t} 就是复平面单位圆上一个以角速度 ω\omega 逆时针旋转的点,每秒转 ff 圈。它在实轴上的投影是 cos⁡ωt\cos\omega t,在虚轴上的投影是 sin⁡ωt\sin\omega t:

fig4_euler.png

图 4:旋转的相量 ejωte^{j\omega t}。右上:投影到虚轴,得到正弦;左下:投影到实轴,得到余弦(时间轴向下)。

这给了我们看待正弦信号的新视角:一个正弦信号,就是一个旋转相量在实轴上的投影。

把欧拉公式和它的共轭 e−jθ=cos⁡θ−jsin⁡θe^{-j\theta} = \cos\theta - j\sin\theta 相加、相减,得到

cos⁡θ=ejθ+e−jθ2,sin⁡θ=ejθ−e−jθ2j\cos\theta = \frac{e^{j\theta} + e^{-j\theta}}{2},\qquad \sin\theta = \frac{e^{j\theta} - e^{-j\theta}}{2j}

一个实数余弦等于两个反向旋转的相量之和:一个逆时针转(频率 +f+f),一个顺时针转(频率 −f-f),虚部正好抵消。这就是频谱图上会出现“负频率”的原因,第 04 章讲傅里叶变换、第 19 章讲 IQ 信号时还会回来。

四、相量

1. 定义

对于一个频率已知的正弦信号,利用欧拉公式可以写成

Acos⁡(ωt+φ)=Re{Aejφ ejωt}A\cos(\omega t + \varphi) = \mathrm{Re}\left\{A e^{j\varphi}\,e^{j\omega t}\right\}

括号里分成了两部分:ejωte^{j\omega t} 是旋转,所有同频率的信号都一样;AejφA e^{j\varphi} 是一个不随时间变化的复数,记录了这个信号独有的振幅和相位。后者就叫相量(phasor),通常用大写字母表示:

V=Aejφ=A∠φ\mathbf{V} = A e^{j\varphi} = A\angle\varphi

在一个只有单一频率的系统里(比如第 03 章的交流电路,或者只看载波的天线问题),ejωte^{j\omega t} 是公共因子,可以先扔掉,只对相量运算,最后再乘回去取实部。

2. 同频正弦相加 = 相量相加

因为取实部和加法可以交换顺序,

A1cos⁡(ωt+φ1)+A2cos⁡(ωt+φ2)=Re{(V1+V2) ejωt}A_1\cos(\omega t + \varphi_1) + A_2\cos(\omega t + \varphi_2) = \mathrm{Re}\left\{(\mathbf{V}_1 + \mathbf{V}_2)\,e^{j\omega t}\right\}

**同频正弦相加,只需把相量相加。**回到第一节第 5 小节的问题:

V1=10∠30°=8.660+j5.000,V2=5∠−60°=2.500−j4.330\mathbf{V}_1 = 10\angle 30° = 8.660 + j5.000,\qquad \mathbf{V}_2 = 5\angle -60° = 2.500 - j4.330
V1+V2=11.160+j0.670=11.18∠3.43°\mathbf{V}_1 + \mathbf{V}_2 = 11.160 + j0.670 = 11.18\angle 3.43°

所以

10cos⁡(ωt+30°)+5cos⁡(ωt−60°)=11.18cos⁡(ωt+3.43°)10\cos(\omega t + 30°) + 5\cos(\omega t - 60°) = 11.18\cos(\omega t + 3.43°)

fig5_phasor_sum.png

图 5:左:相量图,两个相量首尾相接,像力的合成一样。右:时域核对,逐点相加的结果(绿)和相量算出的正弦(虚线)完全重合。

附录代码在一个周期内取了 360 万个点逐点相加,找到最大值 11.1803,出现在 ωt=356.57°\omega t = 356.57° 处,即相位 3.43°,和相量计算完全一致。注意合成振幅 11.18 小于 10+5=1510 + 5 = 15,因为两个分量的相位相差 90°,不是同时达到最大。

3. 应用:多径衰落

接收天线常常同时收到两路信号:一路直射过来,另一路经地面、楼房或山体反射过来。反射路径比直射路径长 Δd\Delta d,所以反射波晚到,相位滞后

Δφ=2πΔdλ\Delta\varphi = 2\pi\frac{\Delta d}{\lambda}

设反射波的振幅是直射波的 aa 倍(0<a<10 < a < 1),以直射波为参考,合成信号的相量是

R=1+a e−jΔφ\mathbf{R} = 1 + a\,e^{-j\Delta\varphi}

它的模的平方为

∣R∣2=(1+acos⁡Δφ)2+(asin⁡Δφ)2=1+a2+2acos⁡Δφ|\mathbf{R}|^2 = (1 + a\cos\Delta\varphi)^2 + (a\sin\Delta\varphi)^2 = 1 + a^2 + 2a\cos\Delta\varphi
  • 路程差是波长的整数倍时,cos⁡Δφ=1\cos\Delta\varphi = 1,两路同相叠加,∣R∣=1+a|\mathbf{R}| = 1 + a;
  • 路程差是半波长的奇数倍时,cos⁡Δφ=−1\cos\Delta\varphi = -1,两路反相抵消,∣R∣=1−a|\mathbf{R}| = 1 - a。

fig6_multipath.png

图 6:直射波加反射波的合成强度随路程差的变化。路程差每变化一个波长,信号就经历一次起伏;反射越强,谷底越深。

当 a=0.8a = 0.8 时,附录代码算出最强为 1.8 倍(+5.11 dB),最弱只有 0.2 倍(−13.98 dB),起伏达 19.1 dB。如果反射波和直射波一样强(a=1a = 1),谷底就是 0,信号完全消失。

这就是多径衰落。在 2 米波段(145 MHz,λ=2.068\lambda = 2.068 m),如果直射波从身后来、反射波从前方的楼房反射回来,两者相向传播,你每移动 λ/2=1.034\lambda/2 = 1.034 m,路程差就变化一个波长,经历一次衰落。开车以 60 km/h(16.67 m/s)行驶时,每秒要穿过 16.1 个“零点”,听起来就是信号一阵一阵地“哒哒”抖动,英文叫 picket fencing(栅栏效应)。

这给手台用户一个很实用的建议:信号差的时候,往旁边挪半米试试,也许就从谷底移到了峰顶。第 10 章会进一步讨论多径和衰落的统计规律。

4. 求导变成乘以 jω

相量的另一个重要性质:

ddt Re{Vejωt}=Re{jωV ejωt}\frac{d}{dt}\,\mathrm{Re}\left\{\mathbf{V}e^{j\omega t}\right\} = \mathrm{Re}\left\{j\omega\mathbf{V}\,e^{j\omega t}\right\}

对正弦信号求导,在相量上就是乘以 jωj\omega:振幅乘以 ω\omega,相位超前 90°。这让微分方程变成了代数方程。

把它用到电感和电容上(第 03 章详细推导):

  • 电感:v=L didtv = L\,\dfrac{di}{dt},相量形式 V=jωL I\mathbf{V} = j\omega L\,\mathbf{I},所以电感的阻抗是 ZL=jωLZ_L = j\omega L;
  • 电容:i=C dvdti = C\,\dfrac{dv}{dt},相量形式 I=jωC V\mathbf{I} = j\omega C\,\mathbf{V},所以电容的阻抗是 ZC=1jωC=−jωCZ_C = \dfrac{1}{j\omega C} = -\dfrac{j}{\omega C}。

在 7.1 MHz,附录代码算出 1 μH 电感的阻抗是 +j44.61 Ω+j44.61\ \Omega,100 pF 电容的阻抗是 −j224.16 Ω-j224.16\ \Omega。有了复数阻抗,交流电路就可以像直流电路一样用欧姆定律计算,只是所有量都换成了复数。

五、分贝

1. 为什么要用分贝

fig7_db_ruler.png

图 7:无线电里常见的功率电平,放在同一把“分贝尺”上。上方是对应的线性功率。

无线电里的功率跨度极大:一台 1500 W 的功率放大器输出 +61.8+61.8 dBm,而 1 Hz 带宽内的热噪声只有 −174-174 dBm,两者相差 236 dB,即 102310^{23} 倍以上。用瓦特写出来,一个是 1500,一个是 4×10−214\times10^{-21},根本没法放在同一张表里比较。

分贝的第二个好处更重要:信号经过一连串放大器、电缆、天线和传播路径,每一级都是乘上一个增益或损耗;取对数之后,乘法变成加法:

lg⁡(G1G2G3)=lg⁡G1+lg⁡G2+lg⁡G3\lg(G_1 G_2 G_3) = \lg G_1 + \lg G_2 + \lg G_3

这就是为什么无线电工程师总是用 dB 来做“链路预算”。

2. 定义

两个功率之比的分贝数定义为

 GdB=10lg⁡P2P1 \boxed{\ G_{\mathrm{dB}} = 10\lg\frac{P_2}{P_1}\ }

其中 lg⁡\lg 是以 10 为底的对数。比值大于 1 时 dB 为正(增益),小于 1 时为负(损耗),等于 1 时为 0 dB。

如果比较的是电压(或电流、场强),由于功率与电压的平方成正比(P=V2/RP = V^2/R),在相同阻抗下:

GdB=10lg⁡V22/RV12/R=20lg⁡V2V1G_{\mathrm{dB}} = 10\lg\frac{V_2^2/R}{V_1^2/R} = 20\lg\frac{V_2}{V_1}

所以电压翻倍是 +6 dB,功率翻倍是 +3 dB,两者说的是同一件事。注意前提是阻抗相同;比较 50 Ω 和 75 Ω 系统上的电压时,不能直接用 20lg⁡20\lg。

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 的精确倍数,以及好记的近似值:

dB12345678910
精确倍数1.25891.58491.99532.51193.16233.98115.01196.30967.943310
速算1.251.622.53.2456.3810

4. 绝对电平:dBm、dBW、dBμV

分贝本来只表示比值。如果固定一个参考值,它就能表示绝对大小:

单位参考值常见用途
dBm1 mW射频功率,最常用
dBW1 W大功率发射机、卫星 EIRP
dBμV1 μV接收机输入电压、EMC 测量
dBμV/m1 μV/m电场强度

P [dBm]=10lg⁡P1 mWP\,[\mathrm{dBm}] = 10\lg\dfrac{P}{1\ \mathrm{mW}},所以 dBW = dBm − 30。附录代码列出了几个常见功率:

功率1 mW1 W5 W25 W100 W1500 W
dBm0.0030.0036.9943.9850.0061.76

在 50 Ω 系统里,0 dBm 对应的电压是 10−3×50=0.2236\sqrt{10^{-3}\times 50} = 0.2236 V =106.99= 106.99 dBμV,所以

dBμV≈dBm+107(50 Ω)\mathrm{dB\mu V} \approx \mathrm{dBm} + 107\qquad (50\ \Omega)

例如手台灵敏度 −121-121 dBm 相当于 −14-14 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 之间差一个固定值:半波偶极子本身相对各向同性天线的增益。半波偶极子的方向图是

U(θ)∝[cos⁡(π2cos⁡θ)sin⁡θ]2U(\theta) \propto \left[\frac{\cos\left(\frac{\pi}{2}\cos\theta\right)}{\sin\theta}\right]^2

它的方向性系数等于最大辐射强度与平均辐射强度之比:

D=4π Umax⁡∮U dΩ=2∫0πcos⁡2(π2cos⁡θ)sin⁡θ dθD = \frac{4\pi\,U_{\max}}{\displaystyle\oint U\,d\Omega} = \frac{2}{\displaystyle\int_0^\pi \frac{\cos^2\left(\frac{\pi}{2}\cos\theta\right)}{\sin\theta}\,d\theta}

附录代码用数值积分算出 D=1.6409D = 1.6409,即 10lg⁡1.6409=2.1510\lg 1.6409 = 2.15 dBi。所以

dBi=dBd+2.15\mathrm{dBi} = \mathrm{dBd} + 2.15

看天线广告时要留意:同一副天线,标 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 dBm0.199 μV−141 dBm0.020 μV
S3−109 dBm0.793 μV−129 dBm0.079 μV
S5−97 dBm3.159 μV−117 dBm0.316 μV
S7−85 dBm12.574 μV−105 dBm1.257 μV
S9−73 dBm50.059 μV−93 dBm5.006 μV

HF 的 S9 + 20 dB 就是 −53 dBm。通联时对方报告“你的信号 S7”,你就知道它大约在 −85 dBm。不过要注意,许多电台的 S 表并没有严格按这个标准校准,读数只能作参考。

7. 分贝不能直接相加

一个常见的错误是把两个用 dBm 表示的功率直接相加。正确的做法是先换回瓦特,相加,再换回 dBm:

功率 A功率 BA + B
0 dBm0 dBm3.01 dBm
−100 dBm−110 dBm−99.59 dBm
−100 dBm−120 dBm−99.96 dBm

两个相等的功率相加,总功率加 3 dB;一个比另一个弱 20 dB 时,它的贡献几乎可以忽略。这在计算噪声时很有用:290 K 下的热噪声功率谱密度是 kT=−173.98kT = -173.98 dBm/Hz,在 12.5 kHz 的 FM 信道带宽内是 −173.98+10lg⁡12500=−133.01-173.98 + 10\lg 12500 = -133.01 dBm。第 14 章讨论灵敏度时会用到这个数字。

(“dB 加 dB”在另一种意义下是对的:增益和损耗可以直接加减,因为它们表示的是乘法关系。一个 20 dB 的放大器后面接一段 3 dB 损耗的电缆,总增益就是 17 dB。)

8. 链路预算

把第 01 章的平方反比公式推广到收发天线都有增益的情况:

Pr=Pt Gt Gr(λ4πd)2P_r = P_t\,G_t\,G_r\left(\frac{\lambda}{4\pi d}\right)^2

这就是 Friis 传输公式,第 10 章会详细推导。其中 (4πdλ)2\left(\frac{4\pi d}{\lambda}\right)^2 称为自由空间路径损耗(FSPL)。取分贝:

Pr [dBm]=Pt [dBm]+Gt [dBi]+Gr [dBi]−FSPL [dB]P_r\,[\mathrm{dBm}] = P_t\,[\mathrm{dBm}] + G_t\,[\mathrm{dBi}] + G_r\,[\mathrm{dBi}] - \mathrm{FSPL}\,[\mathrm{dB}]
FSPL=20lg⁡4πdλ=20lg⁡dkm+20lg⁡fMHz+32.45\mathrm{FSPL} = 20\lg\frac{4\pi d}{\lambda} = 20\lg d_{\mathrm{km}} + 20\lg f_{\mathrm{MHz}} + 32.45

常数 32.45 是把 dd 用 km、ff 用 MHz 表示时 20lg⁡4π×103×106c20\lg\frac{4\pi\times10^3\times10^6}{c} 的值。用它重算第 01 章的例子(5 W、145 MHz、10 km、各向同性天线),得到 −58.69 dBm,和当时的结果一致。

下面是一条更完整的 2 米波段链路:一台 25 W 的车载电台,经过馈线和天线,与 30 km 外的另一个电台通联。天线增益和馈线损耗是假设的典型值,并假设视距无遮挡:

项目增益 / 损耗电平
发射功率 25 W+43.98 dB43.98 dBm
发射端馈线损耗(假设)−1.50 dB42.48 dBm
发射天线增益(假设)+6.00 dB48.48 dBm
自由空间路径损耗(30 km)−105.22 dB−56.74 dBm
接收天线增益(假设)+3.00 dB−53.74 dBm
接收端馈线损耗(假设)−1.00 dB−54.74 dBm

fig8_link_budget.png 图 8:链路预算的“瀑布图”。每一级增益或损耗都只是在 dB 上加减。

接收功率 −54.74 dBm,比灵敏度高 66.3 dB。这 66 dB 的余量用来抵消现实中的各种额外损耗:山体和建筑物的遮挡、多径衰落、天线没对准、雨雪……第 10 章会逐一讨论。用 dB 做链路预算的好处在于:想改一个条件(比如换一副增益更高的天线),只需在表里改一行加减。

六、对数坐标

第 01 章的电磁波谱、天线尺寸、平方反比图都用了对数坐标:坐标轴上等距离的刻度代表等倍数而不是等差。1、10、100、1000 之间的距离相等。读对数坐标时记住两点:

  1. 每一大格(一个十倍程)代表乘以 10。两个大刻度之间的小刻度依次是 2、3、…、9 倍,越往右越挤;
  2. 在双对数坐标上,幂函数 y=xny = x^n 是一条直线,斜率等于 nn。所以第 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.        ]

几个要点:

  1. 复数是 Python 的内置类型:3 + 4j 直接就是复数,abs() 求模;NumPy 的 np.angle(z, deg=True) 求辐角,np.exp(1j * theta) 就是欧拉公式;
  2. 向量化:NumPy 的函数作用在整个数组上,例如最后一行一次算出了四个功率的 dBm,不需要写循环。后面处理成千上万个采样点时,这既简洁又快;
  3. 画图:Matplotlib 的基本用法是 plt.plot(x, y) 画曲线、plt.xlabel() 加坐标轴标题、plt.show() 显示。附录代码最后画出了图 4 的简化版。每一章的配图脚本 make_figures.py 都放在文章旁边,可以对照着学习更多画法。

小结

  1. 正弦信号 Acos⁡(ωt+φ)A\cos(\omega t + \varphi) 由振幅、频率、相位三个参数确定。相位差等于时间差:Δt=φ360°T\Delta t = \frac{\varphi}{360°}T。正弦电压的有效值 Vrms=Vp/2V_{\mathrm{rms}} = V_p/\sqrt2,电阻上的平均功率 P=Vrms2/R=Vpp2/8RP = V_{\mathrm{rms}}^2/R = V_{pp}^2/8R。
  2. 积化和差:cos⁡acos⁡b=12cos⁡(a−b)+12cos⁡(a+b)\cos a\cos b = \frac12\cos(a-b) + \frac12\cos(a+b)。两个频率相乘产生和频与差频,这是混频器和超外差接收机的原理;非线性运算会产生新频率,线性运算不会。
  3. 复数 a+jb=∣z∣∠θa + jb = |z|\angle\theta,辐角用 atan2 计算。加减按分量,乘除按极坐标:模相乘除、角相加减。乘以 jj 等于旋转 90°。
  4. 欧拉公式 ejθ=cos⁡θ+jsin⁡θe^{j\theta} = \cos\theta + j\sin\theta,可由泰勒级数证明。ejωte^{j\omega t} 是复平面上旋转的相量,正弦信号是它的投影;cos⁡θ\cos\theta 等于两个反向旋转相量之和,由此引出负频率。
  5. 相量 V=Aejφ\mathbf{V} = A e^{j\varphi} 记录正弦信号的振幅和相位。同频正弦相加就是相量相加,求导就是乘以 jωj\omega,由此得到电感、电容的阻抗 jωLj\omega L、1/(jωC)1/(j\omega C)。
  6. 多径衰落:直射波与反射波的合成 ∣1+ae−j2πΔd/λ∣|1 + a e^{-j2\pi\Delta d/\lambda}| 在 1−a1 - a 与 1+a1 + a 之间起伏,路程差每变化一个波长起伏一次。
  7. 分贝:功率比 10lg⁡10\lg,电压比 20lg⁡20\lg(同阻抗)。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。增益和损耗可以直接加减,两个功率相加则必须先换回瓦特。
  8. 链路预算:Pr=Pt+Gt+Gr−FSPLP_r = P_t + G_t + G_r - \mathrm{FSPL},FSPL=20lg⁡dkm+20lg⁡fMHz+32.45\mathrm{FSPL} = 20\lg d_{\mathrm{km}} + 20\lg f_{\mathrm{MHz}} + 32.45。

下一章,我们用这些工具分析电路:电阻、电容、电感、复数阻抗,以及无线电里最重要的电路之一——LC 谐振回路。

练习题

  1. (有效值) 用示波器测得 50 Ω 假负载两端的电压峰峰值为 63.2 V。发射机的输出功率是多少?
  2. (混频与镜像) 一台接收机的中频是 9.0 MHz。要接收 7.100 MHz 的信号,本振调到 16.100 MHz。(a) 混频后得到哪两个频率?(b) 另外还有一个输入频率,和这个本振混频后也会落在 9.0 MHz 上,它是多少?
  3. (复数运算) 计算 (2+j)(1−3j)(2 + j)(1 - 3j) 和 2+j1−3j\dfrac{2 + j}{1 - 3j},结果分别写成直角坐标和极坐标形式。
  4. (相量) (a) 三个振幅都是 1、相位分别为 0°、120°、240° 的同频正弦相加,结果是什么?(b) 把 3cos⁡ωt+4sin⁡ωt3\cos\omega t + 4\sin\omega t 写成 Acos⁡(ωt+φ)A\cos(\omega t + \varphi) 的形式。
  5. (dB 速算) 不用计算器,估算 23 dB、17 dB、−7 dB、36 dB 各对应多少倍功率,再用计算器核对。
  6. (绝对电平) (a) 0.5 W 是多少 dBm?(b) 50 Ω 系统中的 −107 dBm 约等于多少 dBμV、多少 μV?(c) HF 波段对方报告你的信号从 S5 升到了 S9,信号功率增加了多少 dB、多少倍?
  7. (馈线损耗) 一段 30 m 长的同轴电缆,假设它在 145 MHz 的损耗为 6 dB/100 m。电台输出 50 W,到达天线的功率是多少?
  8. (多径) 如果反射波振幅只有直射波的一半(a=0.5a = 0.5),合成信号的最强和最弱分别是多少 dB?
  9. (编程:链路预算) 修改附录代码第 9 部分,把距离从 30 km 改为 60 km,接收功率和余量各是多少?距离每增加一倍,路径损耗增加多少 dB?
  10. (噪声相加) 两个互不相关的噪声源功率相等,叠加后总噪声比单个噪声源高多少 dB?如果两路信号完全同相(比如练习 8 中直射波和反射波同相、a=1a = 1),叠加后功率又高多少 dB?两者为什么不同?

参考答案

  1. Vp=31.6V_p = 31.6 V,Vrms=31.6/2=22.34V_{\mathrm{rms}} = 31.6/\sqrt2 = 22.34 V,P=22.342/50=P = 22.34^2/50 = 9.99 W,约 10 W。或者直接用 P=Vpp2/8R=63.22/400=9.99P = V_{pp}^2/8R = 63.2^2/400 = 9.99 W。
  2. (a) 差频 16.1−7.1=16.1 - 7.1 = 9.0 MHz,和频 16.1+7.1=16.1 + 7.1 = 23.2 MHz。中频滤波器选出 9.0 MHz。(b) 输入为 16.1+9.0=16.1 + 9.0 = 25.1 MHz 时,差频 ∣25.1−16.1∣=9.0|25.1 - 16.1| = 9.0 MHz,同样落进中频。25.1 MHz 称为 7.1 MHz 的镜像频率,它和有用信号关于本振对称。如果不在混频器前面把它滤掉,25.1 MHz 上的电台就会混进来。第 15 章专门讨论这个问题。
  3. (2+j)(1−3j)=2−6j+j−3j2=(2 + j)(1 - 3j) = 2 - 6j + j - 3j^2 = 5−5j5 - 5j =7.071∠−45°= 7.071\angle -45°;2+j1−3j=(2+j)(1+3j)10=−1+7j10=\dfrac{2 + j}{1 - 3j} = \dfrac{(2 + j)(1 + 3j)}{10} = \dfrac{-1 + 7j}{10} = −0.1+0.7j-0.1 + 0.7j =0.7071∠98.13°= 0.7071\angle 98.13°。用极坐标核对:5∠26.57°×10∠−71.57°=50∠−45°\sqrt5\angle 26.57° \times \sqrt{10}\angle -71.57° = \sqrt{50}\angle -45°;相除则是 0.5∠98.13°\sqrt{0.5}\angle 98.13°。
  4. (a) 三个相量 1∠0°1\angle 0°、1∠120°1\angle 120°、1∠240°1\angle 240° 首尾相接构成一个闭合的等边三角形,和为 0(代码算出的模是 3×10−163\times10^{-16})。这就是三相交流电在平衡负载下中性线电流为零的原因。(b) sin⁡ωt=cos⁡(ωt−90°)\sin\omega t = \cos(\omega t - 90°),相量为 −j-j,所以总相量为 3−4j=5∠−53.13°3 - 4j = 5\angle -53.13°,即 5cos⁡(ωt−53.13°)5\cos(\omega t - 53.13°)。
  5. 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)。
  6. (a) 10lg⁡(500)=10\lg(500) = 26.99 dBm。(b) −107+107=-107 + 107 = 0 dBμV,即约 1 μV(精确地说是 −0.01 dBμV)。(c) S5 到 S9 是 4 个 S 单位,24 dB,功率增加 102.4≈10^{2.4} \approx 251 倍(电压增加 16 倍)。
  7. 损耗 30×6/100=1.830 \times 6/100 = 1.8 dB,到达天线的功率 50×10−0.18=50\times10^{-0.18} = 33.0 W,有约 17 W 变成了电缆里的热量。接收时,天线收到的信号同样要损失 1.8 dB。所以在 VHF/UHF,低损耗电缆和尽量短的馈线很重要。
  8. 最强 20lg⁡1.5=20\lg 1.5 = +3.52 dB,最弱 20lg⁡0.5=20\lg 0.5 = −6.02 dB,起伏 9.5 dB,比 a=0.8a = 0.8 时的 19.1 dB 小得多(图 6 中的橙色虚线)。
  9. 60 km 时 FSPL = 111.24 dB,接收功率 −60.76 dBm,余量 60.2 dB。距离加倍,FSPL 增加 20lg⁡2=20\lg 2 = 6.02 dB(自由空间里的“6 dB 每倍程”规律)。
  10. 不相关的噪声按功率相加:10lg⁡2=10\lg 2 = +3.01 dB。同相的两路信号按电压(相量)相加:振幅加倍,功率变为 4 倍,+6.02 dB(就是 a=1a = 1 时多径的峰值,20lg⁡220\lg 2)。区别在于相关性:同相信号的电压时时刻刻都在互相加强;不相关的噪声有时加强、有时抵消,平均下来只有功率可加。天线阵列和分集接收正是利用了这一差别:把多路信号同相相加,信号增加 6 dB,而噪声只增加 3 dB。

参考资料

  1. W. H. Hayt, J. E. Kemmerly, J. D. Phillips, S. M. Durbin. Engineering Circuit Analysis. 9th ed. McGraw-Hill, 2018. 第 10 章(正弦稳态分析与相量)。
  2. R. G. Lyons. Understanding Digital Signal Processing. 3rd ed. Prentice Hall, 2010. 附录 A(复数)、第 8 章(正交信号)。
  3. P. J. Nahin. An Imaginary Tale: The Story of √−1. Princeton University Press, 1998.
  4. ARRL. The ARRL Handbook for Radio Communications. 最新版. “Electrical Fundamentals” 与 “Radio Fundamentals” 章节。
  5. IARU Region 1. Technical Recommendation R.1: S-meter calibration. 1981.
  6. 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