目で見て楽しむPCM-DSD変換

リファレンスで使っている1kHzサイン波を生成しなおしたので、PCM-DSD変換の比較をリファインしてみることにしました。

まずは、作り直したサイン波から。16/88.2, 24/88.2, 32bitFloat/88.2, 64bitFloat(double)/88.2のPCMです。64bit精度でサイン波を生成した後、各フォーマットにあわせて適正なレベルの一様乱数をディザとして加えて丸めてあります。
なお、以降に出てくるグラフのFFTパラメータは、FFTは7項ブラックマンハリス窓、サンプルサイズ32768*Fs/44100、サイン波のレベルは特記しない限り-6dBFS=-6dB SACDで、1kHzでノーマライズしてあります。

※1 24bitIntと32bitFloatの量子化誤差は同一であるとよく言われますが、厳密に言えば32bitFloatの方が少ないです。これは、音声処理に使われる値域が[-8388608~8388607]と[-1.0~1.0]で異なることにも関係しますが、最悪ケースであるフルスケールであっても、24bitIntに対して32bitFloatは2通りの値を取り得ます。Intがレベルに対して密度が一定なのに対し、Floatの場合はレベルが小さければ小さいほど密度が濃くなるので、実際には32bitFloatの量子化誤差は26-27bitIntと同等と言えるでしょう。

※2 理想S/N比[6.02*bit+1.76dB]に対してFFTのノイズフロアが随分低く出ますが、これは、FFTの仕組みに依るものです。あるFsのデータを入力した際、FFTはFs/サンプルサイズの区間のレベル量を出力しますが、サンプルサイズを大きくすればするほど、その区間は小さくなり、レベル量も同様に小さくなります。本条件ではサンプリングレートに依らず、-40dBほど低く出ます。
参考:


さて、PCM-DSD変換はいろんなソフトウェアで実装されていますが、現在入手できるソフトウェアでオフライン処理できるものを集めてみました。前はノイズシェーパーの係数だけ引っ張ってきてやったのもありますが、今回は各ソフトウェアを使ってDSDを変換しました。残るはPyramix、SADiE、SONOMAとなりますが、ちょっとこれはハードルが高すぎますね…。
ソフトウェアによって内部処理精度に32bitFloatと64bitFloat(double)の違いがあるので、それぞれざっくりグループ分けしました。なお、比較用に適当なビット深度のPCMと自前のPCM-DSD_Converterのは毎回加えています。

32bitFloat精度グループ1

・SONY DSD Direct
KORG AudioGate 4
Wave to Dsdiff Converter


DSD DirectとAudioGate 4が完全に一致しているのが面白いです。多分これはMatlab Delta Sigma Toolboxで5次チェビシェフ2項フィルタを用いた際の割り出す最適値だと思います。
Wave to Dsdiff Converterの大本はkoon3876氏のプログラムによるもので、これは色々パラメータがありますが、基本的に7次チェビシェフ2項フィルタを用いたものです。

32bitFloat精度グループ2

JRMC25
SoX-DSD(Clans-8)
XLD


JRMC25はちょっと不明なんですが、おそらく7次チェビシェフ2項フィルタに何かしらの発振防止リミッタを用いたものだと思います。
SoX-DSDはSoXをフォークしてMans Rullgard氏がリリースしたバージョンに実装されています。この係数はAudirvana Plus、Daphileなどに採用されています。これはオプションが色々あるのですが、Clans-8(=恐らく8次チェビシェフ2項フィルタ)のものです。
XLDは32bitFloat精度グループの中でもっともすぐれたものです。8次チェビシェフ2項フィルタによるもので、内部処理精度の関係で下限がありますが、係数だけ流用して64bitFloat(double)精度で動かすと更に良い性能になります。

64bitFloat(double)精度グループ1

Foobar 2000 SACD Decoder Plugin
TASCAM Hi-Res Editor
Weiss Saracon


SACD Decoder Pluginに以前から搭載されているDSD変換機能は元々SACD最初期のツールであるPhilips ProTechに搭載されているものの様です。5次チェビシェフ2項フィルタではありますが、DSD Direct/AudioGate4とは異なります。最近オフライン処理機能が追加されました。
TASCAM Hi-Res Editorは極めて基本的な5次バターワースフィルタに依るものです。
Weiss Saraconは長年高く評価されてきただけあって素晴らしい性能です。色々オプションありますが、これは10次チェビシェフ2項フィルタです。

64bitFloat(double)精度グループ2
SONAR(Cakewalk)
SoX-DSD(SDM-8)
HQPlayer Pro(ASDM7)
PCM-DSD_Converter


色々あったSONARですが、今は名前を変え元々の企業名だったCakewalkという名前で別会社からリリースされています。SONARのDSD対応は、当時代理店だったTASCAMがかなりテコ入れしたようで、特性はTASCAM Hi-Res Editorと全く一緒です(イニシャルリリースのFloat-Int変換バグをそのまま引き継いでます)。
SoX-DSDのオプションをSDM-8にしたものは、8次楕円フィルタかなと思います。HQ Player ProのASDM7は同様に7次楕円フィルタでしょうか。どちらも優秀な特性です。
さて、PCM-DSD_Converterですが、これは8次楕円フィルタです。

色々見比べてみると面白いものです。今度はPCM-DSD_ConverterのDSDサンプリングレートによる違い、DSD64からDSD2048まで見てみましょう。


サンプリングレートによって帯域外ノイズの立ち上がり周波数が異なる設計になっています。これはほぼすべてソフトウェアの設計と同一ですが、本来ノイズ分布はいかようにも設計できるものです。グラフは割愛しますが、自分が知る限りSoX-DSDだけが、サンプリングレートによって立ち上がり周波数をあまり変えず、可聴域内のノイズフロアを下げる傾向となります。
また、サンプリングレートを上げることによって発振可能性も上がってきます。PCM-DSD_Converterは安定性を捨てて性能を取っているため顕著ですが、DSD2048では不安定になり歪みが上がります。

次にレベル(変調率)の違いを見てみます。上記はすべて-6dBFSの1kHzサイン波ですが、-6dBFS、-3dBFS、0dBFSとレベルを変えたものをPCM-DSD_Converterで変換してみます。


1kHzでノーマライズしているため、0dBFSに近づくにつれノイズフロアは下がりますが、歪率が悪化します。これは一般的なΔΣ変調を採用しているDACにも多かれ少なかれ言えることで、-6dBFSから0dBFSにかけては歪率が増加します。前回もラウドネスノーマライゼーションを有効化した方が良いと書きましたが、この理由によるもので、0dBFS付近、ましてやクリップを起こしている音源をDACは正確に出力できません。ラウドネスノーマライゼーション機能を使ってデジタルでレベルを絞るというのはデメリットであるビット落ちに比べてDACの動作適正性において大きなメリットがあります。もっともピークでひり付く音が良いという好みも良く分かります。