エピ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だけを表示すると、
怪しいトレース(赤色)がいますね。途中までは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 微推敲。




