rtty 是許多人進入業餘無線電數據通訊的搖籃,它的觀念簡單易懂,不過存在下面幾個缺點:
可用的字元太少:使用 5 位元編碼,扣掉控制碼,只能表示 50 個字元。
頻寬太寬:以業餘 shift 170hz 及 45.25 baud rate,大約需要 270hz 的頻寬。
易受干擾而出現錯字,如果 fig 或 ltr 字元被干擾,就會錯字連篇。
近年來電腦音效卡已經相當普及,而且 dsp 數位音效處理的技術已經相當成熟,雖然有很多 rtty 軟體使用 dsp 的技術來降低 rtty 的錯誤率,但是英國業餘無線電家 g3plx, peter martinez 認為這只是換湯不換藥,前面 1, 2 點的缺點仍然存在,於是他就以應用音效卡的功能為主架構,在 1997 發展出一個簡單好用而且錯誤率比 rtty 更低的的數據通訊方式,那就是 psk31。
psk31 varicode 編碼方式
把符號轉換成 0 與 1,是數據通訊的第一步。依照每個符號編碼的長度,有固定長度與不定長度兩種方式,而 g3plx 想要發展的是適合 keyboard chat 的數據通訊方式,以下就編碼方式與 keyboard chat 的需求作比較:
項目 固定長度編碼 不定長度編碼 需求
編碼長度 使用固定長度的位元代表一個符號,以 start bit 與 stop 來隔開字符,例如 rtty 為 5 位元編碼,ascii 有 7 bits 與 8 bits 兩種。 使用不定長度的位元代表一個符號,利用特定的碼來區別字符,以摩斯電碼為典型代表,例如 1 為 key on,0 為 key off,用 0, 1, 000, 111 來編碼,00000 作為 start / stop 碼。越不常用的碼長度越長。 均可
符號數量 有限 依據編碼原則,可無限擴充 常用的文字符號與控制碼即可
字符傳送效率 不管內容為何,只要字符數相同,其傳送速率固定不變。 常用字的編碼會比較短,所以其傳送速率會隨內容而改變。 即時的打字與閱讀相對於電腦的處理速度都不算快,所以都不需要太快的傳送效率。
baud rate 每秒的位元數 每秒的位元數 越慢越好,如此可提高辨識率。如果字符傳送效率相同,編碼的長度越短,就能夠降低 baud rate。
擴充性 有兩種方式,一種是使用兩個位元組來代表一個字符,例如中文碼,這種方式會降低字符的傳送效率,另一種方式是使用特殊字符來作為擴充字的前導字,例如 baudot 的 ltr 與 fig。 依據編碼原則,可無限擴充。會被擴充的一定是比較少用的,所以對字符傳送效率的影響很小。 有常用的文字、符號與控制碼即可,不太需要擴充性,有擴充性當然比較有彈性。
連續錯誤率 若 start/stop bit 或前導字符被干擾,會連續錯很多字。 因為利用特定的碼來區別字符,所以幾乎不會連續有錯誤。 連續錯誤率當然是越低越好。
從以上的分析,g3plx 認為用不定長度的編碼方式來做『文字交談』最好,所以他定義了一個很簡單的編碼方式,稱為 varicode alphabet:利用 00 來隔開字符,因此每個字符的開始與結束都是 1,而且字符內不可出現連續的 0。
引用以上定義,可知最短的編碼是 1,再來是 11,接著是 111, 101,然後是 1111,1011,1101, 11111, 10101, 11101, 10111, 11011,以下以此類推。實際上,他依把照 ascii 的前 128 字元定義如下:
000 nul 1010101011 032 sp 1 064 @ 1010111101 096 / 1011011111
001 soh 1011011011 033 ! 111111111 065 a 1111101 097 a 1011
002 stx 1011101101 034 " 101011111 066 b 11101011 098 b 1011111
003 etx 1101110111 035 # 111110101 067 c 10101101 099 c 101111
004 eot 1011101011 036 $ 111011011 068 d 10110101 100 d 101101
005 enq 1101011111 037 % 1011010101 069 e 1110111 101 e 11
006 ack 1011101111 038 & 1010111011 070 f 11011011 102 f 111101
007 bel 1011111101 039 ' 101111111 071 g 11111101 103 g 1011011
008 bs 1011111111 040 ( 11111011 072 h 101010101 104 h 101011
009 ht 11101111 041 ) 11110111 073 i 1111111 105 i 1101
010 lf 11101 042 * 101101111 074 j 111111101 106 j 111101011
011 vt 1101101111 043 + 111011111 075 k 101111101 107 k 10111111
012 ff 1011011101 044 , 1110101 076 l 11010111 108 l 11011
013 cr 11111 045 - 110101 077 m 10111011 109 m 111011
014 so 1101110101 046 . 1010111 078 n 11011101 110 n 1111
015 si 1110101011 047 / 110101111 079 o 10101011 111 o 111
016 dle 1011110111 048 0 10110111 080 p 11010101 112 p 111111
017 dc1 1011110101 049 1 10111101 081 q 111011101 113 q 110111111
018 dc2 1110101101 050 2 11101101 082 r 10101111 114 r 10101
019 dc3 1110101111 051 3 11111111 083 s 1101111 115 s 10111
020 dc4 1101011011 052 4 101110111 084 t 1101101 116 t 101
021 nak 1101101011 053 5 101011011 085 u 101010111 117 u 110111
022 syn 1101101101 054 6 101101011 086 v 110110101 118 v 1111011
023 etb 1101010111 055 7 110101101 087 x 101011101 119 w 1101011
024 can 1101111011 056 8 110101011 088 y 101110101 120 x 11011111
025 em 1101111101 057 9 110110111 089 z 101111011 121 y 1011101
026 sub 1110110111 058 : 11110101 090 [ 1010101101 122 z 111010101
027 esc 1101010101 059 ; 110111101 091 \ 111110111 123 { 1010110111
028 fs 1101011101 060 < 111101101 092 ] 111101111 124 | 110111011
029 gs 1110111011 061 = 1010101 093 ^ 111111011 125 } 1010110101
030 rs 1011111011 062 > 111010111 094 _ 1010111111 126 ~ 1011010111
031 us 1101111111 063 ? 1010101111 095 . 101101101 127 del 1110110101
由上表可以發現,最短的碼為空格,最長的碼為 10 位元,英文小寫字編碼比較短,平均只有 6 位元,而實際通訊上,因為空格及 aeiounrst 等字比較多,平均位元數會更短。此外,如果打字速度很快的人或是你預先設定好通訊內容,可以盡量用小寫字來縮短傳送時間,打字速度慢的人就不用考慮這一些。
引用上面的編碼,假設傳送 ten 這個字,我們來比較幾種編碼的傳送效率,我們將發現 varicode 的編碼實在是很短。