3. LoRa调制与解调原理:三要素详解与链路预算
LoRa这东西,说白了就是把信号藏在噪声里传。我第一次接触LoRa时,总觉得它像在玩魔术——明明信号强度比噪声还低,居然还能解出来。后来搞懂了扩频因子、编码率、带宽这三个参数,才明白背后的门道。
3.1 扩频因子(SF)——决定传输距离的核心
扩频因子,英文叫Spreading Factor,简称SF。它表示每个数据比特被扩展成多少个 chirp 符号。SF值越高,符号数越多,信号抗干扰能力越强。
| SF值 | 每个比特的chirp数 | 典型应用场景 |
|---|---|---|
| SF7 | 128 | 近距离、高数据率 |
| SF9 | 512 | 中等距离、平衡模式 |
| SF12 | 4096 | 远距离、低数据率 |
我做过一个项目,需要在城市里传2公里。一开始用SF7,死活连不上。换成SF12后,信号穿过了三栋楼还能收到。代价是什么?传输时间长了16倍。你想想看,这就是典型的用时间换距离。
关键公式:符号速率 Rs = BW / 2^SF
BW是带宽,单位Hz。SF每增加1,符号速率减半,传输时间翻倍。
3.2 编码率(CR)——纠错能力与开销的平衡
编码率CR表示有效数据比特与总传输比特的比值。LoRa支持4种编码率:4/5、4/6、4/7、4/8。
- CR = 4/5:开销最小,纠错能力最弱
- CR = 4/6:中等纠错,适合一般环境
- CR = 4/7:较强纠错,适合干扰多的场景
- CR = 4/8:最强纠错,但有效数据率最低
我记得有一次在工厂里部署传感器,电机启动时电磁干扰特别大。用CR=4/5时,丢包率高达30%。换成CR=4/8后,丢包率降到了2%以下。代价是同样的数据量,空中时间多了将近一倍。
我的建议:在干扰不严重的环境,用CR=4/5就够了。只有在强干扰或远距离场景,才考虑提高CR值。别一上来就用最高CR,那是在浪费宝贵的信道时间。
3.3 带宽(BW)——影响灵敏度和数据率
LoRa常用的带宽有125kHz、250kHz、500kHz三种。带宽越大,数据率越高,但灵敏度会下降。
| 带宽 | 数据率(SF7时) | 灵敏度损失 |
|---|---|---|
| 125 kHz | ~5.5 kbps | 基准 |
| 250 kHz | ~11 kbps | 约3 dB |
| 500 kHz | ~22 kbps | 约6 dB |
为什么会这样?因为带宽越宽,噪声功率越大。热噪声功率计算公式是:N = -174 + 10*log10(BW)。带宽翻倍,噪声功率增加3dB,灵敏度自然就差了。
避坑指南:我曾经在一个项目中,为了追求高数据率用了500kHz带宽。结果在郊区测试时,通信距离从5公里直接掉到2公里。后来才意识到,带宽的选择必须和SF配合着来。远距离场景,老老实实用125kHz。
3.4 三要素的协同关系
SF、CR、BW这三个参数不是独立的。它们共同决定了LoRa的通信性能。我画了一张图,帮你理清它们之间的关系。
3.5 LoRa信号灵敏度与链路预算
灵敏度,就是接收机能解调的最小信号功率。LoRa的灵敏度可以做到-130dBm甚至更低。计算公式如下:
灵敏度(dBm) = -174 + 10*log10(BW) + NF + SNR_min
其中:
- -174:室温下的热噪声基底(dBm/Hz)
- BW:带宽(Hz)
- NF:接收机噪声系数(典型值6dB)
- SNR_min:解调所需最小信噪比(SF12时约-20dB)
举个例子,125kHz带宽、SF12、NF=6dB时:
灵敏度 = -174 + 10*log10(125000) + 6 + (-20)
= -174 + 51 + 6 - 20
= -137 dBm
链路预算 = 发射功率 + 发射天线增益 + 接收天线增益 - 路径损耗 - 其他损耗
我做过一个实际测试:发射功率20dBm,天线增益各2dBi,路径损耗按城市环境算约120dB。链路预算 = 20 + 2 + 2 - 120 = -96dBm。这个值远高于-137dBm的灵敏度,所以通信很稳定。
经验值:LoRa链路预算通常能做到150dB以上。作为对比,传统FSK调制能做到120dB就不错了。这30dB的差距,就是LoRa能传10公里的秘密。
3.6 空中传输时间(ToA)公式推导
ToA(Time on Air)是LoRa节点发送一包数据占用的时间。这个参数在低功耗设计中特别重要——节点发射时间越长,功耗越大。
先算符号时间:
Ts = 2^SF / BW
再算前导码时间:
T_preamble = (n_preamble + 4.25) * Ts
n_preamble是前导码长度,LoRa默认是8个符号。
有效载荷符号数计算:
payloadSymbNb = 8 + max(ceil((8*PL - 4*SF + 28 + 16*CRC - 20*H) / (4*(SF - 2*DE))) * (CR+4), 0)
其中:
- PL:有效载荷字节数
- SF:扩频因子
- CRC:是否启用CRC(1或0)
- H:是否启用报头(0或1)
- DE:是否启用低数据率优化(1或0)
- CR:编码率(1~4)
最后:
ToA = T_preamble + payloadSymbNb * Ts
举个例子,SF12、BW125kHz、CR=4/5、PL=10字节:
Ts = 2^12 / 125000 = 4096 / 125000 = 0.032768秒 = 32.768ms
T_preamble = (8 + 4.25) * 32.768 = 401.4ms
payloadSymbNb = 8 + ceil((8*10 - 4*12 + 28 + 16*1 - 20*0) / (4*(12 - 2*0))) * (4+1)
= 8 + ceil((80 - 48 + 28 + 16) / 48) * 5
= 8 + ceil(76/48) * 5
= 8 + 2 * 5 = 18
ToA = 401.4 + 18 * 32.768 = 401.4 + 589.8 = 991.2ms
实用技巧:我一般用Semtech官方的LoRa Calculator工具快速算ToA。但理解公式很重要,因为你要根据电池容量反推发射间隔。比如一节CR2032电池容量225mAh,节点发射电流30mA,ToA=1秒,那每小时发一次,电池能撑多久?自己算算看。
3.7 参数选择实战建议
说了这么多理论,最后给点实际建议。我做了个参数选择对照表,方便你快速决策:
| 应用场景 | 推荐SF | 推荐CR | 推荐BW | 预期距离 |
|---|---|---|---|---|
| 室内传感器 | SF7 | 4/5 | 125kHz | 100-500m |
| 城市楼宇 | SF9 | 4/6 | 125kHz | 1-3km |
| 郊区农场 | SF11 | 4/7 | 125kHz | 5-8km |
| 远距离野外 | SF12 | 4/8 | 125kHz | 10-15km |
重要提醒:别以为参数设得越高越好。SF12虽然距离远,但ToA长,占空比限制容易超标。欧洲868MHz频段要求占空比不超过1%,SF12发一次就要等99秒才能发下一次。你想想看,如果数据采集频率高,这个限制就很要命了。