Lora解调
可以把 LoRa 的解调理解成一条非常明确的流水线:
收到一条“起点被移动”的上扫啁啾 → 用标准下扫啁啾消掉扫描变化 → 得到固定频率 → FFT 判断固定频率是多少 → 恢复符号值。
一、先确定一个 LoRa 符号有多少种可能
LoRa 的扩频因子为 SF。
一个符号一共有:
M=2SF
种可能取值。
因此,符号值为:
m∈{0,1,2,…,M−1}
也就是:
m∈{0,1,2,…,2SF−1}
例如 SF10:
M=210=1024
因此一个 LoRa 调制符号的编号范围是:
m=0,1,2,…,1023
这里的:
m
就是我们最终想从接收信号中识别出来的数。
二、一个符号持续多长时间
LoRa 的符号时间为:
Ts=BW2SF
也可以写成:
Ts=BWM
其中:
-
Ts:一个符号持续时间;
-
BW:LoRa 信号带宽;
-
M=2SF。
例如:
SF=10
BW=1 MHz
则:
Ts=1000000210=1.024 ms
也就是说,一条完整的 LoRa 啁啾持续 1.024 ms。
三、标准上扫啁啾是什么
先考虑一个标准上扫啁啾。
它的瞬时频率随着时间线性增加:
fchirp(t)=f0+kt
其中:
-
f0:起始频率;
-
k:扫频斜率;
-
t:当前时间。
因为一条啁啾在一个符号时间内扫过整个带宽,所以:
k=TsBW
代入符号时间:
k=2SF/BWBW
因此:
k=2SFBW2
这个:
k
表示频率变化的速度。
例如一条啁啾在 1 ms 内扫过 1 MHz,则:
k=1 ms1 MHz
意思就是频率在 1 ms 内增加 1 MHz。
四、频率函数怎么变成真正的 IQ 信号
频率表示“复数指针旋转得多快”。
相位表示“复数指针目前累计转了多少角度”。
频率累积起来得到相位:
ϕ(t)=2π∫0tf(τ)dτ
标准上扫啁啾的频率是:
fchirp(t)=f0+kt
因此它的相位为:
ϕchirp(t)=2π∫0t(f0+kτ)dτ
积分之后:
ϕchirp(t)=2π(f0t+21kt2)
所以标准上扫啁啾的复数 IQ 信号可以写成:
x0(t)=Aej2π(f0t+21kt2)
这里:
五、数据是怎么放进啁啾里的
LoRa 不改变啁啾的斜率。
不同符号使用的都是相同斜率,只是啁啾在带宽中的循环起点不同。
带宽被划分成:
M
个位置:
M=2SF
相邻位置之间的频率间隔为:
Δf=MBW
也就是:
Δf=2SFBW
如果当前符号值是:
m
那么对应的等效频率偏移为:
fm=mΔf
代入:
Δf
得到:
fm=m2SFBW
因此,可以用一个简化但非常实用的形式表示符号:
m
对应的啁啾:
xm(t)=x0(t)ej2πfmt
含义是:
把:
x0(t)
展开:
xm(t)=Aej2π(f0t+21kt2)ej2πfmt
指数相加:
xm(t)=Aej2π(f0t+fmt+21kt2)
如果把标准啁啾的起始频率部分暂时省略,重点观察数据偏移,可以写成:
xm(t)=Aej2π(fmt+21kt2)
这里可以看出:
六、接收端收到什么
忽略噪声、时间偏差和频率误差时,接收到的一个符号可以写成:
r(t)=Aej2π(fmt+21kt2)
它包含两个部分:
符号数据fmt+上扫啁啾21kt2
接收端的任务就是:
把所有符号共有的啁啾部分去掉,只留下:
fm
七、Dechirp:用下扫啁啾消掉上扫啁啾
接收端生成一个标准参考下扫啁啾:
xdown(t)=e−j2π21kt2
它和标准上扫啁啾的斜率完全相反。
接收信号为:
r(t)=Aej2π(fmt+21kt2)
Dechirp 就是两者相乘:
y(t)=r(t)xdown(t)
代入:
y(t)=Aej2π(fmt+21kt2)e−j2π21kt2
复指数相乘时,指数相加:
y(t)=Aej2π(fmt+21kt2−21kt2)
啁啾部分抵消:
21kt2−21kt2=0
最后得到:
y(t)=Aej2πfmt
这个结果已经不再是啁啾了。
它是一个固定频率为:
fm
的复数单音。
八、为什么 Dechirp 后会变成固定频率
接收啁啾的瞬时频率是:
frx(t)=fm+kt
参考下扫啁啾的瞬时频率是:
fdown(t)=−kt
复数信号相乘后,频率相加:
fresult(t)=frx(t)+fdown(t)
代入:
fresult(t)=(fm+kt)+(−kt)
得到:
fresult(t)=fm
也就是:
变化频率+反向变化频率=固定频率
所以 Dechirp 的本质是:
上扫啁啾×下扫啁啾=固定频率单音
九、固定频率如何变成 FFT bin
现在 Dechirp 后得到:
y(t)=Aej2πfmt
而符号频率为:
fm=mMBW
因为:
M=2SF
所以:
fm=m2SFBW
为了方便说明,假设解调前已经把采样率调整为:
Fs=BW
一个符号内的采样点数为:
N=FsTs
代入:
Fs=BW
得到:
N=BWBW2SF
因此:
N=2SF
也就是:
N=M
一个符号刚好有:
2SF
个采样点。
十、把连续信号变成离散采样
采样时刻为:
tn=Fsn
因为:
Fs=BW
所以:
tn=BWn
其中:
n=0,1,2,…,N−1
Dechirp 后的信号为:
y(t)=Aej2πfmt
采样之后:
y[n]=Aej2πfmtn
代入:
fm=mNBW
以及:
tn=BWn
得到:
y[n]=Aej2π(mNBW)(BWn)
约掉:
BW
得到:
y[n]=Aej2πNmn
这就是一个刚好落在第:
m
个 FFT bin 上的复数单音。
十一、FFT 实际上在做什么
对:
y[n]
做:
N
点 FFT:
Y[p]=n=0∑N−1y[n]e−j2πNpn
其中:
p
表示 FFT 正在测试的 bin:
p=0,1,2,…,N−1
代入:
y[n]=Aej2πNmn
得到:
Y[p]=n=0∑N−1Aej2πNmne−j2πNpn
指数合并:
Y[p]=An=0∑N−1ej2πN(m−p)n
十二、为什么正确的 bin 会特别大
假设 FFT 测试的 bin 正好是符号值:
p=m
那么:
m−p=0
因此:
ej2πN(m−p)n=ej0=1
于是:
Y[m]=An=0∑N−11
一共有:
N
项:
Y[m]=AN
也就是说,所有采样点都同方向相加,能量非常大。
十三、为什么错误的 bin 会互相抵消
假设:
p=m
那么 FFT 消除掉的频率和输入频率不一致,还会留下一个旋转成分:
ej2πN(m−p)n
随着:
n
增加,这些复数点会围绕圆周旋转。
相加时大致会互相抵消:
Y[p]=An=0∑N−1ej2πN(m−p)n≈0
所以:
-
正确 bin:所有点方向一致,叠加后很大;
-
错误 bin:点朝不同方向,叠加后互相抵消。
十四、找到最大峰值就是符号值
FFT 完成后,找幅度最大的 bin:
m^=pargmax∣Y[p]∣
也可以比较能量:
m^=pargmax∣Y[p]∣2
其中:
例如 FFT 的第 300 个 bin 最大:
m^=300
那么接收机就判断该 LoRa 调制符号为 300。
十五、用 SF10 的数字例子串起来
假设:
SF=10
BW=1 MHz
那么:
M=210=1024
每个频率位置的间隔为:
Δf=10241000000
即:
Δf≈976.5625 Hz
假设发送符号为:
m=300
那么它对应的频率偏移是:
fm=300×976.5625
得到:
fm=292968.75 Hz
发送的啁啾可以简化表示为:
x300(t)=Aej2π(292968.75t+21kt2)
接收端乘以下扫啁啾:
xdown(t)=e−j2π21kt2
得到:
y(t)=Aej2π292968.75t
这是一个固定频率约为 292.97 kHz 的单音。
进行 1024 点 FFT:
N=1024
FFT 的频率间隔为:
ΔfFFT=NFs
因为:
Fs=1 MHz
所以:
ΔfFFT=10241000000=976.5625 Hz
单音所在的 bin 为:
p=976.5625292968.75
得到:
p=300
因此:
m^=300
整个过程就是:
- FFT 得到 LoRa 调制符号值
- 进行符号映射还原
- 进行去交织
- 进行纠错译码
- 进行去白化
- 解析 LoRa 头部和负载
- 进行 CRC 校验
- 得到原始数据
十六、恢复符号后还没有直接得到原始数据
FFT 得到的是 LoRa 的调制符号值:
m^=pargmax∣Y[p]∣
它一般不能直接当成原始用户 bit。
实际 LoRa 接收链路后面还需要进行:
- 天线接收射频信号
- 接收机进行下变频,得到基带 IQ 信号
- 对 IQ 信号进行滤波
- 对 IQ 信号进行降采样
- 检测 LoRa 前导码
- 根据前导码完成时间同步
- 根据前导码完成频率同步
- 确定每个 LoRa 符号的起始位置
- 按照符号时间切分 IQ 采样
- 将每个接收符号乘以参考下扫啁啾
- 完成 Dechirp 解啁啾
- 将变化频率的啁啾变成固定频率单音
- 对固定频率单音进行 FFT
- 找到幅度或能量最大的 FFT bin
- 根据峰值 bin 恢复 LoRa 调制符号值
- 进行符号映射还原
- 进行去交织
- 进行纠错译码
- 进行去白化
- 解析 LoRa 头部和负载
- 进行 CRC 校验
- 得到最终的原始数据
最核心的一段
rm(t)=Aej2π(fmt+21kt2)
xdown(t)=e−j2π21kt2
ym(t)=rm(t)xdown(t)
ym(t)=Aej2πfmt
fm=m2SFBW
Y[p]=n=0∑N−1ym[n]e−j2πNpn
m^=pargmax∣Y[p]∣
需要注意的是,不同 LoRa 实现采用的符号方向、FFT 符号和啁啾定义可能不同,因此程序中有时会得到:
m^=m
也可能得到:
m^=(N−m)modN
这只是正负频率和 FFT 方向约定不同,核心原理没有变化:
峰值落在哪个 bin,就能反推出啁啾的循环偏移量。