Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Pythonによる、デジタル通信のための ビタビ符号化・復号ライブラリの作成

873 views

Published on

デジタル通信において誤り訂正に使われているビタビ符号をPythonで実装した報告です。*これは2017-07-05に熊本市の未来会議室で開催されたオトナのオブジェクト勉強会でのLT資料です。

Published in: Engineering
  • Be the first to comment

Pythonによる、デジタル通信のための ビタビ符号化・復号ライブラリの作成

  1. 1. Pythonによる、デジタル通信のための ビタビ符号化・復号ライブラリの作成 LT of オトナのオブジェクト指向勉強会 2017-07-05 森下功啓 1
  2. 2. 最近作っているものズ 2 ←⾳波(正弦波)をBPSKで変調させた様⼦ ⽔中⾳響測位の実験装置
  3. 3. デジタル通信とは • PC内部のデータは全部デジタル • 0と1の並びで情報を伝達できる • 0と1を伝達することをデジタル通信という シリアル通信を観測 した電圧の変化 (LSBファースト) 3 "0" "1" "2" "3" "4"ASCII code 電圧 時間 (右ほど最近) High: 1 Low: 0
  4. 4. 伝搬の⼿段 4 有線の電線での通信:電圧が伝搬 無線通信:電波が伝搬
  5. 5. 周波数を変えるFSK (縦笛の⾳の⾼さに0,1を割り当てるイメージ) 位相を変えるPSK (周波数は同じだが、sinとcosを交互に切り替えるなど) 電波で01 5 *振幅を変えるASKもある
  6. 6. 01を伝える⼯夫 • 01001101…などの拡散符号系列(PN系列)を使って変調する • 正相なら1で逆相なら0 • PSKなら狭帯域ノイズに強くなる。FSKなら広帯域短時間ノイズに強く 6 GPSの例(PSKでPN系列を利⽤している) http://www.ni.com/tutorial/7139/ja/
  7. 7. 7 「⾺⿅な!周波数の変換コードは部内の最⾼機密だぞ!」 FSKにPN系列を活⽤した例
  8. 8. 電波での通信ミスと対策 • データの伝送にはミスがつきもの • 原因はノイズなど • 対策 • 01を間違えにくくするために、⻑いPN系列を使う • ノイズがバースト的だと、全体の通信時間が無駄に伸びるデメリット有り • バースト的な誤りを訂正できる様に、送信するデータを符号化する 8 110101011 110100011
  9. 9. 誤り訂正のための畳み込み符号化と復号 データの1ビットが複数の送信ビットに拡散される。 ⼀部を間違えて受信しても前後のデータから復元が可能である。 復号符号化 推定された元データ元データ 9 受信データ (含誤り) 1101011100111011001100010 110001010011101100 1100010 送信
  10. 10. ビタビ符号の符号化器の例 • 過去データも含めて出⼒が決定される 10 レジスタ 出⼒上位ビット 出⼒下位ビット 出⼒されるビット列 ⼊⼒ 𝑥" 𝑥"#$ 𝑥"#% 𝑐" ' 𝑐" ( 並 直 変 換 (𝑐" ' 𝑐" ( ) (𝑥"#$ 𝑥"#%) 符号化器のPythonによる実装例
  11. 11. 復号アルゴリズム • レジスタの状態遷移に拘束条件がある • 11→00や11→10はありえない 11http://www.mobile.ecei.tohoku.ac.jp/lecture/coding/coding_06.pdf トレリス線図
  12. 12. 復号アルゴリズム • A→CやC→Cなどはありえない 12 http://www.mobile.ecei.tohoku.ac.jp/lecture/coding/coding_06.pdf 受信系列から復元した レジスタ状態遷移 推定されるルート *受信データは⼀部が間違って いるだけで、全体的には正しい 部分が多いことが復号の前提
  13. 13. 実装した復号アルゴリズム 1. トレリス線図の全経路を作成 2. 受信データ系列から、レジスタの状態遷移系列を作成 3. 全経路と受信系列の距離を計測 4. 最短の経路を正しい系列とみなす 5. 推定されたレジスタの状態遷移系列から送信データを復元 13
  14. 14. 14 https://gist.github.com/KatsuhiroMorishita/5c693e23c725f373181f600461b01ee6Gist
  15. 15. 実装した機能 • 送信したいデータをセットすると符号化するviterbi_encoderクラス • 受信系列をセットすると復号するviterbi_decoderクラス • いずれも、符号化器の関数を渡して動作する • 任意の符号化器が使える! • 送信データの推定結果は誤差と共にリストとして返される 15 [([1, 1, 0, 0, 0, 1, 0], 2.2360679774997898), ([1, 1, 0, 1, 1, 1, 0], 2.2360679774997898), ([1, 1, 1, 0, 1, 1, 0], 2.6457513110645907)] 出⼒例
  16. 16. 16 バーストノイズにお困りの皆さん、どうぞお使いください!

×