その1 : ディザと量子化誤差の実際   06/24/2014

デジタル信号処理に関心がある方なら、ディザ(dither)という単語をご存知でしょう。
CDが世に出た後の今から30年位前には、既に専門書に記載がありました。
今ではWikipediaにも記事があるくらいですから、もう一般的な用語かと思います。

ディザの概念としては、離散値化したデータに乱数(雑音)を加減することで量子化誤差を低減するものでしょ?っていう感じですかね。
実はディザには、大振幅ディザと小振幅ディザがあり、期待する効果に違いがあります。
前者は変換精度の向上(非直線性の改善)、後者は量子化誤差の低減(高調波の抑制)に寄与します。

今回取り上げるのは、後者の小振幅ディザについてです。
実際のところディザってどうなん?っていうのが発端で、ちょっと実験してみました。

まず原理的に、量子化誤差が発生する要因は、実数(連続値)を整数(離散値)に丸める端数処理にあります。
四捨五入、切り上げ、切り捨て、最近接丸め等々、いろいろありますが、乱数丸め以外は全て数値的に確定します。
(ある実数値に対しては、常に決まったある整数値となるということです。)
ということは、周期を持つ信号に対し、周期的な誤差が発生することを意味します。
オーディオ的に言うと、単一周波数の正弦波をAD変換したら高調波歪みが発生した!っていう感じですかね。
本当にそうなん?っていう疑問にお答えするため、実験してみました。
以下は、浮動小数点数に各種の端数処理を行って正弦波データを作成し、その周波数成分を表示したものです。
 フォーマット : サンプリング周波数:48kHz、量子化ビット数:16bit
 正弦波信号 : 周波数:1kHz、振幅:-90dB
 端数処理  : RZ(0方向へ切り捨て)、RI(無限遠方向へ切り上げ)、RN(四捨五入)、RNE(最近接偶数丸め)

やはり高調波(奇数次)がたくさん出てますね。
ここで、RI(Rounding toward Infinity)でノイズフロアが上がっているのは、値が0にならないことが原因です。
RIでは浮動小数点値がきっちり0にならないと−1/1になってしまいますが、正弦波データの計算できっちり0が出てくることはまずあり得ま せん。
データに0が現れないと元の単一周波数以外の周波数の信号成分が多数必要となり、ノイズフロアが上がったように見えます。
さてこの高調波、実際には元信号が-90dBなので微小レベルなんですが、Hi-Fiオーディオ的には許せないというわけです。
上に書いたように誤差が周期性を持つのが原因なので、端数処理に乱数丸めを行うことで周期性が消え、高調波も消えるはずですよね?
ということで、やってみました。
 フォーマット : サンプリング周波数:48kHz、量子化ビット数:16bit
 正弦波信号 : 周波数:1kHz、振幅:-90dB
 端数処理  : Dither(乱数丸め、[0,1)の一様乱数を使用)

確かに高調波は消えましたが、全帯域でノイズフロアが上昇しました。
これは、使用した乱数が一様乱数なので、ホワイトノイズを加算したことと等価になるためです。

もうお気付きだと思いますが、この乱数丸めを行うこと自体が小振幅ディザの一種です。
さてディザの説明では、ホワイトノイズ以外のノイズを加える手法もよく載っています。
ところが、実際の効果について、わたしはあまりお目にかかったことがありません。
なので、またやってみました。
 フォーマット : サンプリング周波数:48kHz、量子化ビット数:16bit
 正弦波信号 : 周波数:1kHz、振幅:-90dB
 端数処理  : Dither(乱数丸め、ガウシアンPDFを使用)

おまけで更に効果が薄れると思われるピンクノイズを使用した結果です。
 フォーマット : サンプリング周波数:48kHz、量子化ビット数:16bit
 正弦波信号 : 周波数:1kHz、振幅:-90dB
 端数処理  : Dither(乱数丸め、ピンクノイズを使用)

専門書に書かれているように、ガウシアンPDFでは同じ振幅値だと高調波が残っているのが分かります。
周波数が上がるほどレベルが下がるピンクノイズでは、効果が薄いのも確認できます。
なお、聴覚的には元信号との相関がない三角形確率密度関数(TPDF)がディザとして望ましいとよく書かれています。
しかしながら、端数処理としての観点からは一様乱数(方形確率密度関数、RPDF)一択です。


コラム へ戻る

ホームへ戻る