2013-03-11 10 views
8

Ich versuche, den Lautstärkepegel aus dem Mikrofon auf Android zu berechnen. Ich habe AudioRecord benutzt, um die Rohdaten vom Mikrophon zu erhalten und habe auch etwas Normalisierung durchgeführt und danach das Dezibel berechnet. Aber das Ergebnis ist nicht richtig. Die Dezibelwerte, die ich bekam, waren nicht stabil und können den Klang nicht wiedergeben. Selbst wenn ich Hände klatschte, spiegelte der Dezibelwert das Geräusch nicht wider. Wie sollte ich den Code ändern oder Was soll ich tun, wenn ich die Lautstärke vom Mikrofon in Echtzeit berechnen möchte? Danke vielmals.Berechnen Lautstärke von dem Mikrofon auf Android

   recorder = new AudioRecord(AudioSource.MIC, iSampleRate, AudioFormat.CHANNEL_IN_MONO,    AudioFormat.ENCODING_PCM_16BIT, iAudioBufferSize); 

       iBufferReadResult = recorder.read(buffer, 0, iAudioBufferSize); 

       for (int i = 0; i < buffer.length-1; i++) 
      { 
       ByteBuffer bb = ByteBuffer.wrap(buffer, i, 2); 
       int isample = bb.getShort(); 

       double dsample =(double) isample/32768.0; 
       sum += (dsample*dsample); 

       double rms = Math.sqrt(sum/(buffer.length*0.5));   
       double decibel = 20*Math.log10(rms); 

       sum = 0; 
       } 

      } 
+0

Der Zweck der Umwelt Klangänderung auf die Lautstärke basierend nur erkennen könnte. Wie soll ich das machen? Vielen Dank. – Foreverniu

+0

Ich denke, Sie überprüfen Lautstärke in Audio verwalten – DjHacktorReborn

+0

Ich habe bisher nicht mit dem Mikrofon gearbeitet, aber ich würde davon ausgehen, dass Ihre Berechnung immer das gleiche Ergebnis liefert. Angenommen, es gibt kein Rauschen, dann hätten Sie viele Samples bei 50%, was 0 wäre, wenn die Nummern wirklich signiert sind. Auf der anderen Seite, wenn es einen Ton gibt, hätten Sie viele Samples mit ähnlicher positiver und negativer Amplitude, die sich auch zu 0 addieren würden. Ich würde sagen, dass Sie nur absolute Werte, z. das Zeichen beseitigen, wenn Sie wirklich positive und negative Zahlen erhalten? –

Antwort

3

Hier gibt es zwei Probleme. Die erste besteht darin, dass Sie den RMS aus einem einzelnen Sample berechnen, da Sie die Summe nicht über den gesamten Puffer berechnen - Sie setzen es bei jedem Sample zurück. Also sum enthält die Quadrat-Magnitude für eine Probe, aber dann dividiert durch die Stichprobenlänge.

Das zweite Problem ist, dass Sie nicht in der Lage sein werden, ein Messgerät zur Messung der Lautstärke zu erstellen. Der Dezibelwert, den Sie berechnen, ist nur ein Leistungsverhältnis, bei dem der Maximalwert von 0 dB eine Spitze anzeigt. Es hat keine Korrelation mit physischem Schalldruck, was allgemein gemeint ist, wenn Leute 'Lautheit' sagen (dB (SPL) ist die Skala, bei der 50 dB die Lautstärke der Sprache, 110 dB ein Rockkonzert usw. ist).

Siehe auch: sound meter android

Verwandte Themen