FPGA 版 FM 音源 (40) -- YMF297 (OPN3/OPL3) 測定 (5)

ほぼ 1 年ぶりに、OPL3 モードに設定した YMF297 の出力を S/PDIF 経由でキャプチャしてみました。
それは、下の記事に示すように、フィードバック量が多い場合に出力波形が振動的になる現象を追求するためです。

FM音源プログラム(20) -- オペレータ(13)

その結果、上の記事で示た対策の FIR LPF をかける方法は実際にも正しいと思われることが分かりました。
プログラムで FIR LPF をかけて発生させた出力が、実際のチップの出力のキャプチャ結果とディジタル・データとして完全に一致しました。
フィードバック・パラメタ FB = 4 で LPF あり/なしの結果を図で示すと下のようになります。

青色の線で示したのが LPF なしのプログラムによるシミュレーション結果で、青く塗りつぶされているように見えるのは、ナイキスト周波数 (fs/2) での「振動」によるものです。
赤色の線で示したのが実チップの出力をキャプチャしたものです。 当然、振動的なふるまいはしていません。
WS = 0 の正弦波出力波形では、FB = 3 までは LPF なしでも振動は生じません。
フィードバック経路に LPF を組み込んだオペレータの簡略化したブロック・ダイアグラムを下に示します。

明示してありませんが、位相変調入力から出力まで「筒抜け」ではなく、サンプリング・クロックに同期して出力が発生するものとします。
フィードバック経路の FIR LPF は、伝達関数 H(z)
H(z) = 1 + z-1
となる、ナイキスト周波数 fs/2 にゼロ点を持つ最も簡単なディジタル・フィルタで、ナイキスト周波数での振動を除去します。
この伝達関数では DC ゲインが 2 となってしまいますが、この後、FB パラメタによるビット・シフトを施されてフィードバックされるので、LPF の段階でスケーリングする必要はありません。
サイン・マグニチュードで表現されたデータを「普通」のリニアな 2 進数へ変換する方式として 2 の補数ではなく、1 の補数でなければ実チップのキャプチャ結果とシミュレーション結果が一致しないことを確かめてあります。 後で例を示します。
次にキャプチャ結果とシミュレーション結果の比較の図を示していきます。
キャプチャ・データの「切り出し」はラフに行なっており、シミュレーション・プログラムの方でキャプチャ・データに合わせるようなタイミングで計算結果を出力しています。
まず、下の図はフィードバック・パラメタ FB = 0 の場合で、この場合はフィードバック・バスの寄与が完全にゼロで、正弦波 ROM を読み出した値そのものになっています。

青色の線がシミュレーション結果で、赤色の線がキャプチャ結果です。
フィードバック・パスの寄与がゼロなので、フィードバックの処理方法に依存せず、当然シミュレーション結果とキャプチャ結果は一致して、グラフ上では赤色の線しか見えません。
次は、FB = 3 の場合です。

FB = 3 までは、LPF なしでも振動的にはなりません。
下は FB = 4 の場合です。 LPF なしでは振動的になる場合です。

下は FB = 5 の場合です。

LPF があっても振動的になっていますが、シミュレーション結果とキャプチャ結果は一致して、グラフ上では赤色の線しか見えません。
下は FB = 7 の場合です。

もはや、ほとんど「ノイズ」ですが、シミュレーション結果とキャプチャ結果は一致して、グラフ上では赤色の線しか見えません。 単にグラフが重なって見えるだけでなく、「ディジタル・データ」としても完全に一致しています。
FB = 7 で、サイン・マグニチュードからリニアな 2 進数への変換を 1 の補数ではなく、2 の補数にした場合の結果を下に示します。

オペレータ出力値としては、1 の補数方式と 2 の補数方式とでは負数の場合に 1 違うだけですが、フィードバックのパスでは影響が大きくなります。
上のグラフで赤い線の隙間から青い線が「透けて」見えるようになり、キャプチャ結果とシミュレーション結果とは大きく違っていることが分かります。
そういったわけで、新版の FM 音源プログラムではフィードバック・パスに FIR LPF を実装して実チップに対する再現精度を高めたいと思います。