BI1ALF 库楼上已经有大佬把链接贴出来了,这里就不赘述了。简单说下原理:
APRS物理层使用AFSK1200,简单来说1200Hz和2200Hz分别表示1和0(或者0和1,这个不重要,因为后面有NRZI编码,用翻转表示0,用不翻转表示1),每bit长度是1/1200s,也就是1200Hz的一个周期。这种码长和周期相当的编码方式不能用滤波器硬滤来解调,因为滤波器响应的群延迟已经大于码长了,速度跟不上码的变化。
一般这种信号解调都用IQ解调,简单来说就是来两路正交信号(例如这里可以是sin(2pi×1200t)和cos(2pi×1200t))和输入信号相乘,滤掉高频分量后再平方和开根号就得到实际的码序列(即啥时候是1啥时候是0),后面再根据码序列长度(即什么时候有完整的1和0,以及APRS开始的时候有一段0x7E,用来对准时序的,看完整的1和0什么时候能够组成完整的0x7E)看什么时候开始判别。

LibAPRS用了一种更简单的方式:前文为啥需要用sin(2pi×1200t)和cos(2pi×1200t)分别乘呢,因为输入信号相位不知道,只用sin或者cos乘的话结果的直流分量根据相位差有偏移,乘完之后平方和就没有了。LibAPRS直接用自身信号延迟半个周期和自身相乘,相当于无论输入信号相位是多少,乘下来的结果的直流分量始终代表码序列(在延时0.5/1200周期的情况下,只有1200的乘1200得到的结果直流分量是1,12002200,22001200,2200*2200的直流分量都是0)。这样自身相乘后再滤波就得到码序列了,相比起上面的iq解调,少做一半的乘法与滤波,节省单片机的资源。
https://cloud.tsinghua.edu.cn/d/ad481bc84b9e43779395/ 这里有若干MATLAB代码,aprs_iq.m是刚才手搓的IQ解调,aprs1.m是很久以前根据LibAPRS的原理写的仿真代码,现在自己都看不懂了(悲