エピ18 マージンビットの選択に特例があります。
***
マージンビットの選択に特例があります。
この特例はCD-ROM規格に明記されているのですが、CD規格では見つかりませんでした。でもCDでも同じはずです。
***
特例とは、前後と合せると0の連続が 10 個であっても、その選択を制限することです。
例として、データが 0x59 と 0x25 の場合で説明します。この2バイトはEFM変換テーブルで次のようになります。
0x59 --> 10000000000100
0x25 --> 00000100001000
この間に入れるマージンビットは、連続する0の連続としては4種類のどれでも選択可能なので(直前のカウンタは0とすると)カウンタが0に近くなる000が選択されるでしょう。0の連続はちょうど 10 個です。
10000000000100 000 00000100001000 ... +8 -3 -4 = +1
10000000000100 100 00000100001000 ... +8 +3 +4 = +15
10000000000100 010 00000100001000 ... +8 +1 +4 = +13
10000000000100 001 00000100001000 ... +8 -1 +4 = +11
すると先頭からの 24bit が同期信号(100000000001000000000010)と同じパターンになってしまいます!
このような場合には特例として000は選択しないことになっているのです。この特例があるから同期信号と同じパターンはフレーム中には存在しないのです。
だから同期信号でフレーム先頭を検出できるのでした!
*
マージンビットの特例は 14bit 中に 0 が 10 連続する場合に発生します。そのうち1つはサブコードの S0 で、他は 0x59 と 0x7C です。
_____ ___ 00100000000001 000 0000000100 S0
_____ __0 01000000000010 000 000000100_ 0x59
_____ _00 10000000000100 000 00000100__ 0x7C
それから、先頭と末尾に 0 が 5〜8 連続する場合にも発生します。
___00 100 00000000100000 000 00100_
__001 000 00000001000000 000 0100__
_0010 000 00000010000000 000 100___
00100 000 00000100000000 001 00____
なお、サブコードの S1 は先頭に 0 が 9 連続しますが、サブコードの前は同期信号なので特例は発生しません。
SYN_____________________ MGN S1____________ MGN
100000000001000000000010 010 00000000010010 0__
末尾に 0 が 9 連続する場合は(EFM変換テーブルにはありませんけど)、先頭に 0 が 9 連続するのは S1 のみなので特例は発生しません。安全です。
_00 10001000000000 010 000000000100__ ___
***
EFM変換テーブルの 256 個は、どうやって選んだのかちょっと調べてみました。
まずは 2^14 = 16384 個からEFMのルールに合わないものを除外します。11と101を含むもの、0が 11 個以上連続するものを除くのです。すると 267 個が残ります。
なので、あと 267-256 = 11 個を除くのですけれど、...。
ここで、ちょっとズルをしてEFM変換テーブルを参照して、除外される 11 個を表示してみます。
1 00000000001000
2 00000000001001
3 00000000010000
4 00000000010001
5 00000000010010
1 00001000000000
2 01001000000000
3 10001000000000
4 00010000000000
5 10010000000000
1 00100000000001 ... S0
除外される 11 個とは、...先頭か末尾に0が9個以上連続するものと、S0 でした!
これで 256 個が選ばれたようです。
***
マージンビットの特例で、やっと同期信号の謎が解けたけど、同期信号とかEFM変換テーブルの設計ってヤバイくない?
00010000000000 : 10z tail ... not in EFM
10010000000000 : 10z tail ... not in EFM
00000000001000 : 10z head ... not in EFM
00000000001001 : 10z head ... not in EFM
00100000000001 : 10z mid ... not in EFM S0
01000000000010 : 10z mid ... 0x59
10000000000100 : 10z mid ... 0x7C
00001000000000 : 9z tail ... not in EFM
01001000000000 : 9z tail ... not in EFM --> 0x59 ?
10001000000000 : 9z tail ... not in EFM --> 0x7C ?
00000000010000 : 9z head ... not in EFM
00000000010001 : 9z head ... not in EFM --> S0 ?
00000000010010 : 9z head ... not in EFM S1
うーん、うーん、こ、これが最適なのかな。
先頭や末尾に 0 が 10 連続するパターンは避けるとして、中間に 10 連続するパターンも止めた方が良いと思うのです。逆に 9 連続は使ってよいのではないかな。条件付きだけど。
サブコードの S0 は S1 と同じく先頭 9 連続すればよいと思うし、0x59 と 0x7C は末尾 9 連続するパターンにすれば良くない?
特例の発生頻度を減らせるよね? 特例は少ない方が良いよね? 違う?
特例の判定はCDを製造するときだけだから、再生するときには関係しないから、気にする必要はないかもだけど。でもCD-Rとかあるし。ブツブツ、...。
***
間違いの指摘とか疑問とか、ご意見・ご感想とかありましたら、どうぞ感想欄に!
***
2025.5.22 推敲。




