振幅値をデシベルに変換する方法

デシベルは信号の強さ、大きさを人間の感覚尺度に合わせたスケールです。

人間の感覚は入力信号に対して指数関数的な鈍さを持っているので、入力信号を対数化すると、人間の感じ方に違いスケールになります。


音声でよく用いられるデシベル変換は、20 * log10(信号値/信号ピーク値) です。-1.0〜1.0スケールのLPCMを入力した場合の変換は、Pythoin+Numpyだと以下の通り簡単に書けます。

db_signals = 20 * numpy.log10(liner_signals + sys.float_info.min)

ところで、log関数は入力値ゼロが未定義なので、無音信号をデシベルに変換しようとすると、log関数がエラーになってしまいます。

そこで、入力値に一律sys.float_info.minを足すことで、エラーを回避しています。

デシベルは最小値がマイナス無限大である点に注意が必要です。ゼロ値の入力を場合わけしたとして、マイナス無限大を正しく扱えるプログラミング言語でなければ意味がありません。

sys.float_info.minを足す方法は、実際には真の値に対して誤差となりますが、非常に小さい値なので、周波数を分析する際にsys.float_info.minを足したことによる誤差の影響が問題になることはほとんどありません。

信号処理では、対象とする信号列が線形スケールなのか対数スケール(デシベルスケール)なのかは非常に重要なので、デシベル変換に慣れておくと良いでしょう。

Leave a Reply

メールアドレスが公開されることはありません。 が付いている欄は必須項目です