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

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

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

エラーが発生しました。

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

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

エピ30 マージンビットを確認しましょう。


 ***


 マージンビットを確認しましょう。


 マージンビットとはEFM変換された 14 ビットの後に付ける3ビットのことです。同期信号とサブコードの S0 と S1 の後にも付けます。


 マージンビットは、チャネルビットの1と1の間の0の個数が適度になるように、つまりピットとランドが3T〜11Tになるような3ビットを入れます。


 それから可能ならピットとランドがバランスできる方を選びます。


 ***


 エピ27で見つけたフレームを再掲します。サブコードが 0x00 の場合です。


  100000000001000000000010 010 ... 同期信号

   01001000100000 000 ______________ ___ ... サブコード

   01001000100000 100 01001000100000 000

   01001000100000 100 01001000100000 000

   01001000100000 100 01001000100000 000

   01001000100000 100 01001000100000 000

   01001000100000 100 01001000100000 000

   01001000100000 100 01001000100000 100 ... 音楽データ(12 バイト分)

   00100000010010 000 00100000010010 010

   00100000010010 000 00100000010010 010 ... 訂正符号(4バイト分)

   01001000100000 000 01001000100000 100

   01001000100000 100 01001000100000 000

   01001000100000 100 01001000100000 000

   01001000100000 100 01001000100000 000

   01001000100000 100 01001000100000 000

   01001000100000 100 01001000100000 000 ... 音楽データ(12 バイト分)

   00100000010010 000 00100000010010 000

   00100000010010 000 00100000010010 000 ... 訂正符号(4バイト分)


 同期信号の 24T の後に3ビット、サブコードの 14T の後にも3ビット、それから音楽データと訂正符号の 14T の後にも、もれなく3ビットが付いています。


 これらがマージンビットです。


 無音状態で音楽データが 0x00 の場合のことをエピ26で考えてみたときには(面倒だったので)マージンビットは000と仮定しましたが、実際には100と010も入るのですね。001は無い。


 フレームの前半の音楽データでは000と100が交互に入り、訂正符号では000と010が交互に入るというパターンですが、後半では100が2連続したり、000が連続したり等の違いがあります。どうなっているのか見ただけでは分からないですね。


 チャネルビットが 01001000100000(0x00)や 00100000010010(0xFF)のとき、マージンビットは、0x00 の前の001と 0xFF の後の100が禁止されるだけで、000や010などの値は選択可能です。


 複数の値が選択できる場合にマージンビットを決めるのは、ピットとランドのバランス(カウンタの値)なのです。


 ならば、カウントしてみましょう。


 *


 同期信号の後にサブコードの 0x00 が続く場合、選択可能なマージンビットは000と010なので、カウンタの初期値は0でランド開始として(これを 0L と表します)、


  100000000001000000000010 000 01001000100000

  11111111111___________11 111 1___1111______ = 0L +2 +3 -4 = 1L ★


  100000000001000000000010 010 01001000100000

  11111111111___________11 1__ _111____111111 = 0L +2 -1 +4 = 5P


 カウンタが大きく・・・なる010が選択される? アレ? アレ?


 ...。その次に 0x00 が続く場合、カウンタは5でピット開始(5P)なら、


  000 01001000100000

  111 1___1111______ = 5P +3 -4 = 4L ★


  100 01001000100000

  ___ _111____111111 = 5P -3 +4 = 6P


  010 01001000100000

  1__ _111____111111 = 5P -1 +4 = 8P


 なので000が選ばれる。


 もしもカウンタが1でランド開始(1L)だと、


  000 01001000100000

  ___ _111____111111 = 1L -3 +4 = 2P


  100 01001000100000

  111 1___1111______ = 1L +3 -4 = 0L ★


  010 01001000100000

  _11 1___1111______ = 1L +1 -4 = -2L


 なので、100になる。...、むむっ、分かりました!


 次に 0x00 が続く場合、マージンビットによって、


  nL --> n+1P (000), n-1L (100), n-3L (010)


  nP --> n-1L (000), n+1P (100), n+3P (010)


 と変化する。ここから、


  +3L --> 0L (010)

  -3P --> 0P (010)

  -3L --> -2P (000)

  +3P --> +2L (000)


  +2L --> +1L (100) or -1L (010)

  -2P --> -1P (100) or +1P (010)

  -2L --> -1P (000)

  +2P --> -1P (000)


  +1L --> 0L (100)

  -1P --> 0P (100)

  -1L --> 0P (000)

  +1P --> 0L (000)


   0L --> +1P (000) or -1L (100)

   0P --> -1L (000) or +1P (100)


 という状態遷移が導ける。つまり、0x00 が続くとカウンタは減少し続けて、最後は0と±1とをループする。


 *


 だったら、0L のとき000を選んで +1P になり、また000を選ぶと 0L に戻るので、マージンビットは000だけで良さそうだけど。


  0L --> +1P --> 0L --> +1P --> 0L ...


 実データでは、0L のときは100を選んで -1L に、次は000を選んで +0P に。それから100を選んで +1P、000を選んで 0L に戻るという遷移をしています。


  0L --> -1L --> 0P --> +1P --> 0L ...


 マージンビットは(カウンタの絶対値が同じ場合)000以外を優先するのね。


 *


 実は、CD-ROM規格にはマージンビットの選択ルールの解説があって、


  > If two combinations give the same, lowest DSV,

  > a combination with a transition shall be chosen.


 ですって。ちゃんと明記されていた(DSV はカウンタのことです)。


 *


 同期信号は 0L 開始と仮定しましたが、0x00 のマージンビットの状況から逆算すると -4L だったようです。リードインの終わりで -4L になっているのでしょうか。


 開始が -4L の場合、


  100000000001000000000010 000 01001000100000

  11111111111___________11 111 1___1111______ = -4L +2 +3 -4 = -3L


  100000000001000000000010 010 01001000100000

  11111111111___________11 1__ _111____111111 = -4L +2 -1 +4 = +1P ★


 となり、正しく010が選択されることになります。その後は(+1P ですから)000と100が交互に選ばれる。


 *


 ピットとランドをカウントした図を作ってみました。


 横軸は時間で 1〜588 です。単位は[T]です。縦軸がカウンタの値です。カウントはピットで+1、ランドで−1です。

