header

「ディザリング」に関するメモ

ディザリングにまつわる誤解

  • △:ディザリングとは、デジタル臭さをとるためにノイズを加えること
  • ×:ディザリングとは、アナログ感を出すためにノイズを加えること

「アナログ機器固有のノイズを加えることで、アナログ感を演出する機能」という説明は、広く流布している誤解。
正しくは、数学的に有用性が説明できるもの。

実験

準備物

主な手順

  1. ファイル・バウンス時に16bitで出力されるよう設定する。
    Options → Global... より、”Audio Data”タブ下、”Render Bit Depth”を16に設定。(下図)
    (Sonar以外のDAWを使用している場合は、適宜読み替え)
  2. MOscillatorで1kHzのトーンを生成。
  3. 生成されたトーンを新規トラックにバウンス→16bitのトーンが生成される。
  4. バウンス時のDithering種類を順次変更し(Noneを含む)、結果をスペアナで測定。
  5. トラックのゲインをあげて、音を比較試聴。
Sonar audio bounce設定

結果

はじめに、16bitが正攻法で再現できる最小レベルは-96dBFS…であることを確認。

Moscillatorで、1000kHz、-97dBFSのトーンを作成。

Melda Production MOscillator設定
-97dBFs 1kHzトーン

次に、Dithering = None で16bitへバウンス

スペクトラム:ディザ無しでバウンス
下位ビットは切り捨てられてしまうので、何もなくなる。

続いて、16ビットで再現可能な最小値、-96dBFSの信号を生成。

スペクトラム:-96dBFs信号

Dithering = Noneで16bitへバウンス

スペクトラム:ディザリング無し
ぎゃーーーーーーっっ!!
(トラックのゲインを上げると、このノイズは聞き取り可能)

Dithering = Rectangularで16bitへバウンス

スペクトラム:Rectangular dither
均等にノイズが付加される代わりに、Dithering無しのときほど倍音が生じない。
(3kHzに立った倍音は、トラックのゲインを上げると聞き取り可能)

Dithering = Triangularで16bitへバウンス

スペクトラム:Triangular dither
Dithering = Rectangularのときのような倍音が立たない。(その代わりCPU負荷は若干高い)

Dithering = Pow-r1で16bitへバウンス

スペクトラム:Pow-r1 dither
Triangular と比べて、ノイズが高域に集中している。代わりに、他の帯域のノイズ・フロアは総じて低い。

Dithering = Pow-r2で16bitへバウンス

スペクトラム:Pow-r2 dither
7kHzあたりから徐々にノイズ・フロアが上がる。代わりに、フロアのピーク値、高域以外のノイズ・フロアはPow-r1より低い。

Dithering = Pow-r3で16bitへバウンス

スペクトラム:Pow-r3 dither
1kHz付近までノイズ・フロアは、Pow-r2 と同様。高域のノイズ・フロアが高い代わりに、3.5kHz付近にディップがある。→Voなど肉声の明瞭さを司る周波数帯が、Dither ノイズに埋もれにくい

Sonarで選択可能な全Dither種、一挙比較

スペクトラム: Sonarが提供するディザー全種類の比較

おまけ

3.5kHz、-130dBFSのトーンをDither = Rectangularで16bitにバウンス

スペクトラム:埋もれた信号
Dither ノイズに埋もれた…

3.5kHz、-130dBFSのトーンをDither = Pow-r3で16bitにバウンス

スペクトラム: 16bitで130dBのダイナミック・レンジを再現
トラックのゲインを上げると聞き取り可能。
→ ダイナミック・レンジが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);
参考文献: