ワンセグのQPSKが見えた ── 自作ワンセグ復調器#2:スキャッタードパイロットでチャネルを割り、電波自身に答え合わせをさせる

#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×1212の倍数なので、「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から切り出すか」をスキャンしてみた:

bin整列スキャン。bin296だけが隣接SPコヒーレンス0.82で突き抜け、他は0.28前後の床に並ぶ棒グラフ
セグメント切り出し位置 vs 隣接SPコヒーレンス。理論値 (1024−432)/2 = 296 が、コヒーレンス0.82で一本だけ突き抜けた。他は全部ノイズ床(〜0.28)。規格から計算した位置に、電波が「そこだ」と答えた瞬間。

さらにSPはシンボルごとに3本ズレる=各シンボルの symbol%41ずつ増えるはず。各シンボルについて独立に 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枚の散布図に重ねた。

等化後コンスタレーション。左は全シンボルでぼやけた塊、右は良C/Nシンボルのみで4つのQPSKローブが理想点に分離
等化後のコンスタレーション(ch17カンテレ・V4・弱アンテナ)。左=全シンボルはぼやけた塊だが中心に4つの山。右=C/Nの良いシンボルだけ選ぶと、4つのQPSK点(シアンの+)にくっきり分離する。

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%のままでは、この先の誤り訂正が苦しいからだ。次はそのどちらかから。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

IP: 取得中...
216.73.216.65216.73.216.65