音圧の信号処理では、時折デシベル(dB)表示を行い、音圧レベルとして扱います。ここではdBを使う理由と計算方法を説明し、Pythonへの実装例を紹介します。
こんにちは。wat(@watlablog)です。
dBはとても便利な道具です。ここではPythonを使って物理値をdB値に変換したり、dB値を物理値に逆変換する方法を解説します!
デシベル(dB)について
dBを使う理由
音を分析するために精密騒音計で音圧を測定すると、騒音計の表示はデシベル(dB)で表現されています。
マイクで計測しているのは「音圧」で単位はパスカル[Pa]です。そのままPaで計測値を表示しないのは理由があります。
人間は耳で音を聞き、その音の大きさをレベルとして感じることができます。
人間が聞くことのできる最小可聴値は20[μPa]、最大可聴値は200[Pa]とされており、その範囲には1000万倍もの開きがあります。
騒音計では音圧[Pa]を測定していますが、これをそのままディスプレイに表示してしまうと、必要な桁数が多すぎてしまいますね。
dBを使うとこの20[μPa]~200[Pa]は0[dB]~140[dB]で扱えることになり表示に関しては非常に効率が良くなります。
そしてdBは人間の感覚と近いというのも、広く使われている理由にあります。
人は0.1[Pa]から1[Pa]の音圧の変化と、1[Pa]から10[Pa]への変化は同じように音量が増加したと感じることがわかっています。
つまり人の耳は物理量を差としてではなく倍率で評価しているということになります。
dBで表示すると0.1[Pa]から1[Pa]は20[dB], 1[Pa]から10[Pa]も20[dB]と同じ量になるため、変化量も単純に捉えやすいという利点があります。
dB変換式
dBへの変換は非常に簡単です。以下の式を使います。
$$ SPL_{dB}= 20log_{10}\frac{SP_{Lin}}{dBref} $$
ここで\(SPL_{dB}\)(Sound Pressure Level)がデシベル値で、\(SP_{Lin}\)(Sound Pressure)が実際の物理値である音圧[Pa]を意味しています。
dBに変換する前の物理値のことを、一般には「リニア値」と読んだりします。
式中の\(dBref\)はデシベル基準値(デシベルリファレンス)のことで、0[dB]の時の物理値のことを意味しており、音圧の場合は最小可聴値と設定されている20[μPa]になります。
dB逆変換式
次に逆変換式を示します。この式はdB値をリニア値に変換する式として使います。
$$ SP_{Lin}=dBref\cdot 10^{\frac{SPL_{dB}}{20}} $$
Pythonで実装しよう!
コード
先ほどまでに紹介した二つの式を関数化(db_function.py)しました。式そのままの見た目ですね。
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np #リニア値からdBへ変換 def db(x, dBref): y = 20 * np.log10(x / dBref) #変換式 return y #dB値を返す #dB値からリニア値へ変換 def idb(x, dBref): y = dBref * np.power(10, x / 20) #変換式 return y #リニア値を返す |
実行例
以下が実行例です。1[Pa]をdB変換、変換値をさらに逆変換しています。結果として1[Pa]≒94[dB], 94[dB]≒1[Pa]を得ました。
1 2 3 4 5 6 7 8 9 10 11 12 |
import db_function as dbf x = 1 dBref = 2e-5 y_db = dbf.db(x, dBref) y_lin = dbf.idb(y_db, dBref) print(y_db) print(y_lin) >>93.97940008672037 >>0.9999999999999999 |
まとめ
音声処理で数多く使用するデシベル変換について、デシベルが使われている理由と計算式をまとめました。
計算式をPythonで実装し、実行例を示しました。
音圧のデシベル表示ができれば、スペクトログラム解析結果も見やすくなるから便利だね!この後はそういった解析もやってみよう!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
参考文献
音についてもっと知りたい方は以下の「トコトンやさしい音の本」がオススメです。
デシベル変換の話(P17)はもちろん、人間が感じる音や音の分析手法について図入りで説明が入っています。
コメント