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的通信性能。我画了一张图,帮你理清它们之间的关系。

LoRa三要素协同关系图 LoRa通信性能 扩频因子 SF 编码率 CR 带宽 BW SF↑ → 距离↑ SF↑ → 速率↓ SF↑ → 时间↑ CR↑ → 纠错↑ CR↑ → 开销↑ CR↑ → 速率↓ BW↑ → 速率↑ BW↑ → 噪声↑ BW↑ → 灵敏度↓ 三者协同:距离、速率、功耗的三角平衡

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秒才能发下一次。你想想看,如果数据采集频率高,这个限制就很要命了。