DSD エンコーダーの品質改善、新しいコンテナ .dst と DST 圧縮エンコーダー
- siseong3
- 17 時間前
- 読了時間: 8分
DSD をつくる部分を一から作り直しました
Pine Player Pro のフォーマット変換機能は、これまで DSD 変換を従来の Pine Player エンコーダーに任せてきました。問題なく動いてはいましたが、測定してみると惜しい点が残っていました。とくに DSD128・DSD256 のように倍率を上げても期待したほど静かにならない、オーディオとしては筋の通らない状態がありました。
今回のバージョンでは、PCM を DSD にする経路と DSD を PCM に戻す経路の両方を新しく実装し、これまでなかった DST 圧縮エンコーダー と新しいコンテナ .dst を追加しました。何がどう変わったのかを、測定値とあわせて整理します。

ひと目でわかる比較
項目 | 従来の Pine Player エンコーダー | 新しい実装 |
DSD64 SNR(1kHz −6dBFS) | 100.0 dB | 111.7 dB |
DSD64 THD | −114.2 dB | −134.7 dB |
無音区間のノイズ(DSD64) | −108 dBFS | −137 dBFS |
帯域内ノイズ(DSD128) | −136.3 dBFS | −180.8 dBFS |
帯域内ノイズ(DSD256) | −156.8 dBFS | −191.9 dBFS |
PCM → DSD 変換時間(30 秒の曲) | 10.62 秒 | 3.25 秒 |
DST 圧縮の作成 | 不可(読み取りのみ) | 49.0%・2.04 倍(実時間の 3.6 倍) |
測定条件と方法は本文の各節に記しています。いずれも同じ条件でデコードし、FFT で比較した値です。
1. PCM → DSD:新しいシグマデルタ変調器
DSD は 1 ビットの信号です。16 ビットや 24 ビットの PCM を 1 ビットに変えるには、量子化誤差を可聴帯域の外へ押し出すノイズシェーピングが必要で、この設計が結果の音質を左右します。
新しい変調器は誤差フィードバック構造で作りました。ノイズ伝達関数の零点は可聴帯域の内側にチェビシェフ配置で散らして、その帯域のノイズを最大限に抑えています。極はバターワース配置で帯域外の最大利得が 1.5 になるよう合わせ、1 ビット変調器が発散しない余裕を持たせました。次数は 5・6・7 次を用意し、状態が限界を超えた場合はその区間だけ引き戻す保護も入れています。
測定(DSD64、1kHz −6dBFS、同じ方法でデコードして FFT)
従来の Pine Player エンコーダー — SNR 100.0dB、THD −114.2dB
新しい変調器(6 次) — SNR 111.7dB、THD −134.7dB
無音区間のノイズは −108dBFS から −137dBFS へ下がり、出力レベルは従来と同じです。実際の音楽では 31Hz〜16kHz の応答偏差が ±0.06dB でした。
2. 倍率を上げれば、本当に静かになります
ノイズ伝達関数の零点は「可聴帯域が正規化周波数でどこまでか」に合わせて置く必要があります。最初の実装は DSD64 を基準に作った係数表をすべての倍率に使っていたため、DSD128・DSD256 では零点が 40〜80kHz へ押し出され、可聴帯域内のノイズがほとんど減っていませんでした。倍率を上げた意味がない状態だったのです。
倍率ごとに 5・6・7 次の係数表を新しく設計しました。帯域内ノイズ(無音入力) は次のように変わりました。
DSD64 — −140.1dBFS(変化なし)
DSD128 — −139.2 → −180.8dBFS(41.6dB 改善)
DSD256 — −141.5 → −191.9dBFS(50.4dB 改善)
1kHz 正弦波の SNR も、DSD128 が 126.1 → 130.8dB、DSD256 が 127.9 → 130.8dB へ上がりました。倍率を上げた分だけ、実際に静かになります。
3. 44.1~48kHz 音源の高域と、三つの精度の問題
従来のエンコーダーと並べて測定する過程で、さらに三点を直しました。
44.1~48kHz 音源の高域が削られていた問題。 補間フィルターが 1 位相あたり 32 タップで遷移帯域が広すぎたため、18〜20kHz が 1.4〜4.3dB 削られていました。フィルター長を遷移帯域の幅から決めるように変え、補間を二段に分けました。一段目は音源を 8 倍までシャープなフィルター(1 位相 140 タップ、カイザー β=10)で上げ、二段目は信号が標本化周波数の 3% 以下にしか残っていない状態なので軽い曲線補間で埋めます。その結果、44.1~48kHz のスイープで 20kHz まで従来のエンコーダーと 0.00dB で一致します(以前は 19〜20kHz が −4.3dB)。
16 ビット Normalize の二重量子化。 一度 16 ビットで書き出したものを読み直し、レベルを合わせながらもう一度量子化していました。中間結果を 32 ビット浮動小数で保持し、最後に一度だけ量子化するようにして、16 ビット出力には TPDF ディザを入れます。静かな音源で SNR が 58.1dB から 93.3dB へ上がりました。
フィルター遅延の未補正。 群遅延の分だけ先読みし、音源が終わったあとに残りを押し出すようにして、音源に対して 16 標本あった遅延が 0 標本になりました。長さも正確に一致します。
速度も良くなりました。30 秒の曲の PCM → DSD 変換が 3.25 秒で、従来のエンコーダー(10.62 秒)の 3.3 倍です。画面の DSD Gain(−10〜+10dB)と Normalize の設定も、PCM 音源できちんと反映されるようになりました(以前は無視されていました)。
4. DSD → PCM の復調も自社実装に
逆方向も新しく作りました。バイトテーブルを使った 256 タップ FIR で 8 分の 1 にし、必要に応じて 63 タップのハーフバンドフィルターを最大 4 段追加します。間引きが大きいほどフィルターを長く取り、超高域のノイズが折り返して入らないようにしました。16 ビット出力には TPDF ディザを入れています。
44.1k・48k・96k・192k のいずれでも SNR は約 100dB、THD は −114dB で従来と同水準、20Hz〜30kHz の応答差は 0.00dB、時間軸のずれも 1 標本以内です。DSF・DFF・DST の三つの入力から得られる結果は標本単位で完全に一致します。速度は 30 秒の DSD64 で実時間の 21〜36 倍です。
5. DST 圧縮エンコーダー — DSD ファイルを半分の大きさに
DST(Direct Stream Transfer)は SACD が使う DSD のロスレス圧縮です。これまで Pine Player Pro は、すでに DST で圧縮された素材(SACD ISO)を読むことしかできませんでした。圧縮を作るエンコーダーがなかったためです。
今回、その DST エンコーダーを新しく書き上げました。算術符号化器、フレーム構文、フレームとチャンネルごとに計算し直す予測フィルター(自己相関 → レビンソン・ダービン → 9 ビット量子化、次数 128)、予測誤差の確率表(64 要素)まで規格どおりに実装し、圧縮の利得が得られない区間は規格の「圧縮しない」フレームに戻します。
実測(29.7 秒の SACD 音源、5 スレッド) — 20,971,520 バイト → 10,269,578 バイト。49.0%、約 2.04 倍の圧縮 で、8.3 秒で完了します(実時間の 3.6 倍)。ロスレスなので展開すれば元とバイト単位で完全に一致し、独立した外部の DST デコーダーでも正常に再生できます。
変換の出力形式に DFF(DFF with DST compression) を追加しました。DST は SACD 規格上 DSD64 のみが定義されているため、この形式を選ぶと倍率は DSD64 に固定されます。圧縮の進行状況は既存のプログレスバーに続けて表示され、同時変換(最大 5 件)ではコア数をファイル数で分け、処理が互いを押しのけないようにしています。
6. 新しいコンテナ .dst — 圧縮した DSD にタグとアルバムアートを
DFF は古いコンテナで、タグを収める標準の場所がありません。逆に DSF はタグをきちんと扱えますが、圧縮に対応していません。そこで、両方の良いところを合わせたコンテナを新しく用意しました。
.dst は音声データとして DFF の DST 圧縮をそのまま使い、ファイルの末尾に ID3v2.3 タグを付けて曲情報とアルバムアートを収めます。DFF を読むプログラムは末尾のタグのバイトを単に読み飛ばすので、互換性の問題もありません。
変換の出力形式 DST(DSF with DST compression) で作成でき、元ファイルの曲情報とアルバムアートをそのまま引き継ぎます。再生は通常の PCM 経路と DoP ネイティブ経路の両方に対応し、メタ情報エディターでタグの読み書きができます。
検証では、同じ音の .dst と .dff を比べて展開した DSD 5,644,930 バイトがすべて一致すること、アルバムアートの PNG・JPEG が往復後もバイト単位で同じこと、途中で切れたファイルやタグサイズを偽ったファイルでもアプリが落ちないことを確認しています。
7. そのほかの変更
DSD 同士の変換はコンテナだけを入れ替えます。 同じ倍率の DSD を別の DSD コンテナへ移すとき、以前は PCM を経由する再変換を行っていました。いまは音声データをそのまま移し替えます。DSF ↔ DFF はもちろん、DST で圧縮された DFF から DSF へ移す場合も、展開しながら直接書き込みます(一時ファイルなし)。ロスレスで、はるかに高速です。
DST で圧縮された .dff も変換できます。 以前は非圧縮の DSD しか読めなかったため、DST の .dff は変換に失敗していました。いまは展開して処理し、曲情報と出力ファイル名は元ファイルのものを引き継ぎます。
DoP ネイティブ再生の範囲が広がりました。 SACD ISO のトラックと DST で圧縮された .dff を、DoP でそのまま再生します。展開したストリームをファイルのように渡す入力経路を用意して解決しました。シークや次の曲への進行も正常に動作します。
形式名をわかりやすくしました。 DFF(DST) は DFF(DFF with DST compression) に、DST(DSD) は DST(DSF with DST compression) に変更しました。以前の名前が設定に保存されていても、自動的に新しい名前として読み込みます。
まとめ
要点は三つです。DSD エンコーダーを新しく作り、DSD64 で SNR を 11.7dB、DSD128・DSD256 で帯域内ノイズを 41〜50dB 改善しました。DST 圧縮エンコーダーを加えて、DSD ファイルをロスレスで半分ほどの大きさにできるようになりました。そして圧縮した DSD にもタグとアルバムアートを収められる新しいコンテナ .dst を追加しました。
本文の測定値はいずれも同じ条件でデコードし、FFT で比較した値です。DSD 音源を自分で作り、保管されている方のお役に立てばうれしく思います。



コメント