PSoC5LP Prototyping Kit (40) --- SPDIF 24 ビット・キャプチャと S/N 比の測定

私の手持ちの USB オーディオ・インターフェース (のひとつ) は、アナログ・ソースを 24 ビットで取り込めることをうたっていますが、マニュアルでは SPDIF 入力からも 24 ビットでチャプチャできるかどうかについては言及されていません。
中を開けて SPDIF トランシーバ・チップを確認し、スペックを調べると 24 ビット対応でした。
試してみると、24 ビット・データが SPDIF 経由で 1 ビットの劣化もなくキャプチャできることが分かりました。
PSoC5LP のプログラム中で 24 ビット幅のテーブルから読み出して作成した 997 Hz のサイン波を SPDIF 経由でキャプチャし WaveSpectra で観測した結果を下に示します。

設定は、

  • 48 kHz サンプリング
  • 997 Hz (素数) のサイン波
  • 128 K (131072) ポイント FFT
  • Blackman-Harris 7 Term ウィンドウ

としています。
S/N 比の測定結果は 141.92 dB となっており、フルスケール正弦波に対する 24 ビット幅での理論値

6.02 × 24 + 1.76 = 146.24 [dB]

に比べて、微妙な差があります。
(2016/01/16 追記) サイン波テーブル生成プログラムに、量子化前の倍精度実数で表現されているサイン関数の値を「信号」とし、24 ビット量子化誤差を「ノイズ」として両者の分散を求める処理を追加し、テーブルの数値自体の S/N 比を計算すると 146.20 dB となりました。 これは、ほぼ理論値通りと言えます。 (追記終わり)
WaveSpectra に付属のヘルプの「歪率の測定」の項目を見ると、窓関数や、信号周波数、FFT ポイント数などが S/N 測定値に影響することが書かれています。
実際、窓関数を変更して測定してみると、数 dB の変化があります。
Hanning / Blackman / Blackman-Harris 7 Term の 3 つの窓関数ではサイドローブの影響はなく、数 dB の違いです。
一方、Hamming / Blackman-Harris / Flat top / 矩形 の 4 つの窓関数ではサイドローブの影響により、極めて大きな誤差が出ます。
WaveGene との組み合わせでは「FFT に最適化」の設定で測定誤差が減るようです。
FFT 窓の中にきっちり整数個のサイン波が入るような信号周波数を選び、矩形窓 (窓関数なし) を使用すると精度が良くなるようです。
PSoC5LP のプログラムで、

  • テーブル・エントリ数は 32 K (32768)
  • テーブル中に 683 波 (素数)
  • 信号周波数 = 48 [kHz] × 683 / 32768 = 1000.488 [Hz]

となるようにして、矩形窓で観測した結果を下に示します。

S/N 比の測定結果は 146.51 dB で、997 Hz の場合よりも誤差が少なくなりました。