Was gibt mir die Funktion getMaxAmplitude () von Android für den MediaRecorder eigentlich?
Android-MediaRecorder hat eine Funktion
.getMaxAmplitude ();
die, wie die API sagt mir, "Gibt die maximale absolute amplitude, die abgetastet wurde seit dem letzten Aufruf dieser Methode." aber ich kann nicht finden, was die amplitude dieser ist? Ist es in pascal oder Watt?
Gefunden habe ich mehrere Seiten auf dem web, können Sie einen Wert berechnen eng corelated Dezibel zu verwenden (wie vorgeschlagen hier).
double db = (20 * Math.log10(amplitude / REFERENCE));
denen würde lassen Sie mich davon ausgehen, dass der zurückgegebene Wert ist in einigen linearen Skala (wahrscheinlich so etwas wie milipascal...)
REFERENCE=0.1 (ich bin mir bewusst, dass dies so etwas wie 2*10^(-5) - Pascal - ((20 uPascal)), aber das gibt seltsame Werte... 0.1 komischerweise funktioniert besser).
Ich jetzt Messen Sie die MaxAmplitude() mit dem
getMaxAmplitude()
und setzen Sie diese in die variable amplitude.
Dies ist die Methode:
public double getNoiseLevel()
{
//Log.d("SPLService", "getNoiseLevel() ");
int x = mRecorder.getMaxAmplitude();
double x2 = x;
Log.d("SPLService", "x="+x);
double db = (20 * Math.log10(x2 / REFERENCE));
//Log.d("SPLService", "db="+db);
if(db>0)
{
return db;
}
else
{
return 0;
}
}
Dies geschieht 5 mal in einer halben Sekunde, das wird ziemlich durchschnittlich
for(int i=0; i<5; i++)
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
return 0;
}
level = level+getNoiseLevel();
if(level>0)
{
counter++;
}
}
level=level/counter;
Log.d(LOG_TAG, "level="+level);
Bekomme ich etwas, das ein bisschen aussieht wie Dezibel, aber ich bin nicht sicher, ob seine wirklich Dezibel an alle...
So, könnte mir jemand helfen? Es scheint sehr seltsam, dass die API nicht specefy überhaupt was zurückgegeben...
InformationsquelleAutor der Frage Lukas Ruge | 2012-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich finden konnte, die Antwort auf diese Frage, und ich Teile es hier für alle, die ' s interessiert: Der MediaRecorder.getMaxAmplitude () - Funktion gibt ein unsigned 16-bit integer-Werte (0-32767). Das ist wahrscheinlich nur die abs() des CD-Qualität, sample-Werte im Bereich von -32768 bis 32767. Dies bedeutet, dass Sie wahrscheinlich stellen ein 16-bit-Digitalisierung der elektrischen Leistung von 0-100% maximale Spannungsbereich der Mikrofon bauen, in das Handy. Da selbst in der eigenen Marke mobile Mikrophone manchmal variieren in Ihrer genauen Bereich nicht auch zu ähnlichen Handys wird unbedingt wieder den gleichen Stellenwert, die gleiche Distanz in der gleichen Schallquelle.
Dieser Wert jedoch entspricht Schalldruck in Pascal, da es auch eine lineare Quantisierung der solund Druck, in den Bereich, wo der Ton kann gemessen werden mit der angegebenen Mikrofons (wird nicht decken den gesamten sprectrum aufgrund der Einschränkungen des Telefons).
InformationsquelleAutor der Antwort Lukas Ruge
Arbeitete einige mehr. Mit einigen tests mit kalibrierten SPL-Meter und smart-phones mit diferent Reine Frequenzen, weißes Rauschen und rosa Rauschen weiß ich jetzt, dass Handy-Mikrofone sind nicht geeignet für alles, was, die sollte sich überall über 90 bis 100 dB(SPL) je nach Handy.
Asuming, 90 dB(SPL) das maximum kann man berechnen, dass dies entspräche einem Druck von 0.6325 Pa am mic. Jetzt asuming, dass p0=0.0002 Pa ist die Referenz Mindest-und asuming, dass dieses register als 0 (was eigentlich nie passiert) aus getMaxAmplitude() können wir corelate die Werte aus der getMaxAmplitude () - Funktion den maximalen Druck am mic. Dies bedeutet ein Ergebnis von 16375 von getMaxAmplitude() entsprechen würde 0.3165 Pa maximaler Druck. Dies ist natürlich nicht sehr wissenschaftlich, da die max-und min-Werte sind Reine conjesture, aber es gibt uns ein Ausgangspunkt. Wir können nun berechnen p mit
p=getMaxAmplitude()/51805.5336
Wissen, ist der Druck auf die mic-wir berechnen die dB(SPL)-Wert mit der bekannten Formel
X = 20 log_10 (p/p0)
Diese noch geben wird, ein Wert, der zu hoch ist, da nur die maximale amplitude ist in den Berechnungen verwendet. Um dieses Problem zu lösen muss man nicht verwenden getMaxAmplitude() und dies ist zwar etwas außerhalb des Fokus dieser Frage, werde ich den code eh in der Hoffnung, dass es hilft
Diese Werte sind abgeleitet aus dem Mittelwert aller Amplituden in einem 4 Sekunden Probe und damit genauer. Danach werden die oben geschilderten Berechnungen fertig sind. Dies wird ein realistischeres Dezibel-Wert. Beachten Sie, dass Handy-Mikrofone noch saugen tun und dass dieser Algorithmus produziert nicht die tatsächlichen dB(SPL), sondern nur eine etwas bessere Näherung dann der eine vor.
Um die Leistung von einigen apps heraus dort etwas mehr hätte getan werden müssen. Die meisten dieser apps nutzen, die Schiebefenster, also die halten Sie die Aufnahme und schieben Sie ein Fenster von x Sekunden contnuosly bewerten Sie die sound-Ebene. Auch ich werde einige Evaluierung db-Wert ist am besten geeignet zu sein, als max, jetzt ist es 90 dB(SPL)/0.6325 Pa, welche nur eine angemessene Schätze, es wird wohl etwas darüber.
Sobald ich mehr werde ich update die info.
InformationsquelleAutor der Antwort Lukas Ruge