2020年2月11日火曜日

FT8はなぜ飛ぶか? ー FEC 前方誤り訂正符号

FT8は、FEC (Forward Error Correction)、日本語で前方誤り訂正符号を使っています。FECとは送るデータに冗長性をもたせ、データをすべて正確に受信されない場合でも、元のデータを復元できる手法です。簡単な例として、PHONEやCWでコールサインを複数回送るというのもFECの一種です。1回目でラスト・レターが聞き取れなくても、2回目で聞き取れる、ということはよくあります。RS-232Cで用いられる(奇数/偶数)パリティも、このFECに近い手法ですが、たとえば8ビットデータ1ビットパリティの場合、9ビットのうち1ビットが間違って受信されたとき、そのデータが壊れているということが検出できます。しかし、どの1ビットが間違っていたかについては不明なため、元の正しいデータを復元することはできません。FECとは、ざっくり言うと、このパリティビットをたくさん付加して、(元データ+パリティビット全体の)データの一部が正しく受信できない場合、他のビットから復元しようとするものです。

FT8の基本メッセージ長は相手のコールサイン28ビット、自分のコールサイン28ビット、グリッドロケータ15ビット、その他6ビットの合計77ビットです。これに14ビットのCRC(Cyclic Redundancy Check)を加えます。CRCとは、奇数/偶数パリティのように、誤りを検出する手法で、元データから14ビットのCRCデータを計算し、元データにつなげます。WSJT-Xのソースコード(crc14.cpp)を見ると、多項式係数が0x2757となっているので、x^14+x^13+x^10+x^9+x^8+x^6+x^4+x^2+x+1の多項式を使っているようです。77ビットの元データから14ビットのCRCを作りますから、同じCRCを持つ別の元データが複数あるわけですが、なるべく同じCRCにならないように工夫します。思い切りざっくり言うと、元データの77ビットのうち、1ビットだけ異なる2つのデータがあったとして、その2つのデータから全然違うCRCが生成されるようにします。

次に、パリティビットを作って付加しますが、パリティを作るにはいろいろな方法があります。FT8ではLDPC(Low Density Parity-check Code)- 低密度パリティ検査と呼ばれる手法を用います。LDPCが考案されたのは、1960年と古く、エラーフロアが低く、コーディング効率が良いということで、注目されましたが、エンコード・デコードの計算量が多く、当時の遅いコンピュータでは扱いきれないものでした。しかし、1990年代後半になり、マイコンの計算能力の向上と並列に演算できるという性質から、その特長が見直され、現在では衛星テレビ、イーサネット、WiFiなど色々な分野で使われています。FT8では、元データ77ビット+CRC14ビット+パリティ83ビットの合計174ビットをひとつのメッセージとして送ります。実際に空に送信されるデータは、同期を取るための7x7のコスタス行列を、最初、中間、最後の3箇所挿入しています。コスタス行列については後日取り上げたいと思います。




0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

WSJT-X 2.7.0-rc3 公開

 WSJT-X 2.7.0-rc3 リリースノート 2024年1月1日 WSJT-X 2.7.0-rc3では、いくつかの新しい機能、たくさんの強化改善、バグの修正を行いました。 「Hamlib更新」機能追加。Windows版では、WSJT-Xから直接Hamlibを更新することがで...