Lautstärke des PCM-Streams


7

Ich empfange PCM-Samples über einen Stream mit einem Kanal und 8000 Samples pro Sekunde. Ich fand heraus, wie ich die Lautstärke herausfinden kann, indem ich die "Kraft" des Signals berechnete, indem ich den Abs-Wert aller nächsten 1000 Samples addierte und dann durch die Anzahl der Samples dividierte, die 1000 beträgt. Es funktioniert etwas gut, aber manchmal werden meine Berechnungen verrückt, meine Summe der absoluten Werte von Proben scheinen sich ständig aufzubauen und lächerliche Werte zu erreichen ... also denke ich, dass ich dort etwas falsch mache. Lustige Sache ist, dass, wenn Berechnungen verrückt werden, alles wieder normal wird, wenn ich mit meiner Hand auf 'Soundeingabegerät' drücke;)

Wie auch immer. Meine Frage ist: Wie kann man die Lautstärke eines Satzes von PCM-Samples richtig berechnen?


Welches numerische Format verwenden Sie bei der Berechnung der Summe? Klingt nach einem Überlauf.
Jason R

1
Ich verwende 2 Bytes, vorzeichenbehaftete Nummer. Ich habe keinen Überlauf. Ich habe alle Proben gedruckt, um sie in txt-Form abzulegen, und diese Proben waren trotz der Stille im Laufe der Zeit immer höher. Was noch seltsamere Werte sind, ging nicht unter Null, als es anfing, sich "aufzubauen".
Solgar

Antworten:


9

Berechnen Sie den Effektivwert (Root-Mean-Square), um die Energie zu messen (die eng mit der "Lautstärke" zusammenhängt, aber nicht mit dieser identisch ist).

E=n=0N1s[n]2N

N is the number of samples and s[n] is the sample at time n.

You can do this in any block size of samples. You can do it on all the samples at once to get an average energy, or you can break your sample set into chunks to see how the energy changes with time.

There are also more sophisticated methods that take into account the body and brain's quirks. You can find more information about that here.


1
Here is code in multiple languages for finding the root mean square.
Xeoncross

1

I'm no expert and not sure what you are trying to achieve, but it sounds like you've made a programming error somewhere, could you show us the code?

When you say loudness do mean it as defined here? In that case you need to account for the listener.

If you're just interested in energy, maybe RMS is a better choice, or averaged squares.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.