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 を用いずに、単に重要なソースシンボルを複数回送出するほうが良い、と考えている)。
といったことに、注意する必要がある。
| 固定リンク
コメント
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