Ich möchte die Lautstärke der Umgebung messen, nicht zu sicher, ob ich das Richtige tue.
Ich möchte ein VU-Meter im Bereich von 0 (leise) bis 120 (sehr laut) erstellen.
Ich habe die Peak- und die Avg-Power bekommen, bin aber in normaler ruhiger Umgebung sehr hoch. Gib mir einen Zeiger.
%Vor%Die Formel zum Konvertieren einer linearen Amplitude in Dezibel, wenn Sie 1.0 als Referenz (für 0db) verwenden möchten, ist
%Vor%Ich bin mir also nicht sicher, ob Sie Ihren Code sehen wollen, aber Sie wollen wahrscheinlich
%Vor%Dies wird von -unendlich bei einer Amplitude von 0 bis 0db bei einer Amplitude von 1 gehen. Wenn Sie es wirklich benötigen, um zwischen 0 und 120 zu gehen, können Sie 120 hinzufügen und eine max-Funktion bei Null verwenden.
Also, nach der obigen Zeile:
%Vor%Die Formel, die Sie verwenden, scheint die Formel für die Umwandlung von DB in Amp zu sein, was meiner Meinung nach das Gegenteil von dem ist, was Sie wollen.
Bearbeiten: Ich lese noch einmal und es scheint, dass Sie bereits den Dezibel-Wert haben.
Wenn dies der Fall ist, konvertieren Sie einfach nicht in die Amplitude und fügen Sie 120 hinzu.
Also
ändern %Vor%bis
%Vor%und du solltest in Ordnung sein.
Apple verwendet eine Nachschlagetabelle in ihrem SpeakHere -Sample, das von dB in einen linearen Wert konvertiert, der auf einer Pegelanzeige angezeigt wird. Dies ist, um die Stromversorgung des Geräts zu sparen (ich denke).
Ich brauchte das auch, aber ich dachte nicht, dass ein paar Float-Berechnungen alle 1 / 10s (meine Bildwiederholfrequenz) so viel Geräteleistung kosten würden. Anstatt also eine Tabelle zu erstellen, formte ich ihren Code in:
%Vor% Ich benutze AVAudioRecorder
, daher sehen Sie, wie Sie dB mit averagePowerForChannel:
erhalten, aber Sie können dort Ihren eigenen dB-Wert eintragen.
Apples Beispiel verwendet double
Berechnungen, die ich nicht verstehe, weil für die Audio-Messung float
Genauigkeit mehr als ausreichend ist und weniger Geräteleistung kostet.
Natürlich können Sie diese berechnete level
jetzt mit einem einfachen level * 120.0f
auf Ihren Bereich von 0 .. 120 skalieren.
Der obige Code kann beschleunigt werden, wenn wir root
bei 2.0f
korrigieren, indem wir powf(adjAmp, 1.0f / root)
durch sqrtf(adjAmp)
; aber das ist eine kleine Sache, und ein sehr guter Compiler könnte das für uns tun. Und ich bin mir fast sicher, dass inverseAmpRange
einmal zur Kompilierzeit berechnet wird.
Tatsächlich liegt der Dezibelbereich zwischen -160 und 0, aber er kann positive Werte annehmen. (AVAudioRecorder Klassenreferenz - averagePowerForChannel: Methode)
Dann schreiben Sie besser db += 160;
anstelle von db += 120;
. Natürlich können Sie auch einen Offset setzen, um es zu korrigieren.
Ich mache ein Regressionsmodell, um die Zuordnungsbeziehung zwischen den aus NSRecorder
generierten WAV-Daten und den Dezibel-Daten aus NSRecorder.averagePowerForChannel
NSRecorder.averagePowerForChannel
(dB) = -80 + 6 log2 ( wav_RMS
)
wobei wav_RMS
der quadratische Mittelwert der wav-Daten in einer kurzen Zeit ist, d. h. 0,1 s.
Stellen Sie einfach Ihren maximalen und minimalen Wert ein. Wie Sie bekommen eine Reichweite von 0-120. Wenn Sie eine Reichweite von 0-60 wollen. Teilen Sie den Wert einfach in die Hälfte, um den halben Bereich usw. zu erhalten.
Tags und Links iphone ios xcode audio-recording decibel