iPhone - Wie man die Amplitude eines PCM codierten Signals misst

8

Hier ist mein Problem:

  1. Ich muss Audiodaten in Echtzeit analysieren, um die Amplitude des Signals herauszufinden
  2. Ich kann die AudioQueue-Messfunktion nicht verwenden, da sie zu lange ist, um Spitzen zu erkennen
  3. Ich habe das aurioTouch Beispiel studiert ..... aber ...

Ich verstehe einfach nicht, wie der PCM-codierte Puffer in die in der Oszilloskopansicht angezeigte Wellenform zurückkonvertiert wird. Es wäre genau diese Welle, die ich für die Amplitude analysieren möchte.

In meinem Callback, wenn ich den Puffer analysiere, hat er nur 0 und -1 drin - wenn NSLog benutzt wird (@ "% d"). Das macht Sinn, denke ich, weil es PCM ist.

Ich kann den Ort in aurioTouch nicht finden, wo die Magie der Umwandlung des 0 / -1-Stroms in eine Wellenform passiert: - ((

Auch wenn ich die Wellenform im Speicher habe, wie analysiere ich die Amplitude und wie wandere ich diese Messung in dB um?

Ich möchte FFT nicht verwenden, weil ich an der Häufigkeit nicht interessiert bin und ich hoffe, dass es andere Wege gibt.

Prost

Mat

    
Matthias Schorer 30.01.2010, 10:19
quelle

2 Antworten

10

Sobald Sie einen Teil der Wellenform im Speicher haben, ist es relativ einfach, die Größenwerte in dB zu berechnen (obwohl Sie entscheiden müssen, was Sie für 0 dB sagen). Wenn Sie die Art der kurzzeitigen Größe haben möchten, die auf einem VU-Meter angezeigt wird, müssen Sie die Momentanwerte der Wellenform korrigieren (Sie können dafür abs verwenden) und diese korrigierten Werte dann durch einen einfachen Tiefpassfilter weiterleiten mit einer Zeitkonstante in der Größenordnung von beispielsweise 100 ms. Um die Werte in dB zu konvertieren, tun Sie dies:

amplitude_dB = 20 * log10(amplitude) + calibration_dB;

wobei amplitude die gleichgerichtete und gefilterte Magnitude ist und calibration_dB ein Offset ist, um Ihnen die korrekte Amplitude für 0 dB zu geben, egal was in Ihrer speziellen Anwendung ist (zB dB re full scale oder ein kalibrierter dBV oder dBm Wert) .

Ein einfaches, aber effektives Tiefpassfilter kann wie folgt implementiert werden. Dies wird ein einpoliger IIR (rekursiver) Filter sein. Jeder Ausgang ist abhängig vom vorherigen Ausgangswert und dem aktuellen Eingangswert. Wir haben einen konstanten Faktor, Alpha, der effektiv die Zeitkonstante oder Grenzfrequenz dieses Tiefpassfilters bestimmt.

%Vor%
  • x = aktueller Eingabewert
  • y = neuer Ausgabewert
  • y_old = vorheriger Ausgabewert
  • alpha = Konstante, die die Antwort des Filters bestimmt - eine kleine positive Zahl - versuche 0,001, um mit experimentieren und experimentieren
Paul R 30.01.2010 15:07
quelle
1

AurioTouch ist das richtige Beispiel dafür. Leider ist der Code einfach schrecklich. Stellen Sie sicher, dass Sie es nur verwenden, um die Konzepte für die Arbeit mit der RemoteIO-Audioeinheit kennen zu lernen.

Das tatsächliche Zeichnen der Wellenform erfolgt direkt im renderProc-Callback, der von CoreAudio aufgerufen wird, wenn PCM-Daten verfügbar werden. Betrachten Sie PerformThru () in aurioTouchAppDelegate.mm:197 ... weiter unten, in Zeile 237

%Vor%

... hier wird auf die PCM-Daten zugegriffen. Dies sind die Daten, die Sie analysieren müssen, um die Spitzen- / Durchschnittsleistung des Signals zu erhalten.

    
VoidPointer 30.01.2010 10:31
quelle

Tags und Links