2010/06/07

dBについて

JAVAでエフェクト・コンプレッサー自作の記録 3
音を扱う場合、dBがよく使われる。今回作るコンプレッサーでもdBで制御できるようにするため、基本的なところを理解しておくことにする。

G[dB] = 20log10 y/x 
G:デシベル換算した入力/出力比
x:入力
y:出力

下はデシベル[dB]から入出力電力比を表す計算式 。
P1:入力電力
P2:出力電力
x:入力(dB)

P2/P1 =10^(x/10)

電力比を電圧比にして、対数の係数を2倍の20とする。さらに式を変形させれば今回の用途で使えるようになる。

P2 = P1*10^(x/20)

例として出力をデシベルで指定して -6dB、入力レベルを素のデータ 32767 としてみる。 関数電卓で計算

P2 = 32767 * 10^(-6/20)
= 32767 * 10^(-0.3)
= 32767 * 0.5012
= 16422 

音量を-6dBつまり1/2にするなら本当は16384になるはずだが、そうなっていない。それは-6dBが、およそ1/2という意味だから。精度を上げるなら-6.0206dBぐらいの数字を入れないとだめ。-6.0206dBで計算すればちゃんと半分の16384になる。Javaでも確認してみる。
public class Log_test {
 public static void main(String[] args){
  int db = -6 ;
  short p1 = 32767;
  
  double p1a = 0 ;
  short p2 ;
  p1a = (double)p1 * (Math.pow(10,db/20.0));
  p2 = (short)p1a ;
  System.out.println("dB ="+ db + " \nP1 ="+ p1 + "\ndouble P1a = " + p1a);
  System.out.println("short  P2  = " + p2);
  
  //dBを上記から逆計算して精度を確認
  double db2 =  (double)Math.log10(Math.pow((p1a/p1),20));
  System.out.println("dB2 = " + db2);
 }
}
結果は
dB =-6
P1 =32767
double P1a = 16422.402084264828
short P2 = 16422
dB2 = -6.000000000000001
こんなかんじで、関数電卓と同じ結果。


コンプ製作の記録
1 Java 具体的に作ってみる
2 WAVについて
3 dBについて
4 コンプに必要な情報
5 Eclipseの導入
6 Nimbus
7 コンプの原理
8 コンプレッサーベータ版完成
9 NAMAGI Compressor