4. LoRa解调原理:非相干解调与相干解调、FFT解调算法、峰值检测与符号判决、解调门限与误码率
好,咱们接着聊LoRa的解调。说实话,很多工程师觉得调制难,但我个人认为,解调才是真正见功底的地方。你想想看,信号在空中飞了一圈,经历了衰减、多径、频偏,到了接收端已经面目全非了。怎么把它还原回来?这就是解调要干的事。
4.1 非相干解调 vs 相干解调
先说说这两个概念。非相干解调,说白了就是不看相位,只看幅度和频率。LoRa用的是CSS调制,频率随时间线性变化,所以非相干解调天然适合它。我在项目中遇到过一种情况:用相干解调去试,结果因为相位噪声太大,性能反而更差。
非相干解调的好处很明显——实现简单,对频偏不敏感。你不需要去估计载波的初始相位,直接拿接收信号的频率变化去匹配就行了。但代价是什么?信噪比要求更高一些,大概有1-2dB的损失。
相干解调呢?它需要知道精确的相位信息。理论上性能更好,但实际做起来很麻烦。我记得有一次调试,为了把相位锁定,折腾了整整一周。最后发现,在LoRa这种低信噪比场景下,非相干解调反而是更务实的选择。
核心结论:LoRa解调以非相干解调为主流。除非你的应用场景信噪比极高,且对功耗不敏感,否则别轻易上相干解调。
4.2 FFT解调算法
好,那非相干解调具体怎么实现?核心就是FFT。为什么?因为LoRa的每个符号对应一个特定的起始频率,而FFT可以高效地把时域信号转换到频域,让我们看到能量分布。
具体流程是这样的:
- 接收到的基带信号,先做下变频,得到I/Q两路数据。
- 然后做FFT,长度是2^SF(SF是扩频因子)。
- FFT输出的每个bin,对应一个可能的频率偏移。
- 找到能量最大的那个bin,就是解调结果。
举个例子,SF=7时,FFT长度是128点。每个符号周期内,我们做一次128点的FFT,然后看哪个bin的幅度最大。就这么简单。
我的经验:FFT的点数一定要和扩频因子匹配。我曾经犯过一个错误,为了省资源把FFT点数减半,结果误码率直接飙升。后来才意识到,FFT的分辨率决定了频率估计的精度,不能随便砍。
4.3 峰值检测与符号判决
FFT做完之后,我们得到了一堆频域数据。接下来要干什么?找峰值。峰值检测听起来简单,但实际做起来有不少坑。
我一般用三步法:
- 第一步:计算每个bin的幅度。可以用|I|+|Q|近似,省掉开方运算。
- 第二步:找到最大值的位置。这个位置对应的bin索引,就是解调出的符号值。
- 第三步:做二次插值。如果峰值刚好在两个bin之间,直接取整会有误差。用抛物线插值可以提升精度。
符号判决就更直接了。LoRa的每个符号对应一个频率偏移,而频率偏移又对应一个bin索引。所以,峰值位置就是符号值。比如SF=7时,峰值在bin 42,那解调出的符号就是42。
注意:峰值检测最怕多径。如果信号经过多条路径到达,FFT上可能会出现多个峰值。这时候怎么选?我建议用能量加权平均,而不是简单取最大值。当然,这要看你的系统对延迟扩展的容忍度。
4.4 解调门限与误码率
最后聊聊门限和误码率。解调门限,说白了就是信噪比低到什么程度,系统还能正常工作。LoRa在这方面有天然优势——扩频增益带来了处理增益。
误码率的计算公式是这样的:
BER ≈ 0.5 * exp(-0.5 * SNR * 2^SF / BW)
其中SNR是信噪比,SF是扩频因子,BW是带宽。你看,扩频因子越大,误码率越低。但代价是什么?传输速率也降低了。
我在实际项目中测过一组数据:
| 扩频因子(SF) | 带宽(BW) | 解调门限(SNR) | 典型误码率 |
|---|---|---|---|
| 7 | 125kHz | -7.5 dB | 1e-3 |
| 9 | 125kHz | -12.5 dB | 1e-4 |
| 12 | 125kHz | -20 dB | 1e-5 |
嗯,这里要注意。表格里的数据是在理想信道下测的。实际环境中,多径、干扰、频偏都会让门限变差。我建议你留出3-5dB的余量。
避坑指南:我曾经在项目中把解调门限设得太紧,结果现场测试时频繁丢包。后来把门限放宽了3dB,问题就解决了。记住,理论值只是参考,实际系统要留余量。
好了,这一章的内容就这些。非相干解调、FFT算法、峰值检测、门限设置,这几个点串起来,就是LoRa解调的全貌。下一章我们会聊同步技术,那是另一个有意思的话题。