Wikipedia の LDPC の項だけ読むとそんな難しくなさそうに見えるけど、実際に実装しようと思うと、むちゃくちゃ難しい。

H行列 (パリティ検査行列) が難しい

LDPC符号の設計では、性能に優れたパリティ検査行列(H行列)を用意するのがまず難しい。ここにいろんな要素がある。

  • 正則(regular)か(各ノードの次数が一定)
  • 構造的な性質(たとえば巡回構造をもつ QC-LDPC など)を持つか (復号効率に影響する)
  • 系統的符号化 が可能な構造(systematic) を持つか(これは生成行列側の問題)
  • girth(ループの最小長): Tannerグラフにおいて短いサイクルは復号性能を劣化させるため、girthが大きい方が望ましい。

数学的素養がないと難しすぎる。そして自力で設計するのは考えたくない。

Protographが難しい

そんなH行列、例え1つ設計できたとしても、任意のデータ長・符号化率を持つH行列をいくつも作ろうと思うと何倍も大変になってしまう。

そこで Protograph (原始グラフ) という性質の良い原型となるような小さなグラフをまず設計し、それを何らかの方法で拡大して任意の大きさのH行列を得るという設計方法がある。

パンクチャリングが難しい

パンクチャリングは性質の良いH行列を使うために,多少の計算効率を犠牲にしつつ柔軟な送信ビット長/符号化率を得るための方法といえる

良い性質の Protograph を得られたとしても、それを拡大するプロセスには制約がある。整数倍の行列しか作れないとか。

そうなると求めるデータ長・符号化率ぴったりの行列というのは結局作れない。

これを解決するのがパンクチャリング。符号化率の低い(0.4など)のProtographを拡大し、欲しい符号化率 (0.5など)になるまでパリティビットの一部を送信しないことで、ちょうどいいサイズを作れる。

ぴったりよりも大きい行列を使うので計算コストは増えるが、高性能なH行列設計を流用できるという利点がある。

エンコードもデコードも難しい

エンコードは既知の操作するだけやろ? という気持ちを打ち砕く。どっちも難しい。なんならデコードのほうが簡単かもしれない

  • エンコードは生成行列(G行列)を得る必要がある。任意のH行列に対してG行列を導出するのが難しい。
  • デコードには、確率伝播(Belief Propagation)アルゴリズムに基づく Sum-Product 法や、近似的な Min-Sum 法などがある。どちらもTannerグラフ上での繰り返し計算を必要とし、実装や収束性で難しい
  1. トップ
  2. tech
  3. LDPC難しすぎる

ただの時報

https://play-morse.lowreal.net/jiho.html

むかーーし作った時報のコードを発掘した。今なら Voicevox つけたらちゃんと喋る時報にできるぞと思ったのでガっとやった。正午だけ特殊なのでレアです。

短波JJYの再現

https://play-morse.lowreal.net/vhf-jjy.html

VHF JJYの再現スクリプトのほうも時報音声を入れるようにした。こっちは10分ごとにしか喋らないのでレアです。

文字スクロール動画ジェネレーターというのを作った。

別のプロジェクトでffmpeg.wasmを使ってて面白かったので、もうちょっとわかりやすい応用を作ってみようという感じ。

Twitter はほぼそのまま再生されるけど、 Bluesky だとフレームレートが低くなっちゃうっぽい?

MediaRecorder vs ffmpeg.wasm

MediaRecorderというブラウザでcanvasを録画する標準機能がある。面白い機能なんだけどいくつか問題がある

  • 出力フォーマットがブラウザ依存かつ限られる
    • Chrome だと vp9+webm とか
    • ダウンロードして編集ソフトに持っていくと読みこめなかったりする
  • フレームレート可変になる
    • これもブラウザ依存だけど、canvas の dirty さを監視してて dirty なフレームしか記録しないようだ
    • ダウンロードして編集ソフトに持っていくと読みこめなかったりする
  • リアルタイムでしか収録できない
    • n秒録画するためにはn秒レンダリングして待つ必要がある
  • 尻切れ
    • なんかよくわからないが stop() したタイミングでうまく canvas を読んでくれない? みたい

ということで面白いけど使いにくい機能になっている。

「ダウンロードして編集ソフトに持っていくと読みこめなかったりする」を解決するために、MediaRecorder で録画したファイルを ffmpeg.wasm に読みこませてトランスコードする、という方針をとったりしていたけど、だったら直接 ffmpeg.wasm にフレーム画像全部渡せばいいとなり、MediaRecorder を使うのをやめてしまった。

MediaRecorder の使い道はストリーミングとかなんだろう。

  1. トップ
  2. tech
  3. 文字スクロール動画ジェネレーター