这期通信观系列的第二篇,我打算认真拆一遍通信基本原理。对于刚入行做无线通信、网络优化或者嵌入式通信应用的朋友来说,“调制”“信道”“误码率”“同步”这些词肯定都听过,但往往卡在“听得懂概念,串不起逻辑”这个阶段。这篇文章不打算堆公式,而是想把一条真实信息从发送端到接收端经历的所有关键环节,用工程视角捋清楚:每一环解决什么问题,不解决会怎样,实际系统里是怎么取舍的。如果你对“信号到底怎么传、手机为什么能同时上网又通话、Wi-Fi为什么会卡”这类问题有过困惑,这篇应该能帮你搭起一张比较完整的认知底图。读完以后你会发现,通信系统再复杂,底层要对抗的永远也就是那几个物理约束。
1. 先把通信这事的全貌摆到桌面上:一个模型搞定所有系统
1.1 从一次“打电话听不清”说起
你肯定经历过这种场景:在电梯里打电话,信号断断续续,对方的声音像是从很远的地方飘过来,隔几秒还有一个字被吞掉。这时候懂点通信的人会告诉你“信号不好”,然后呢?然后就没有然后了。但我一直觉得,普通人说“信号不好”的时候,脑子里其实混着三件完全不同的事:发射功率不够、噪声太大、或者是多用户抢信道导致的服务质量下降。这三件事的解决思路完全不同,不把通信系统的基本链条拆开,你根本不知道问题出在哪一环。
所以我想先引入一个最经典的通信系统模型,这是所有通信教材都会讲、但很多人学完就丢的模型:信源 → 信源编码 → 信道编码 → 调制 → 信道 → 解调 → 信道译码 → 信源译码 → 信宿。你不需要背这个链条,你只需要记住一件事:一条信息要被送出去,它必须经历三次变身——把内容变成比特,把比特变成适合传输的波形,再把波形经过实际物理信道送到对端,然后接收端倒着做一遍这三件事。
画成文字有点抽象。我习惯把它类比成快递发货。信源就是你打包的原件,信源编码相当于把大件压缩装进标准纸箱,信道编码相当于在纸箱外面缠上加固胶带并贴上易碎标志,调制则是根据快递公司的运输要求(比如必须走航空、不能走陆运)给纸箱换一种规格的包装。信道就是你交给的那家物流公司,中间可能经过分拣、颠簸、甚至丢件。接收端收到后,得先拆包装、验货、再还原成你原来的文件。每一层都有专门的用途,少一层,货就可能到不了或者到的时候已经坏了。
1.2 信源编码和信道编码到底在干什么
很多人第一次接触通信系统时,分不清信源编码和信道编码,因为名字太像了。我给你们一个不会忘的解释:信源编码是给数据“减肥”的,信道编码是给数据“穿防弹衣”的。
信源编码解决的是效率问题。你和朋友视频聊天时,摄像头每一帧图像里有大量冗余信息——背景基本都是静止的、画面里的纹理变化也不大。如果不做压缩,1分钟1080p30的视频可能需要几百兆甚至上GB的数据量,任何物理信道都顶不住。H.264、H.265、AAC这些你们耳熟能详的名词都属于信源编码。它们的目标就是尽量少用比特来表示同样的音视频内容。
而信道编码解决的是可靠性问题。它故意往数据里加冗余比特,让接收端能够在传输过程中出现个别错误时发现甚至纠正错误。举个最直观的例子:你发一句话“今天下午三点开会”,如果怕中间某个字被吞掉,你可能会把关键信息重复一遍“今天下午三点、三点开会”。信道编码的本质就类似这种重复和关联,只不过它做得非常精巧,能用尽量少的额外比特达到尽量强的容错能力。
那为什么一个系统里必须同时做这两种编码?因为效率和可靠性天然是矛盾的。信源编码想把数据压缩到极致,但压缩得越狠,每个比特承载的信息量越大,任何一个比特出错造成的后果就越严重。信道编码可以补救,但它补得越多,冗余也越多,前面压缩省下来的容量又被吃回去了。所以所有通信系统设计,本质上都在反复权衡这两件事——这就引出了通信工程里最重要的一个思维,后面我会反复提起。
1.3 数字通信为什么赢了:中继再生原理
既然通信已经发展了一百多年,为什么现代通信系统几乎全部数字化,而不是直接放大模拟信号?这个问题比很多人想象的更根本。
模拟通信时代,信号从发射端传出去后,在中继站那里会被放大再继续传。但放大器是“一视同仁”的,它放大信号的同时,也把叠加在信号上的噪声一起放大了。一路传下去,噪声不断累积,到接收端时你听到的“嘶嘶”声会越来越明显。这就像你用复印机连续复印一份文件,每一代都比上一代更模糊、更脏,复印到第五代基本没法看。
数字通信则完全不同。它传的不是连续变化的波形,而是0和1的序列。中继或接收端拿到的一定是一段电压波形,但它的任务不是“还原原来的波形”,而是做一个判断:“这个采样点的电压大概率是0还是1”。只要噪声没有大到把电平完全抹掉,接收端就能把一段被污染的信号重新判决成干净的0/1序列,然后再把干净序列往下传。噪声在中继之后不会继续累积,这就是所谓的中继再生。数字系统能够一次一次地“洗掉”噪声,代价只是偶尔判决错误,而判决错误又可以被信道编码兜底。一整套逻辑从头到尾是自洽的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么不能把声音直接发出去:调制与解调的逻辑
2.1 天线尺寸告诉你:低频信号根本“辐射不出去”
很多初学者问的第一个问题是:我说话的声音本身不是一种振动吗,为什么不能直接通过天线变成无线电波发出去,还得加一个载波去“背”着它?
答案是物理尺寸决定的。天线要高效地把电磁能量辐射出去,它的物理尺寸需要和信号波长在同一量级,通常不小于波长的十分之一。人说话的频率大概是300Hz到3400Hz,如果按1000Hz算,对应的波长是30万公里。你想想,一根3万公里长的天线,怎么可能在手机上实现?就算愿意建个超级工程,射频前端那个频率上的匹配电路也完全没法做。
这就像你要横跨太平洋送一枚硬币,直接用手扔是不可能扔过去的,你得把它放进一枚火箭的整流罩里,跟着火箭一起飞过去。载波就是那个火箭,你的语音信号是那枚硬币。我们要做的,正是把语音这个低频信号“装”到一个高频载波上,这个过程就是调制。选择多高的载波频率,直接决定了天线能做多小,这也是为什么2.4GHz Wi-Fi的天线只有几厘米、而广播电台的中波天线要做成几十米高的铁塔。
2.2 基础调制的三种“键控”,理解了它们你就理解了所有调制
数字调制看似千变万化,核心思想只有三种:调幅、调频、调相。数字信号是0和1的序列,所以数字调制也被称为“键控”——就是像按键一样在几个离散状态之间切换。
调幅到了数字域叫幅移键控(ASK)。比如规定:有载波振幅代表1,没有或小振幅代表0。这很好理解,但有明显弱点:信道里的噪声和衰落也会改变振幅,接收端很难分清“这个幅度是信号故意变的,还是被信道搞出来的”。所以纯ASK在现代高速通信里用得不多,但在某些低频近场通信里还能见到。
调频到了数字域叫频移键控(FSK)。它用频率来区分0和1,比如频率偏高代表1,偏低代表0。FSK的抗噪声能力比ASK好,因为信道一般不太会改变信号的频率特性。你手机里的蓝牙低功耗(BLE)、早期的拨号猫、还有LoRa的调制方式都和FSK有亲缘关系。
调相到了数字域叫相移键控(PSK),也是现代通信里最核心的调制方式。它让载波的相位变化来携带信息,比如相位不变代表0,相位翻转180度代表1。进一步把相位分成四个状态,每次用两个比特对应一个相位,这就是QPSK。把相位和幅度组合起来,就成了QAM——你现在用的Wi-Fi 6、5G里,高阶QAM都是主力。
我用一个更生活化的方式总结:ASK像是用灯光的亮灭传信息,FSK像是用声音的高低传信息,PSK像是用一个人向左转还是向右转来传信息。灯火容易被风吹灭(幅度易受噪声影响),声音高低相对靠谱(频率抗噪声强),方向则精准且高效(相位可以细分出更多状态)。
2.3 接收端怎么把比特捞回来:从眼图到星座图
调制是发送端的事,真正难的是接收端把信号“还原”成比特。实际接收到的信号早就不是发送端那个干净规则的波形了——幅度变了、相位偏了、还叠加了各种噪声。这时候接收端必须做两件事:一是对每个符号做判决,看它最接近哪个状态;二是要把这些状态和比特映射关系对应回去。
如果你在实验室里观察接收端解调前的信号,最直观的方法有两种。一个是看眼图——把连续波形按符号周期重叠显示,屏幕上会出现像眼睛一样的图案,眼睛睁得越大、中间的空隙越清晰,说明信号质量越好、误码率越低。另一个是看星座图——把每个符号的幅度和相位画到二维平面上,理想的QPSK信号只会在四个点上,加噪声后这四个点会变成四团“雾”,雾越聚拢说明信噪比越高。
我自己在调第一块收发板卡时,最常干的事就是把接收端基带处理前的I/Q数据抓出来,画到星座图上。你不需要任何高级仪器,一个几十块的RTL-SDR加电脑软件就能做到。当你真正在屏幕上看到“雾团”随着天线角度变化而旋转、散开,你才会对“信道是不友好”这句话有肌肉记忆。
3. 信号要穿越的真实世界:噪声、干扰与蹭蹬
3.1 先量底噪,再谈覆盖
很多做网络优化的人喜欢一上来就谈“这里信号弱,加个放大器”“那里覆盖差,装个基站”。但真正负责任的排查顺序不是这样,第一步永远是量底噪。
在我调试无线链路时,第一件事是把发射端关掉,用频谱仪直接看接收频率上的底噪水平。所谓底噪就是没有任何有效信号时,射频前端本身的热噪声、周边环境里的电磁干扰叠加成的那个基线。热噪声功率有个理论下限可以算:在室温下,每1Hz带宽对应的热噪声功率大约是-174dBm。如果接收机带宽是20MHz,那么理想底噪大约是 -174 + 10×log10(20×10^6) ≈ -101dBm。现实中加上接收机噪声系数,底噪会更高一点。
为什么这个数字重要?因为如果底噪是-95dBm,而接收机灵敏度是-100dBm,那意味着哪怕有用信号只比理论灵敏度高一点点,就已经被淹没在噪声里了。你盲目增大发射功率确实能让信噪比上去,但发射功率不能无限增大——手机功耗、辐射标准、邻频干扰都是约束。而且当你把功放加大时,噪声、杂散往往也跟着变大,别人用不了的频段你全给污染了。真正干净的方案是降低底噪、抑制干扰源,把整个“噪声地板”压低,这比单纯提高发射功率高效得多。
3.2 香农公式给了所有通信人一个“天花板”观念
影响一个信道能传多快数据的因素到底是什么?如果只能记一个结论,我建议你记住香农公式的直觉:信道容量 = 带宽 × log2(1 + 信噪比)。一个带宽有限的信道,在给定信噪比下,能无差错传输的比特率是有硬上限的。不管你把调制阶数提到多高、信道编码做得多复杂,都不可能超过这个上限。
先别被公式吓到,它的直觉其实很朴素。带宽决定“道路多宽”——同一时刻能并排跑多少辆车。信噪比决定“路况多好”——路上有没有坑洼、会不会爆胎。路太窄,车再多也跑不快;路太宽但全是烂路,车也跑不动。香农告诉你的是:你把这两样参数定死,车速的上限就定死了,再好的司机也超不过这个速度。
这个公式在日常工程里最大的价值不是用来算数,而是给你一个判断预期管理的能力。有人让你在一个只有200kHz带宽、信噪比只有10dB的窄带信道上跑10Mbps的实时数据,你不需要试,用香农公式一算就知道物理上就不可能。这时候你再怎么堆天线、换编码、调均衡,都是白费功夫。做事之前先知道天花板在哪,能省掉大量无用功。
3.3 多径衰落:同一个信号,为什么到接收端会“自己打自己”
除了热噪声,实际无线信道里还有一个破坏力更强的因素:多径。信号从发射天线出发,走直线到接收机的同时,还会经过地面反射、墙壁反射、车辆反射走出若干条不同的路径。不同路径长度不同,到达时间自然也不同,相位也就不同。当几条路径的信号在接收机处叠加时,可能互相增强,也可能互相抵消。如果刚好抵消得厉害,接收机看到的信号幅度会急剧下跌,这就是所谓的深度衰落。
有一次我在园区里做测试,接收端放在同一个位置,只是把发射天线从桌子左侧移到右侧,差了不到半米,接收信号强度直接掉了20dB。把频谱仪接上去一看,不是设备坏了,而是两条反射路径的信号刚好在接收点反相抵消了。这种问题在现场特别让人头疼,因为它不是设备问题,是位置问题。多径也是OFDM必须引入循环前缀的原因——循环前缀让上一符号的多径延迟不会污染下一个符号,相当于给每个符号之间加了一段“缓冲带”。所以你看,复杂的技术往往就是被一个朴素的物理现象逼出来的。
提到反射路径,多径严重时还会导致另一个现象:不同频率的信号经历不同的衰落深度。频率选择性衰落会让某个频段内的信号被吃掉一角,这也是现代通信里需要做信道估计和均衡的原因之一。
4. 多人同时用,信道怎么分:复用与多址的底层思想
4.1 一条光纤、一个无线频段,凭什么是“大家的”
现实中从来没有一套通信系统专门为一个用户服务。你的手机和周围几百上千部手机共享基站,你家Wi-Fi和所有邻居的Wi-Fi共享2.4GHz那段频谱。这么多人挤在一起用,怎么让彼此不干扰?这就涉及复用和多址技术。
先澄清一个概念差异:复用(Multiplexing)讨论的是“一条物理信道上怎么同时传多路信息”,多址(Multiple Access)讨论的是“多个用户怎么共享同一个系统资源”。但核心思想是共通的——分。把传输资源在时间、频率、码字、空间这几个维度上划分开,每个用户占用其中一部分,彼此别踩脚。
频分复用就是最简单的划分方式:把整段可用频带切成一个个子频段,A用这一段,B用那一段,中间用保护间隔隔开。过去模拟电视的各个频道、FM广播里的不同电台,全是这么工作的。时分复用则要求大家轮流用同一个频段,但因为发送和接收可以分时切换,不同用户在不同的时间片里发数据。你打电话听到的“连贯话音”,很可能是被切成20ms的小块和别人交错传输的,只是因为切得足够快,你的耳朵感受不到中断。
4.2 从FDMA到OFDMA:移动通信怎么一步步把频谱用到极致
蜂窝移动通信的历史几乎就是多址技术不断进化的历史。第一代模拟蜂窝用FDMA,一个用户占一个频点,简单粗暴但浪费极大。第二代GSM在FDMA基础上叠加了TDMA,每个频点再分成8个时隙,用户在一个时隙里发数据,空闲时关掉发射机,效率明显提升。
第三代CDMA则换了一种玩法——不再分配给用户独立的频率和时间片,而是让所有人都用同一段频率、同一段时间,但给每个用户分配一个不同的正交码。接收端通过与某个用户的码做相关运算,从混叠的信号里把属于该用户的那部分“拧”出来。这个思想有点像大家在同一间屋子里同时用不同语言说话,你说中文对方也懂中文,就能从一片嘈杂里听出你的声音。不同语言之间越不像,越不容易互相串扰。
到了第四代LTE和现在的5G,主流变成了OFDMA——正交频分多址。它的本质是把宽带信道等分成大量正交子载波,再按时间和频率组成一个个资源块网格。基站可以像安排座位一样,在每一毫秒里把不同资源块分配给不同用户。你手机上网快不快,很大程度上取决于基站调度器能不能快速高效地把资源网格分给最需要的用户。OFDMA的天生优势在于它天然对抗多径,而调度自由度高又让它能在多用户场景里灵活分配资源。
4.3 Wi-Fi为什么一到晚高峰就卡:随机接入的代价
和蜂窝网络“基站集中调度”不同,Wi-Fi用的是另一种思路,叫载波侦听多址/冲突避免(CSMA/CA)。所有设备共享同一段信道,谁想发数据,先听一听信道上有没有人在发。如果信道忙就随机等待一段时间再试;如果信道空闲,就可以发送。
这个机制很像一个多人共用的会议室,没有人当主持,大家靠“先听后说”和“谦让退避”来维持秩序。问题在于,当同事们都挤在同一个信道上,频繁地“先听后说”,碰撞和退避会占掉大量时间,有效吞吐量会急剧下降。你在公寓里搜到十好几个Wi-Fi信号,几乎每个信道上都有一堆设备在抢,晚上七八点大家都回家刷视频,信道拥挤到一定程度,每个包都要退避好几次才能发出去,然后延迟和卡顿就来了。
明白了这种接入机制差异,你就能理解为什么Wi-Fi的网络质量往往不如蜂窝网络稳定:蜂窝网络是有调度员的交通管制,每个用户的时刻都是被安排的;Wi-Fi更像没有交通灯的十字路口,车多了就只能全靠司机自觉加运气。这不是说哪个技术更高明,而是使用场景不同决定的取舍。
5. 容忍错误但要发现错误:从CRC到纠错码的信任机制
5.1 为什么卫星图传错一个比特就“花了”
讲一个体验:你下载一个几十MB的PDF,如果传输过程中出了一个比特错误,文件很可能打不开或者中间一段变乱码,但你几乎无法定位是哪一秒出错的。这说明数字系统的特点是“容错性极差”——0和1之间没有中间灰度,一个比特错了,可能代表着完全不同的字符、完全不同的像素颜色,甚至让整段数据失去意义。
那通信系统怎么让接收端知道“这份数据可能坏了”?最经典的方式是给数据加上校验码。最简单的校验是奇偶校验:约定整段数据里“1”的个数必须为偶数(或奇数),发送端根据这个约定在末尾补一个校验位,接收端统计收到的数据里“1”的个数,如果奇偶性对不上,就说明传输中出了奇数个错误。但它有致命弱点:如果恰好错了两个比特,奇偶性又变回去了,错误就漏检了。所以实际系统里很少单独用奇偶校验。
5.2 CRC的本质:把数据当作一个大数,做一次除法
现代通信系统里用的校验码,绝大多数是循环冗余校验(CRC)。CRC的工作方式听起来很麻烦,但它有个容易理解的类比:你发给接收端一串数据,可以把它理解成一个巨大的二进制数。发送端和接收端事先约定一个“除数”,发送端用这个除数去除数据,得到一个“余数”,然后把余数附加在数据后面一起发出去。接收端收到后,把数据和余数放在一起再除以同一个除数。如果除得尽,没有余数,就认为数据在传输过程中没有被改过;如果除不尽,说明一定有比特错了。
之所以用“除法”而不用更简单的和校验,是因为二进制多项式的除法对错误的检测能力非常强:它能检测出几乎所有单个、双个、奇数个错误,还能检测出一整段连续的错误突发。你平时在任何网络设备抓包看到的CRC error计数,查看网卡统计里的FCS error,本质都是这个机制在报错。
5.3 光能发现错误还不够,还得能纠正:汉明码的冗余思想
校验能发现问题,但不能解决问题——发现了错,只能请求对方重发。可是如果信道质量很差,每次传都出错,重发就永远传不完;或者这是实时语音,根本等不及重发。怎么办?那就得让接收端不仅能发现错误,还能直接知道是哪一位错了、把它改回来。这就是纠错码的舞台。
汉明码是理解纠错码的最佳入门模型。它的思路是给每4位数据再加上3位冗余校验位,冗余位分布在不同位置,使得任何一位出错时,对冗余位的校验会产生一个独特的“错误位置编号”,接收端可以直接翻转到正确的那一位。这很像一张双色球彩票上的中奖号码排列——每种错误都会留下一串特征,查表即可定位。
我把检错和纠错两种思路整理成一张表,方便你对比:
| 方式 | 冗余量 | 发现错误 | 纠正错误 | 典型场景 |
|---|---|---|---|---|
| 奇偶校验 | 1比特/字符 | 只检奇数个错 | 不能 | 早期串口通信 |
| CRC | 16/32比特/帧 | 极强 | 不能 | 以太网、Wi-Fi帧校验 |
| 汉明码 | 3比特/4数据比特 | 能 | 纠正单比特 | 内存ECC、早期无线 |
| 卷积码/Turbo/LDPC | 依速率而定 | 能 | 强纠错 | 5G、Wi-Fi、卫星通信 |
在实际通信系统里,重传和纠错常常是配合使用的。4G/5G的物理层就用了一种叫混合自动重传请求(HARQ)的机制:先发一份带FEC冗余的数据,接收端如果纠错失败,再请求重传一份附加冗余信息,两边一拼就能把数据救回来。这比傻傻地整包重传效率高得多,也是现代移动网络能保持低时延高可靠的关键之一。
6. 想收得对,先得“对齐”:同步是被小看的隐形基石
6.1 载波同步:收发频率必须“一致到拍”
很多人做通信实验时遇到过这种情况:明明发射端和接收端配置了同一个中心频率,用SDR解调出来的却是完全不可理解的乱码。查来查去,最后发现是发射端本地晶振的频率偏差和接收端本地晶振之间差了那么几十ppm。中心频率设在2.4GHz时,20ppm的偏差就意味着48kHz的频率差。对带宽只有几MHz的信号来说,这点频偏已经足以让星座图整个旋转起来,判决瞬间失控。
这就是载波同步要处理的问题。接收端必须持续估计和纠正本地振荡器与接收信号载波之间的频率偏差和相位偏差,才能将带通信号正确地搬到基带并解调。工程上常用锁相环跟踪载波相位,或者利用发送端插入的导频信号、训练序列来估计频偏。没有好的载波同步,后边所有解调算法都是空谈。
6.2 位同步和帧同步:知道“一个比特多长”和“一句话从哪起头”
载波同步之后还有两道“对齐”要做。第一是位同步,也叫时钟同步。发射端按某个符号速率发送,每个比特的持续时间是固定的,但接收端的采样时钟不可能和发射端完全一致,而且信号经过信道传输还会产生时延。接收端必须从接收信号里恢复出“比特时钟”,在每个比特的最佳采样点处取样,才能做出正确判决。
第二是帧同步。即使你把每个比特都正确解调出来了,还得知道“这一长串比特里,哪几个比特构成一个字节、哪一段是一个数据包的开头”。所有数据帧的设计都会在开头放一段特殊的前导码(preamble)或者帧起始符。接收端不断在解调出的比特流里寻找这个特征图案,找到就说明“帧边界到了”。你在Wi-Fi抓包里看到的那些固定格式的头部字段,一部分承担的就是这个职责。
6.3 做实验被“同步丢失”折磨后的三个排查习惯
我自己第一次搭一个数字收发系统时,被“同步丢失”折磨了整整一个下午。信号源明明在发,接收端波形明明在跳,但解调出来永远是一片雪花。后来总结出三条排查习惯,对新手很有参考价值:
第一,先确认频偏量级。把基带I/Q数据抓出来,看星座图上的点在不在旋转。如果点在匀速转圈,基本可以断定是频率偏差,调整接收端本地频率补偿或者改用带训练序列的频偏估计算法就行。
第二,再确认采样时刻对不对。如果星座图不旋转但点云呈椭圆扩散,多数是采样点偏移到了符号边缘,需要检查位同步环的收敛状态。这就像拍照时对焦不准,画面对了但拍出来是糊的。
第三,最后再看帧边界。如果星座图清晰、数据流也对了,但协议解析全乱,那八成是帧同步丢了——去找前导码位置或者检查解调器有没有正确锁定帧起始符。多数时候,把这些步骤按顺序清理一遍,问题就水落石出了。
踩过几次坑之后,我现在做链路调测的习惯是:任何一套收发系统,第一眼先看接收端的星座图和眼图,而不是先看解调后的比特流。因为比特域的错误只能告诉你“出错了”,而星座图能告诉你“错在物理域的哪个环节”。这个习惯帮我省下了大量排查时间。
最后再分享一个小感受。通信基本原理看起来是一堆孤立知识点,其实是一条完整的决策链:信息怎么表示、信号怎么搬移、信道怎么对抗、资源怎么划分、错误怎么恢复、时序怎么对齐。每个环节都在跟物理定律和成本约束做妥协,没有任何一个环节能独立做到最优。调过几次链路、看过几次星座图、处理过几次同步失锁之后,你会越来越觉得,通信工程的本质不是追求“极致的单一指标”,而是在一堆互相牵扯的约束里做取舍。这个观念,才是比任何具体公式都更值钱的收获。
