Forum: Mikrocontroller und Digitale Elektronik Audio PLL dynamisch anpassen


von Engineer (Gast)


Lesenswert?

HI Leute,

ich stehe vor einem Problem, dass ich auf einem uC dynamisch einen 
Audio-Datenstream via UDP Pakete aus einem IP Netzwerk bekomme.
Prinzipiell weiß ich die sample-rate (48 kHz).
Leider kann man nie davon ausgehen, dass die 48 kHz input-datenstrom 
genau 48 kHz sind, sondern vlt 48,008 etc..

Die Audio-PLL auf dem uC ist auch nicht in der Lage exakt 48 kHz zu 
reproduzieren.

Meine Idee war es jetzt, einfach mitzuzählen wie viel Datenpakete 
reinkommen, anhand dessen die "input-sample-rate" berechne und dann 
dynamisch die Audio-PLL anpasse.

Ich frage mich nur, was ich mache, wenn ein UDP Paket mal nicht ankommt 
und wie ich dynamisch die korrekten PLL Einstellungen zurückrechnen 
kann.

Bin ich mit meinem Ansatz auf dem Holzweg oder habt Ihr Ideen wie man so 
etwas lösen kann?

Danke!

von Engineer (Gast)


Lesenswert?

Bzw. welche Ansätze hat hier ein normaler Windows-PC, wenn man parallel 
mehrere Audio-Sourcen auf dem Windows-System am laufen hat (z.B. 
Webradio) die alle leicht unterschiedliche Samplerates haben, das ganze 
synchron auf den Audio-Ausgang rauszubekommen?

von Georg A. (georga)


Lesenswert?

Engineer schrieb:
> Meine Idee war es jetzt, einfach mitzuzählen wie viel Datenpakete
> reinkommen, anhand dessen die "input-sample-rate" berechne und dann
> dynamisch die Audio-PLL anpasse.

Muss man so machen, wenn Quelle und Senke asynchron sind und nicht 
extern über Wordclock oder PTP versorgt werden. Kniffelig sind halt nur 
die Regelparameter der PLL, damit die nicht wilde Sprünge macht, hin- 
und hereiert oder bei Fehlern völlig austickt und trotzdem schnell eine 
ungefähre Schätzung der Zielfrequenz schafft. Hilft ja nichts, wenn man 
sich da erstmal eine halbe Stunde was zusammenmitteln muss.

> Ich frage mich nur, was ich mache, wenn ein UDP Paket mal nicht ankommt
> und wie ich dynamisch die korrekten PLL Einstellungen zurückrechnen
> kann.

Aus dem Grund haben andere AoIP-Protokolle (zB. das RTP von 
Ravenna/AES67) einen Sequenzzähler bzw. Timestamp. Dann weiss man, was 
man verpasst hat.

> Bzw. welche Ansätze hat hier ein normaler Windows-PC, wenn man parallel
> mehrere Audio-Sourcen auf dem Windows-System am laufen hat (z.B.
> Webradio) die alle leicht unterschiedliche Samplerates haben, das
> ganze synchron auf den Audio-Ausgang rauszubekommen?

So synchron muss es da nicht wirklich sein. Man sollte nur langfristig 
Buffer-Under/Overflows vermeiden. Ganz simpel kann man da ab und zu 
Samples auslassen/verdoppeln (ist halt hörbar) oder man macht ein 
Resampling mit einer aufgrund der Bufferfüllstandsänderung geschätzten 
Samplerate. Das wäre das DSP-Äquivalent der Sampleraten-PLL (mit all 
ihren Herausforderungen), kostet halt Rechenpower.

von Marco H. (damarco)


Lesenswert?

Oder eine Buffer Lösung und wenn ein Sample fehlt ist ein "Plop" sowie 
so unvermeidbar... In der Regel sind ja auch im Paket mehrere Samples 
für einen Kanal enthalten und der Buffer ist ja schon vorhanden. Dein 
Zählen dient ja vornehmlich auch dazu zu vermeiden das der Buffer leer 
wird oder überläuft.

von Heinz (Gast)


Lesenswert?

Engineer schrieb:
> Bzw. welche Ansätze hat hier ein normaler Windows-PC, wenn man parallel
> mehrere Audio-Sourcen auf dem Windows-System am laufen hat (z.B.
> Webradio) die alle leicht unterschiedliche Samplerates haben, das ganze
> synchron auf den Audio-Ausgang rauszubekommen?

Das Problem ist auf Windows-Systemen das gleiche. Die müssen Senderate 
und  Abspielrate auch aufeinander abstimmen. Zu diesem Zweck gibt es in 
der Windows-Audiotreiber-Architektur einen Rückkanal. Die 
Lowlevel-Hardware-Treiber, welche den Audio DAC befüllen, nutzen diesen 
Rückkanal und ändern die Datenrate jeweils minimal, sodass der DAC 
Sendebuffer immer ausreichend Samples enthält.

Ich würde es in deinem Fall so ähnlich machen. Der UDP-Empfänger könnte 
zunächst seinen Ringspeicher halb befüllen, dann den Audio DAC mit 48kHz 
starten und den Ringspeicher Füllstand im Blick behalten und dann 
entspr. mehr oder weniger Datenrate anfordern.

Datenverlust:
Wenn die Datenpakete Sequenznummern haben, könntest du Datenverlust 
erkennen und notfalls das gleiche Sample nochmal abspielen - je nachdem 
wie lang so ein Sample ist. Oder du generierst dir ein Dummy-Sample, 
welches vom Endwert des letzten Samples zum Anfangswert des nächsten 
Samples rampt, um ein Plop zu vermeiden. Aber da gibt es vermutlich 
beliebig viele Strategien...

von Heinz (Gast)


Lesenswert?

Oder: Falls dein Audio Stream ausreichend oft Pausen (Stille) enthält, 
könntest du dieses Wissen nutzen, und die PLL einfach frei laufen zu 
lassen und in den Ruhe Pausen enweder Daten wegwerfen oder stille UDP 
Pakete duplizieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.