挿絵(By みてみん)


 青色(1〜24)は同期信号で、緑色(28〜43)はサブコード、赤色は音声データ、紫色(?)は訂正符号です。丸印は各データの終わりです。


 音声データの前半は、0L --> -1L --> 0P --> +1P --> 0L と遷移していますね。

 後半は訂正符号の影響で -1P からの開始になり、0xFF と 0x00 の間には100と001は選べないので、000と010とを比べて010が選ばれます。その後は000、100、100と選ばれて、


  -1P --> +2P --> +1L --> 0L --> -1L


 となり、その後は前半と同じパターンになる。ナルホド。


 フレームの最後 T=588 では -4L になります。フレームの開始と同じになるのは偶然でしょうけど。いい感じ。


 *


 さて、0x00 以外のサブコードの場合も調べましょう。


  S0 : 00100000000001 = +8P

  S1 : 00000000010010 = -8L

  00 : 01001000100000 = +4P

  40 : 01001000100100 = -2L


 サブコード S0 では +8P、S1 では -8L とカウンタが大きく変動します。0x40 は -2L と小さいです。


 いずれにしても同期信号の後、サブコードによって4つに分岐して、音楽データのマージンビットによってカウンタが0に近づいて、どこかで合流するのでしょう。


 図にしましょう。横軸は時間で 1〜95 までです。縦軸はカウンタの値です。

挿絵(By みてみん)


 サブコードの終わり(T=41)で S0 は +5L、0x40 は +3P、0x00 は +1P です。それと S1 は -9L です。S0, 0x40, 0x00 は値が近いですが、S0 の後には000か001しか選択できないので、S0 の合流はしばらく後です。


 まず、T=59 から 0x00 と 0x40 が合流します。そのときのマージンビットは100(-1L)と010(-3L)です。T=75 では 0L-1L = -1L, +2L-3L = -1L と同じになります。

 

 それから、T=93 から S1 が合流。S0 が合流するのは T=347 でした(図にはありませんが)。


 *


 最後までの図、欲しい?


 *


 カウンタの最大と最小を調べてみます。


 無音状態だと最大は 11 で、最小は -14 です。先の図で分かりますね。


 エピ17で乱数生成したデータなら ±55 程でしたが、本当の音楽が入っている部分ではどうでしょうか?

挿絵(By みてみん)

挿絵(By みてみん)


 このデータでは -21〜21 でした。他のデータだと、大きいと ±30 程まで振れることがある感じ。


 音楽データを恣意的に選んでカウンタを目一杯アップすると +80 くらいは上昇して、訂正符号のマージンビットではそれを吸収できそうにないことから、カウンタのオーバーフローは可能そうですね。データ作成してCD-Rを焼いてみて観察したら良いかな。今後の課題ですね。


 *


 マージンビットにはついてはこんな感じで。


 ***


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


 ***

2025.6.3 推敲。

2025.6.4 微推敲。



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

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

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

↑ページトップへ