« スカパー!e2 物理チャンネル一覧 | トップページ | スカパー!HDチューナー(TZ-WR320P)への機器変更 »

2011年4月18日 (月)

UEP (Unequal Error Protection) についての考察

ARIB技術資料(放送分野) にある ARIB TR-B33 1.0版「セグメント連結伝送方式による地上マルチメディア放送運用規定(第三分冊)」「第十一編 マルチメディア放送 蓄積型放送の運用」「2.1.6.3 UEP (Unequal Error Protection)」(11-52頁)のプログラムコードは、どうもおかしい。
----【2011年07月26日 追記】(ここから)----
2011.07.07改定の ARIB TR-B33 1.1版の(11-52頁)では、以下の「☆」で示した部分が修正され、私が正しいと考えるUEPプログラムコードと一致しています(ARIB TR-B33 1.1版の改定履歴には、本件の記載無し)。
----【2011年07月26日 追記】(ここまで)----
----【2011年12月21日 追記】(ここから)----
2011.12.06改定の ARIB STD-B45 2.1版「デジタル放送におけるダウンロード方式」の改定履歴に、「付録C C.2 UEP」の誤記修正の記載がありました。
----【2011年12月21日 追記】(ここまで)----
結論を先に書くと、以下の「☆」で示した部分が、おかしいということである。

==== ARIB TR-B33 1.0版のUEPプログラムコード(ここから) ====
┌────────────────────
│void left_matrix_init(int k, int n, int N1, int m, int low, int high)
│{
│ int i, j, h, t, u[N1 * k], uep;

│ for(h = N1 * k - 1; h >= 0; h--){
│  u[h] = h % (n - k - m);
│ }
│ t = 0;
│ for (j = 0; j < k; j++) {
│  for (h = 0; h < N1; h++) {
│☆  for (i = t; i < N1*k && matrix_has_entry(u[i], j); i++){
│    if (i < N1*k) {
│     do {
│      i = t + pmms_rand(N1*k-t);
│     } while (matrix_has_entry(u[i], j));
│     matrix_insert_entry(u[i], j);
│     u[i] = u[t]; t++;
│    } else {
│     do {
│      i = pmms_rand(n - k - m);
│     } while (matrix_has_entry(i, j));
│      matrix_insert_entry(i, j);
│    }
│☆  }
│  }
│ }

│ uep = high - low + 1;
│ for(h = N1 * uep - 1; h >= 0; h--){
│  u[h] = (n - k - m) + (h % m);
│ }
│ t = 0;
│ for (j = low; j < high; j++) {
│  for (h = 0; h < N1; h++) {
│☆  for (i = t; i < N1*uep && matrix_has_entry(u[i], j); i++){
│    if (i < N1*uep) {
│     do {
│      i = t + pmms_rand(N1*uep-t);
│     } while (matrix_has_entry(u[i], j));
│     matrix_insert_entry(u[i], j);
│     u[i] = u[t]; t++;
│    } else {
│     do {
│      i = (n - k - m) + pmms_rand(m);
│     } while (matrix_has_entry(i, j));
│     matrix_insert_entry(i, j);
│    }
│☆  }
│  }
│ }
│}
└────────────────────

行列の視覚化のため、上記ロジックを VBA に移植した Excelファイルを以下に示す。

http://sakaiyas.cocolog-nifty.com/nikki/files/work/rfc5170_uep_staircase_g_TR_B33v1_0.xls
==== ARIB TR-B33 1.0版のUEPプログラムコード(ここまで) ====

