表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
35/45

エピ28 CIRCで誤り訂正をしましょう。


 ***


 CIRCで誤り訂正をしましょう。


 CIRCの処理を実装(誤り検出だけね)したら、エラーが発生しているフレームが見つかりました。これは誤り訂正しなければなりませぬ!


 ***


 エラーは 22 回目に捕捉したデータの 88 番のフレームで発生しました。音楽データと訂正符号の 32 バイトを示します。C1の計算対象となる2フレームから集めた 32 バイトです。エピ23を参照してね。


  - F22 - 88 -

   80 00 00 00 00 00 00 00 00 00 00 00

   FF FF FF FF

   00 00 00 00 00 00 00 00 00 00 00 00

   FF FF FF FF


 無音状態なので音楽データは 0x00 で訂正符号は 0xFF なのが正常なところ、最初の1バイトが 0x80 に化けていますね。


 チャネルビットで表示すると(前後のマージンビット付き)、


  正: 000 01001000100000 100 0100...

  誤: 000 01001000100001 000 0100...

     ___ _____________* *__ ____...


 このように * * のところが違い、6Tを5Tと誤判定して、その次の4Tは5Tと間違えている。


 *


 光ピックアップの信号はどうなっているのでしょうか。5Tと6Tだけを表示すると、

挿絵(By みてみん)


 怪しいトレース(赤色)がいますね。途中までは5Tに行く気配があるのが不思議。ピットが歪んでいるのでしょうか。


 気になりますが原因の分析は後回しにしましょう。


 ***


 誤り検出は、音楽データと訂正符号の計 32 バイトと4パターンの重み付けとの積和を計算することです。あ、その前に訂正符号は反転しておきます。


 重み付けは次の4パターンでした。エピ21で出てきた奴です。


  [α^0, α^0, ..., α^0, α^0, α^0, α^0],

  [α^31, α^30, ..., α^3, α^2, α^1, α^0],

  [α^62, α^60, ..., α^6, α^4, α^2, α^0],

  [α^93, α^90, ..., α^9, α^6, α^3, α^0]


 積和といっても、最初の1バイトが 0x80 で、残りは0なので、


  s0 = 0x80 * α^0

  s1 = 0x80 * α^31

  s2 = 0x80 * α^62

  s3 = 0x80 * α^93


 を求めればよいです。α^0 は 1 なので s0 = 0x80 です。積和が0にならないので、C1エラーと確定です。


 残りは...、0x80 = α^7 なので s1 = α^31 * α^7 = α^38 なのですが、...めんどくさいから計算機で計算しました。


  s0 = α^(7+ 0) = 0x80

  s1 = α^(7+31) = 0x94

  s2 = α^(7+62) = 0x2F

  s3 = α^(7+93) = 0x11


 です。積和はどれも0にならない。


 ***


 次は誤り訂正です。そのためには、


  α^(0*i)*Ei + α^(0*j)*Ej = s0

  α^(1*i)*Ei + α^(1*j)*Ej = s1

  α^(2*i)*Ei + α^(2*j)*Ej = s2

  α^(3*i)*Ei + α^(3*j)*Ej = s3


 を解くのでしたね。X = α^i, Y = α^j と置いて、それから Ei, Ej, Y を順番に消します。次数が増えないように注意してね。すると、


  (s1*s1+s2*s0)*X^2 + (s0*s3+s2*s1)*X + (s1*s3+s2*s2) = 0


 という二次方程式になります。


 方程式の係数を求めると、

 

  a = s1*s1+s2*s0 = 0x00

  b = s0*s3+s2*s1 = 0x00

  c = s1*s3+s2*s2 = 0x00


 ...。どういうことなのでしょう。係数が0では二次方程式が成り立ちません。


 実は、α^(3*i)*Ei + α^(3*j)*Ej = s3 という式の前提としてエラーが2つあること、つまり i ≠ j が必要でした。i == j の場合、Ei == Ej にもなるから、


   α^(3*i)*Ei + α^(3*j)*Ej

  = α^(3*i)*Ei + α^(3*i)*Ei

  = 0


 となってしまってダメなのでしょう。


 *


 エラーが1つの場合には、


  α^(0*i)*Ei = s0 (= α^(7+ 0) = 0x80)

  α^(1*i)*Ei = s1 (= α^(7+31) = 0x94)

  α^(2*i)*Ei = s2 (= α^(7+62) = 0x2F)

  α^(3*i)*Ei = s3 (= α^(7+93) = 0x11)


 を解けばよいのです。Ei = s0 で、α^i*s0 = s1 から α^i = s1/s0 = (α^38)/(α^7) = α^31、つまり i = 31 と直ぐに分かりますね。


 これで最初のバイトが誤っていて、0x80 - 0x80 = 0x00 が正しい値となります。


 ***


 都合よく2バイトの誤りがあるフレームって、...ありました。


  - F22 - 341 -

  00 0A 00 0A 00 00 00 00 00 00 00 00

  FF FF FF FF

  00 00 00 00 00 00 00 00 00 00 00 00

  FF FF FF FF


 1バイト目と3バイト目が 0x0A になっています(最初のバイトは0バイト目と表現します。2バイト目は1バイト目です?)


 重み付け4パターンとの積和は、


  s0 = 0x00

  s1 = 0x17

  s2 = 0xA6

  s3 = 0xBC


 です。二次方程式の係数は、

 

  a = s1*s1 + s2*s0 = 0x08

  b = s0*s3 + s2*s1 = 0xE7

  c = s1*s3 + s2*s2 = 0x6F


 です。二次方程式の解は X = [0x18, 0x60] で、i = 28, j = 30 です。


  α^(0*i)*Ei + α^(0*j)*Ej = s0

  α^(1*i)*Ei + α^(1*j)*Ej = s1


 に、i = 28, j = 30, s0 = 0x00, s1 = 0x17 を代入すると、


  Ei + Ej = 0x00

  0x18*Ei + 0x60*Ej = 0x17


 となり、Ei = Ej, 0x78*Ei = 0x17 ですから、Ei = 0x17/0x78 = α^129 / α^78 = α^51 = 0x0A。


 Ei = 0x0A, Ej = 0x0A と決まります。


 1バイト目と3バイト目がエラーで、正しい値は 0x0A - 0x0A = 0x00 となります。無事にエラー訂正できました。


 ***


 無音状態だとエラーの様子が分かりやすくて良いですね。エラーは発生したけど訂正できたし。CIRCの数値例ができたのが嬉しいです。


 ***


 間違いの指摘とか疑問とか、ご意見・ご感想とかありましたら、どうぞ感想欄に!


 ***

2025.5.27 微推敲。

2025.5.31 微推敲。

2025.6.19 微推敲。

2025.8.11 微推敲。


評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