FPGA 版 FM 音源 (38) -- YMF297 (OPN3/OPL3) 測定 (3)

古い MUSE-NTSC コンバータの基板から外してきた S/PDIF トランスミッタ (SONY CXD1211P) をつないで 48 kHz S/PDIF にデータを流せるようになりました。
OPNA モードでは LRCK のデューティーが 50 % ぴったりにはならないのですが、特に問題はなく、左右チャンネルとも「ビット・パーフェクト」なデータをキャプチャ可能になりました。
ざっと見たところでは、EG 回路の構成は OPM (YM2151) と同様のようで、

  • EG アキュムレータのビット幅は 10 ビット
  • アタック計算のフィードバックのシフト量は 4 ビット
  • EG 出力の更新が 3 サンプルごと

になっています。
ただし、対数-リニア変換部に多少の違いがあるようで、キャプチャされるデータ自体は全く同じにはなりません。
2オペレータ直列FMで発生させた方形波を「ローレート」のエンベロープで変化させた波形をキャプチャした結果を下に示します。

アタックの最後の部分の振幅変化が直線になる特徴が見えています。
オペレータひとつ当たりのキャリア出力の最大値は ±4084 で、OPM の場合の ±8168 の半分になっています。
だだし、オペレータ出力自体は「0.5」の振幅に相当する下位 1 ビット分余計に出力されていて、最後に各キャリア、各チャンネルの出力データをアキュムレートして最終結果を得る段階で 16 ビット精度に丸めているようです。
ディケイで減衰して、キャリア出力が最後に振幅がゼロになる寸前の様子を下に示します。

最終的に振幅がゼロになる直前では、ピーク・ツー・ピーク (p-p) が「1」(振幅としては 0.5) になっており、その前では p-p 値が「2」(振幅としては 1) 、さらに、その前では p-p 値が「3」(振幅としては 1.5)... となっていることが分かります。
参考のために OPM (YM2151) の場合を示すと、

となっており、正負対称で、p-p 値はすべて偶数、振幅はすべて整数になっています。
最後に、OPNA モードの場合には LRCK のデューティーが 50 % にならないことが、DAC として BU9480F を使う場合には歪み率の悪化という形で現れることを示します。
まず、S/PDIF 経由で「ビット・パーフェクト」なデータとしてキャプチャした 750 Hz 正弦波 (1 周期 64 サンプル) を WaveSpectra で観測した結果を下に示します。

歪み率としては、約 0.05 % となっています。
次に、DAC として BU9480F を使い、アナログ信号となったものを PC のオーディオ入力でキャプチャしたものの結果を下に示します。

歪み率は約 0.28 % となっています。
ディジタル・データ → DAC → アナログ電圧 → ADC → ディジタル・データ
というルートによる劣化があるにせよ、理想的な場合の結果に比べて、かなり悪化しています。
細かい条件は違いますが、STM8S に BU9480F をつないで 1 kHz の正弦波を再生させた場合 (→こちらの記事) の結果は歪み率約 0.04 % になっています。
これを BU9480F の「実力」と仮定すると、やはり 0.28 % の歪み率は、かなり悪い状態といえます。