ソフト S/PDIF トランスミッタ (5)

前回の BMC 変調までの話で S/PDIF の光送信モジュールへ出力する「信号波形」に対する「ビットマップ」が準備できたことになります。
あとは、メモリに展開されたこのビットマップを実際の連続したシリアル・ビット列に変換するのは SPI/I2S モジュールおよび DMA モジュールの「ハードウェア」の仕事です。
SPI/I2S モジュールは 16 ビット転送モードで使うことにしましたから、RAM メモリ内の S/PDIF 出力バッファは「符号なし 16 ビット整数型」(uint16_t) の配列で実現します。
オーディオ・データの発生/供給側のソフトウェアは、この uint16_t の配列要素に (BMC 変調ずみの) ビットマップ・データを書き込んで「消費」側のハードウェアに渡します。
このソフトウェア側の負担を減らすために、作成されるビットマップ・データの「固定部分」を多くし、「可変部分」を少なくします。
チャネル・ステータスなどはブロック単位で定義されていますから、動作中はチャネル・ステータスに変更がないものとすれば、出力バッファを 1 ブロック分 (あるいは整数ブロック分) 用意しておけば、プリアンブル部分も含めて初期化後は値をいじる必要がなくなります。 (パリティ・ビット P を除く)
ただし、1 フレーム = 128 ビット = 8 ハーフワード (16 ビット・ワード) ですから、1 ブロック分のバッファ・サイズは
8 [halfword] × 192 = 16 [byte] × 192 = 3072 [byte]
となり、3 K バイトを消費することになります。
ビットマップの「書き換え」が増えることを覚悟すれば、バッファの量は減らせます。
プリアンブル 'W' についてはすべてのサブフレームで同一なので書き換えの必要はありません。
プリアンブル 'B' と 'M' については、フレーム 0 で 'B' に書き換え、フレーム 1 以降で 'M' に戻す必要があります。
民生用の従来版のチャネル・ステータスでは先頭 32 フレーム分だけが定義済みで、残りのフレームは未定義で参照されることはないので、先頭 32 フレーム分のデータが繰り返されても問題はなく、結局、出力バッファ・サイズは 32 フレーム分 (512 バイト) まで縮小しても、プリアンブル 'B' と 'M' の書き換えだけで処理することができます。
Nucleo F401RE 用のプログラムでは RAM 容量を気にする必要はないので、1 ブロック分を確保してあります。
出力ビットマップは 16 ビット単位に区切って配列に書き込むので、入力データとしては 8 ビット (1 バイト) 単位に区切って扱うことになります。
サブフレームの定義通りに 16 ビット・オーディオ・データを区切ると、
(4 bit) : (8 bit) : (4 bit)
という区切りになり、BMC への変換に 3 回テーブルを参照する必要が生じてしまいます。
そこで、オーディオ・データのバイト境界と一致させるために、区切りを 4 ビットずらして、前のサブフレームの VUCP ビットを取り込む一方、現在のサブフレームの VCUP ビットは次のサブフレームへ追いやります。
その様子を下の図に示します。

つまり、変調前の入力データで見ると

  • 直前のサブフレームの VUCP ビットと現サブフレームのプリアンブル
  • AUX ビットとオーディオ・データの '0' パディング 4 ビット
  • 16 ビット・オーディオ・データの下位 8 ビット
  • 16 ビット・オーディオ・データの上位 8 ビット

の 4 バイトで構成されることになります。
BMC 変調後のビットマップでは 4 ハーフワード (16 ビット・ワード) になります。
VUCP ビットは前サブフレームのものということもあり値をいじるのは面倒なので、このパリティ・ビットは本来のパリティ調整には使わず、固定パターンとします。
記録再生系ではないので常に V=0、またユーザ・ビットは使わないので常に U=0 です。
チャネル・ステータス C=0 なら P=0、C=1 なら P=1 として、この「断片」で偶数パリティが成立するようにします。
したがって、プリアンブル部分と合わせて「固定データ」となり、出力バッファの初期化以後は値を変更する必要はありません。
本来のパリティを固定したので、オーディオ・データに対するパリティ補正の代替として、AUX ビットの先頭ビット、言い換えれば 24 ビット・オーディオ・データの最下位 24 ビット目の位置のビットを使います。
このバイトの他のビットは常に '0' なので、結局、入力データ・ビット列

  • 00000000
  • 10000000

のふたつの場合 (オーディオ・データ自体のパリティの偶/奇) に対応する BMC 変調ビットマップしか出力されません。
16 ビット・オーディオ・データについては、上位バイト、下位バイト、それぞれについて BMC 変換テーブルを参照し得られた 16 ビット (ハーフワード) データを配列に書き込むことになります。