Mache ich das Richtige, um Dezibel von -120 - 0 in 0 - 120 zu konvertieren

7

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%     
Desmond 12.02.2012, 07:45
quelle

5 Antworten

8

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.

    
Michael Chinen 12.02.2012, 07:57
quelle
23

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.

    
meaning-matters 24.04.2013 12:49
quelle
1

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.

    
Vellozo 20.03.2013 12:45
quelle
0

Ich mache ein Regressionsmodell, um die Zuordnungsbeziehung zwischen den aus NSRecorder generierten WAV-Daten und den Dezibel-Daten aus NSRecorder.averagePowerForChannel

zu konvertieren

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.

    
David X. Lau 09.08.2017 02:32
quelle
-3

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.

    
Ritu Dalal 18.04.2015 12:52
quelle