IQ信号からは、ベクトルの絶対値をとることで振幅が得られ、角度を求めることで atan(Q/I) 位相を得られる

その上で得られた位相を微分することで、周波数を求められる。

  1. トップ
  2. tech
  3. I/Q phase (直交信号) から周波数を求める

JavaScript だと、デコーダだけ、エンコーダだけ、というのはあったり、GF(2^8) オンリーなものはあったりするんだけど、汎用的なのがなくて悲しかった。

Zxing (バーコード読めるアプリ) の実装を見てみたら、読みやすい上で汎用的な実装だったのでリードソロモン部分だけ Java → JavaScript の移植を行った。

https://github.com/cho45/reedsolomon.js

他の目的があって移植してたけど、目的がなかなか達成できないのでとりあえずこれだけ npm にあげた。

久し振りに単純な移植作業をやった。特殊な依存が特になくほぼ計算なので

  • 型宣言を全部 var に
  • インスタンス変数の参照に this. をつける
  • System.arraycopy() を TypedArray#set() に置き換える

ぐらいを何も考えずに機械的に行なったい、テストもまるごと Zxing のものをパクって移植した。

覚書

(2が底なら?) 任意のガロア域を使えるようになっており、いろんな用途に使えそう。

new GenericGF(primitive, size, b) で作れるが、primitive polynomial (原始多項式) はビットで表現されている。

x^8 + x^5 + x^3 + x^2 + 1 という多項式なら、8 5 3 2 0 bit が立ち 100101101 となる。0ビット目は +1 を表現してる。これは一般的な表現方法らしく、このように表わされた状態を数字として 301 としたり 0x12d としたりするみたいだ。

http://octave-online.net/ で primpoly(6, 'all') とかやれば原始多項式を全部求められる。

あと、JT65 (6bit) は AZTEC_DATA_6 と同じっぽい。

  1. トップ
  2. tech
  3. JavaScript で書かれたリードソロモン符号のエンコーダ・デコーダ