#1 で ② OFDM同期が関西テレビの生電波にロックした。今回は約束どおり、その続きの ③ チャネル等化を実装して、ついにワンセグのコンスタレーションを描く。「パイロットで割るだけでしょ?」と思っていたら、1セグ特有の罠が一つと、自分の答え合わせを電波自身にさせる気持ちのいい瞬間があった。
なぜ「等化」が要るのか
OFDMは1024本のキャリアに別々のデータ(ワンセグはQPSK)を載せて飛ばす。ところが電波は途中で、マルチパス(反射)・アンテナ・受信機のフィルタというチャネル H(f) を通って、キャリアごとに振幅と位相がてんでバラバラに回されて届く。受信したものは Y = H·X。送った点 X を取り戻すには H を測って割る、X = Y/H ── これが等化。問題は「H をどうやって測るか」だ。
スキャッタードパイロット ── 送信側が撒いてくれた基準点
ありがたいことに、ISDB-Tは値が既知のキャリア(パイロット)を一定間隔で埋め込んでくれている。中でも スキャッタードパイロット(SP)は12本ごとに立ち、しかもシンボルごとに3本ずつ横にズレて、4シンボルで全キャリアを舐めていく。値は擬似乱数列 PRBS で ± にBPSK変調され、通常データより 4/3倍ブーストされている。SPの位置では「受信値 Y」と「送られたはずの値」が両方分かるので、H = Y / パイロット でチャネルを直接測れる。あとは測れた点の間を補間すればいい。
そのPRBS(参照実装 gr-isdbt と ARIB STD-B31 で同一)はこれ。11段のシフトレジスタを全1で初期化して回すだけ:
reg = 0b111_1111_1111 // 11ビット全1で初期化
w = reg & 1 // 出力はLSB
new = (reg>>2) ^ (reg>>0) & 1 // 帰還 X¹¹+X²+1
reg = (reg>>1) | (new<<10) // 右シフトして頭に戻す
pilot = (8/3)*(0.5 - w) // w=0→ +4/3, w=1→ -4/3
罠①:その1セグ、全帯域のどこに座ってる?
ここが1セグ自作の落とし穴だった。PRBSは全帯域(13セグメント・5617キャリア)を通しで連番に振った番号で進む。つまり各SPの符号(+か-か)は、その絶対キャリア番号で決まる。ところが僕らが録っているのは真ん中の1セグメント(432本)だけ。この432本が全帯域の何番目から始まるかを知らないと、PRBSの符号が丸ごとズレて、チャネル推定が全滅する。
答え:部分受信(ワンセグ)に使われるのは論理セグメント0で、これは周波数軸でちょうど真ん中=13セグメントの7番目に置かれる。だから絶対キャリア番号 2592(=6×432)からの432本。しかも 2592 = 216×12 と12の倍数なので、「12本ごと」というSPの周期パターンはセグメント内のローカル番号でもそのまま成立する。地味な事実だが、ここを1本外すと何も復調できない、文字どおりの急所だった。
やることは、3行
① H[l] = Y[l] / パイロット[l] // SPの位置でチャネルを直接測る
② SP(12本間隔)の間を線形補間 // 端は傾きで外挿
③ X[l] = Y[l] / H[l] // 全キャリアを割って等化
検算:合ってるか、電波自身に言わせる
今回いちばん面白かったのがここ。仮説は積み重なっている ── ②の同期、セグメントの切り出し位置、PRBSオフセット2592、各シンボルの symbol%4。このどれか一つでも狂っていれば全部おかしくなる。どう確かめる?
物理的に、チャネル H(f) は周波数方向に滑らかなはずだ(隣のキャリアで急に位相は飛ばない)。ということは、隣り合うSPで測った H は近い値になるはず。これを「隣接SPコヒーレンス」(0〜1、1で完全に揃う)で測る。もし仮説がどこか狂っていれば、PRBSの符号がランダムに化けて H はただのノイズになり、コヒーレンスは床に落ちる。つまりこの一つの数字が、積み重ねた仮説全体の答え合わせになる。
まず「セグメントをFFTのどのbinから切り出すか」をスキャンしてみた:

さらにSPはシンボルごとに3本ズレる=各シンボルの symbol%4 は 1ずつ増えるはず。各シンボルについて独立に symbol%4 を当てさせたら、きれいに 0,1,2,3,0,1,2,3… と並んだ。同期もセグメント抽出もPRBSオフセットも、全部正しい、という強い裏取りだ。
=== bin整列スキャン(正しい位置だけ立つ)===
bin 295 : 0.267
bin 296 : 0.816 ★ = (1024-432)/2、理論どおり圧勝
bin 297 : 0.304
=== symbol%4 位相(各シンボル独立に検出)===
sym0:0 sym1:1 sym2:2 sym3:3
sym4:0 sym5:1 sym6:2 sym7:3 → +1/シンボルで整合 ✓
平均SPコヒーレンス(512シンボル): 0.839
ワンセグのQPSKが、見えた
確定した整列で全512シンボルを等化し、データキャリアを1枚の散布図に重ねた。

4象限がきれいに均衡している ── QPSKだ。ワンセグはモバイル前提で一番頑丈なQPSKを使うので、これは期待どおり。点の雲が4つに割れて見えた瞬間、「電波からビットの一歩手前まで来た」という実感があった。
ボケの正体はバグじゃない、C/Nだ
正直、最初にこの太いクラスタを見たときは等化のバグを疑った。が、コヒーレンスが高い(=瞬間的にC/Nが良い)シンボルだけ選り分けて描き直すと(上の右図)、4つのQPSK点が理想位置にスッと締まる。つまり等化は正しく動いていて、残るボケは純粋に信号対雑音比=弱いアンテナのせい。#1のUHFスキャンで床+11dBしか無かったのを思い出す。EVMは全シンボルで132%、良シンボルだけなら98%。まだ高い。ボトルネックは完全にアンテナだ。
いまの到達点
- ① RF入力(rtl_sdr の生IQ)… 済
- ② OFDM同期(CP自己相関+周期性GI判定)… 実電波でロック確認
- ③ チャネル等化(スキャッタードパイロット)… 実電波でQPSK確認
- ④ デマップ+デインターリーブ(要TMCC)/⑤ FEC /⑥ TS … この先
教訓:パイロット等化は「割るだけ」だが、割る基準(PRBSの絶対位相)を1ビット間違えると全滅する。そして正しさは規格表をにらむだけでなく、電波自身に検算させられる ── コヒーレンスという一つの数字が、積み上げた仮説を一発で裏取りしてくれた。これが効いた。
次回 #3 は、QPSKの「点の雲」からビットを取り出す側へ。そのためにまず ④ TMCC(伝送制御情報)を読んで、変調方式と畳み込み符号化率を電波から知り、デインターリーブにかける。…のだが、その前に壁のTVアンテナ端子(F→SMA変換)に挿してC/Nを稼ぐのが先かもしれない。EVM 98%のままでは、この先の誤り訂正が苦しいからだ。次はそのどちらかから。

コメントを残す