「ディザリング」に関するメモ
ディザリングにまつわる誤解
- △:ディザリングとは、デジタル臭さをとるためにノイズを加えること
- ×:ディザリングとは、アナログ感を出すためにノイズを加えること
「アナログ機器固有のノイズを加えることで、アナログ感を演出する機能」という説明は、広く流布している誤解。
正しくは、数学的に有用性が説明できるもの。
実験
準備物
- ディザリング機能のあるDAW(今回はSonar8.53)
- トーン・ジェネレータ MeldaProduction – Moscillator (フリーVST)
- スペクトラム・アナライザ Voxengo – SPAN (フリーVST)
主な手順
- ファイル・バウンス時に16bitで出力されるよう設定する。
Options → Global... より、”Audio Data”タブ下、”Render Bit Depth”を16に設定。(下図)
(Sonar以外のDAWを使用している場合は、適宜読み替え) - MOscillatorで1kHzのトーンを生成。
- 生成されたトーンを新規トラックにバウンス→16bitのトーンが生成される。
- バウンス時のDithering種類を順次変更し(Noneを含む)、結果をスペアナで測定。
- トラックのゲインをあげて、音を比較試聴。
結果
はじめに、16bitが正攻法で再現できる最小レベルは-96dBFS…であることを確認。
Moscillatorで、1000kHz、-97dBFSのトーンを作成。
次に、Dithering = None で16bitへバウンス
下位ビットは切り捨てられてしまうので、何もなくなる。
続いて、16ビットで再現可能な最小値、-96dBFSの信号を生成。
Dithering = Noneで16bitへバウンス
ぎゃーーーーーーっっ!!
(トラックのゲインを上げると、このノイズは聞き取り可能)
Dithering = Rectangularで16bitへバウンス
均等にノイズが付加される代わりに、Dithering無しのときほど倍音が生じない。
(3kHzに立った倍音は、トラックのゲインを上げると聞き取り可能)
Dithering = Triangularで16bitへバウンス
Dithering = Rectangularのときのような倍音が立たない。(その代わりCPU負荷は若干高い)
Dithering = Pow-r1で16bitへバウンス
Triangular と比べて、ノイズが高域に集中している。代わりに、他の帯域のノイズ・フロアは総じて低い。
Dithering = Pow-r2で16bitへバウンス
7kHzあたりから徐々にノイズ・フロアが上がる。代わりに、フロアのピーク値、高域以外のノイズ・フロアはPow-r1より低い。
Dithering = Pow-r3で16bitへバウンス
1kHz付近までノイズ・フロアは、Pow-r2 と同様。高域のノイズ・フロアが高い代わりに、3.5kHz付近にディップがある。→Voなど肉声の明瞭さを司る周波数帯が、Dither ノイズに埋もれにくい
Sonarで選択可能な全Dither種、一挙比較
おまけ
3.5kHz、-130dBFSのトーンをDither = Rectangularで16bitにバウンス
Dither ノイズに埋もれた…
3.5kHz、-130dBFSのトーンをDither = Pow-r3で16bitにバウンス
トラックのゲインを上げると聞き取り可能。
→ ダイナミック・レンジが96dBしかないはずのフォーマットで、
-130dBFSのトーンが再現可能!!
まとめ
ビット数を落とす際、
Dither無しでは原音に相関のある倍音が発生してしまうが、Ditheringを行うことでこれを防げる。
※レベルの低い(ホワイトっぽい)ノイズは、信号レベルの高い倍音より自然に聞こえる。また倍音が生じないため原音のキャラクターを損なわない。
ディザリングを使うべき場面
Mastering Audio (Bob Katz著)より…
- ビットレートを落とすときは必ず使用。
- 後に2MIXの一部として使用する素材など、複数回Ditheringが行われると判っている場合Pow-r系は避ける
(後にマスターに同じDitherを使用すると、ノイズが特定帯域に累積されるため)
メモ
- UV22、UV22HRは、Pow-r以上に高域にDither ノイズを集中させる、信号パターン
(一見ノイズだが、ランダムではなく循環する「パターン」になっている。)
Apogee社が特許を持っており、他社にライセンス提供している。 - NativeのDAWは大抵バスが32bit Floatなので、16/24bitに出力する際はDithering原則として必要。
(余談:信号バスのビット数は、32/64bit OS、32/64bitプラグインなどとは無関係)
ディザリングが効果的である理由の、大雑把な理屈
一定間隔で数値をサンプリングする。(採取するのは、信号レベル/気温/気圧/株価、その他なんでも)
ここでは、100回の測定結果が常に「107」だったと想定。
01: 107
02: 107
03: 107
04: 107
:
98: 107
99: 107
↓
さて、3桁の表示ではデータ量が多過ぎるので、1の位を切り落とすことにしました、と。
01: 100
02: 100
03: 100
04: 100
:
98: 100
99: 100
タダの切捨てでは、一律に「100」となり107 という数値は悠久の彼方へ…
ある意味、データが捏造される(≒Dithering無しでビット数を落とした場合に立つ倍音)
↓
それなら、1の位を切り捨てる前に0~9のランダムな数字を足してみますか。
「0~9」は、切り捨てられる値が取り得る範囲。
01: 107 + 0 = 107 100
02: 107 + 1 = 108 100
03: 107 + 9 = 116 切捨て110
04: 107 + 8 = 115 → 110
:
98: 107 + 7 = 114 110
99: 107 + 1 = 108 100
100か110を行ったり来たり。
しかし、切り捨て後100回の平均をとると、おおよそ「107」になる!
<?php $sum = 0; for ($i=0; $i<100; $i++) { $val = 107 + rand(0, 9); $sum += floor($val / 10) * 10; } echo "Average: " . ($sum / 100);
- Mastering Audio - Bob Katz著 (書籍)
- Dither Explained - Nika Aldrich著 (PDF)