4. LoRa解调原理:非相干解调与相干解调、FFT解调算法、峰值检测与符号判决、解调门限与误码率

好,咱们接着聊LoRa的解调。说实话,很多工程师觉得调制难,但我个人认为,解调才是真正见功底的地方。你想想看,信号在空中飞了一圈,经历了衰减、多径、频偏,到了接收端已经面目全非了。怎么把它还原回来?这就是解调要干的事。

4.1 非相干解调 vs 相干解调

先说说这两个概念。非相干解调,说白了就是不看相位,只看幅度和频率。LoRa用的是CSS调制,频率随时间线性变化,所以非相干解调天然适合它。我在项目中遇到过一种情况:用相干解调去试,结果因为相位噪声太大,性能反而更差。

非相干解调的好处很明显——实现简单,对频偏不敏感。你不需要去估计载波的初始相位,直接拿接收信号的频率变化去匹配就行了。但代价是什么?信噪比要求更高一些,大概有1-2dB的损失。

相干解调呢?它需要知道精确的相位信息。理论上性能更好,但实际做起来很麻烦。我记得有一次调试,为了把相位锁定,折腾了整整一周。最后发现,在LoRa这种低信噪比场景下,非相干解调反而是更务实的选择。

核心结论:LoRa解调以非相干解调为主流。除非你的应用场景信噪比极高,且对功耗不敏感,否则别轻易上相干解调。

4.2 FFT解调算法

好,那非相干解调具体怎么实现?核心就是FFT。为什么?因为LoRa的每个符号对应一个特定的起始频率,而FFT可以高效地把时域信号转换到频域,让我们看到能量分布。

具体流程是这样的:

  1. 接收到的基带信号,先做下变频,得到I/Q两路数据。
  2. 然后做FFT,长度是2^SF(SF是扩频因子)。
  3. FFT输出的每个bin,对应一个可能的频率偏移。
  4. 找到能量最大的那个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解调的全貌。下一章我们会聊同步技术,那是另一个有意思的话题。