==== 私が正しいと考えるUEPプログラムコード(ここから) ====
┌────────────────────
│void left_matrix_init(int k, int n, int N1, int m, int low, int high)
│{
│ int i, j, h, t, u[N1 * k], uep;

│ for(h = N1 * k - 1; h >= 0; h--){
│  u[h] = h % (n - k - m);
│ }
│ t = 0;
│ for (j = 0; j < k; j++) {
│  for (h = 0; h < N1; h++) {
│☆  for (i = t; i < N1*k && matrix_has_entry(u[i], j); i++);
│   if (i < N1*k) {
│    do {
│     i = t + pmms_rand(N1*k-t);
│    } while (matrix_has_entry(u[i], j));
│    matrix_insert_entry(u[i], j);
│    u[i] = u[t]; t++;
│   } else {
│    do {
│     i = pmms_rand(n - k - m);
│    } while (matrix_has_entry(i, j));
│    matrix_insert_entry(i, j);
│   }
│  }
│ }

│ uep = high - low + 1;
│ for(h = N1 * uep - 1; h >= 0; h--){
│  u[h] = (n - k - m) + (h % m);
│ }
│ t = 0;
│ for (j = low; j < high; j++) {
│  for (h = 0; h < N1; h++) {
│☆  for (i = t; i < N1*uep && matrix_has_entry(u[i], j); i++);
│   if (i < N1*uep) {
│    do {
│     i = t + pmms_rand(N1*uep-t);
│    } while (matrix_has_entry(u[i], j));
│    matrix_insert_entry(u[i], j);
│    u[i] = u[t]; t++;
│   } else {
│    do {
│     i = (n - k - m) + pmms_rand(m);
│    } while (matrix_has_entry(i, j));
│    matrix_insert_entry(i, j);
│   }
│  }
│ }
│}
└────────────────────

行列の視覚化のため、上記ロジックを VBA に移植した Excelファイルを以下に示す。

http://sakaiyas.cocolog-nifty.com/nikki/files/work/rfc5170_uep_staircase_g_SAKAI.xls
==== 私が正しいと考えるUEPプログラムコード(ここまで) ====

ロジックがおかしいと考える理由を以下に示す。

・一見うまく動作しているように見えるが、N1 の値を変更しても、各列の1の個数に変化がない動きをする。
・上記「☆」で示した修正を行えば、N1 の値に比例して各列の1の値が変化するようになる。
・前半部分の「☆」で示した for 文は、純粋な LDPC Staircase である RFC5170 では、1行で完結する for 文(末尾が『{』ではなく『;』)になっている。

ロジックとは関係ないが、ARIB TR-B33 1.0版における ISDB-Tmm 方式の FLUTE の AL-FEC では、

・UEP の場合も、FEC-OTI-FEC-Encoding-ID に LDPC Staircase 用の値「3」を指定するので、FEC-OTI-Scheme-Specific-Info の内容(バイト数)で、純粋な LDPC Staircase か UEP かを判断する必要がある(私は、UEP 用に新たに IANA で採番すべき、と考えている)。
・ソースブロックが複数になる場合は、ブロック毎に UEP の low(UEP左端列番号)と high(UEP右端列番号)で指定した範囲のソースシンボルを修復しやすくする意味になる(私は、UEP を用いずに、単に重要なソースシンボルを複数回送出するほうが良い、と考えている)。

といったことに、注意する必要がある。

|

« スカパー!e2 物理チャンネル一覧 | トップページ | スカパー!HDチューナー(TZ-WR320P)への機器変更 »

コメント

http://www.soumu.go.jp/main_sosiki/joho_tsusin/policyreports/joho_tsusin/housou_system/ad1/14551.html
→「情報通信審議会 情報通信技術分科会 放送システム委員会 マルチメディア放送システム作業班 アドホックグループ1(第2回)配付資料」

http://www.soumu.go.jp/main_content/000026318.pdf
→「資料2-2 アドホックグループ1 報告(案)」

の71頁にある「図3.1.5.4-22 検査行列生成アルゴリズム」といった、純粋な LDPC Staircase でも、同様に for 文の書き誤り(末尾が『;』ではなく、間違いである『{』になっている)があったので、「UEP の場合も、書き誤っていませんか?」ということです。

投稿: 本人 | 2011年4月19日 (火) 09:12

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/42597/51422024

この記事へのトラックバック一覧です: UEP (Unequal Error Protection) についての考察:

« スカパー!e2 物理チャンネル一覧 | トップページ | スカパー!HDチューナー(TZ-WR320P)への機器変更 »