2017-10-07 58 views
1

我正在嘗試在java中編寫一個簡單的數據庫聲壓級表,試圖理解一些關於如何計算它的理論,並在此刻得到了這些代碼。音頻數據庫spl水平的計算

import java.io.IOException; 

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.TargetDataLine; 

public class Sound { 
public static void main(String[] args) throws LineUnavailableException, InterruptedException, IOException { 

    AudioFormat audioFormat = new AudioFormat(44100f, 16, 1, true, true); 
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat); 
    if (!AudioSystem.isLineSupported(info)) { 
     System.err.println("Line is not supperted"); 
     return; 
    } 
    TargetDataLine targetDataLine = AudioSystem.getTargetDataLine(audioFormat); 
    int bufferSize = targetDataLine.getBufferSize()/5; 
    targetDataLine.open(audioFormat, bufferSize); 
    targetDataLine.start(); 

    AudioInputStream audioInputStream = new AudioInputStream(targetDataLine); 
    byte[] buffer = new byte[bufferSize]; 
    for (int blen; (blen = audioInputStream.read(buffer, 0, buffer.length)) > -1;) { 


     float[] samples = new float[buffer.length/2]; 
     for (int i = 0, s = 0; i < blen;) { 
      samples[s++] = (buffer[i++] << 8 | buffer[i++] & 0xFF)/32768f; 
     } 

     double rms = 0; 
     for(float sample : samples) { 
      rms += Math.pow(sample,2); 
     } 
     rms = (double) Math.sqrt(rms/samples.length); 

     double db = 20.0 * Math.log10(rms); 

     System.out.println("rms:" + rms + " => db: " + db); 
    } 
    audioInputStream.close(); 
    targetDataLine.stop(); 
    targetDataLine.close(); 
} 
} 

但我真的越來越怪負值:

rms:0.022453707817984867 => db: -32.97423865942349 
rms:0.03231030831709747 => db: -29.81317795523038 
rms:0.022200493154558538 => db: -33.07274756330733 
rms:0.03482430806204803 => db: -29.162350079742442 
rms:0.044505461273788495 => db: -27.03173386777801 
rms:0.11487023115936983 => db: -18.795850099565726 
rms:0.09914386060902665 => db: -20.07468347812454 
rms:0.10989161780818954 => db: -19.180708658988408 
rms:0.13056592937751932 => db: -17.683402711408206 
rms:0.12638495853786622 => db: -17.96609219396998 
rms:0.14194418861687289 => db: -16.957647667311765 
rms:0.13712612622742246 => db: -17.257595850171978 

的麥克風的同一位置(iOS上的分貝儀免費)用外部應用程序,我得到約6個陽性更有意義的價值觀 - 10分貝。

我該如何正確計算這個值,以至少獲得接近或相同的應用程序的值?我做錯了什麼?

回答

0

嘗試:

float db = 20.0 * Math.log10(rms); 

PCM(音頻)數據以32位Float不爲64位Double型處理。