BI1ALF 在樓上的已經有人貼出了連結,這裡就不再重複說明了。簡單來說,其原理如下:
APRS 的物理層使用 AFSK1200,簡單來說,1200Hz 和 2200Hz 分別表示 1 和 0(或 0 和 1,這並不重要,因為後面還有 NRZI 編碼,用反轉表示 0,用不反轉表示 1),每個 bit 的長度是 1/1200 秒,也就是 1200Hz 的一個週期。這種編碼方式的長度和週期相當,無法透過濾波器來解調,因為濾波器的群延遲已經大於編碼長度,速度跟不上編碼的變化。
通常這種訊號解調都使用 IQ 解調,簡單來說就是將兩路正交訊號(例如這裡可以是 sin(2π × 1200t) 和 cos(2π × 1200t))與輸入訊號相乘,然後濾掉高頻分量後再平方和開根號,就可以得到實際的碼序列(也就是什麼時候是 1、什麼時候是 0),之後再根據碼序列長度(也就是什麼時候有完整的 1 和 0,以及 APRS 開始時有一段 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 原理所撰寫的模擬程式。現在我自己都看不懂了(很遺憾)。