Forum: Mikrocontroller und Digitale Elektronik Methode um Jitter aus einem Inputsignal zu rechnen


von Jens (Gast)


Lesenswert?

Moin,

ich hab grad folgendes Problem: ich möchte aus einem Midi Time Code 
Signal (Frequenz: 30Hz), welches über die USART empfangen wird, ein 
exakt synchrones 44.1kHz Ausgangssignal erzeugen. Als Prozessor setze 
ich den STM32F103 ein.

Die Midi Daten werden zwar in der richtigen Reihenfolge empfangen, 
allerdings ist der Abstand zwischen zweier Pakete nicht immer gleich, 
sondern varriert.

Meine Herangehensweise ist momentan die folgende: sobald die ersten Midi 
Daten anliegen starte ich einen Timer mit der entsprechenden Frequenz. 
Kommen die nächsten Midi Daten, lese ich das Counter-Register vom Timer 
aus und sehe, dass dieser z.B. bereits den Nulldurchgang überschritten 
hat oder kurz davor steht.

Das neue Midi Daten vorliegen hab ich anfangs mit dem USART Interrupt 
getestet und im zweiten Test einen eigenen Timer mit einer viel höheren 
Frequenz installiert, der in der ISR das USART Status Register 
ausgelesen hat. Bei beiden Methoden treten die Schwankungen auf. 
Anscheinend ist das Midi Signal selbst oder die Dauer bis der Interrupt 
gesetzt wird, nicht konstant gleich.

Gibt es softwareseitig eine Möglichkeit den Jitter herauszurechnen? Bin 
mir nicht sicher ob eine Mittelung wirklich Abhilfe schafft. Momentan 
tritt der Erfolg noch nicht ein. In den Code-Tags hab ich mal meinen 
Ablauf geschrieben.
1
1. zeitliche Abfolge bei einer Mittelung: 
2
3
a) receive Midi Daten -> Timer starten
4
5
b) receive Midi Daten -> Counter-Register auslesen und Timer stoppen
6
7
c) receive Midi Daten -> Timer erneut starten 
8
9
d) wie b) uns soweiter 
10
11
und abschließend die zwischengespeicherten Counter-Register-Werte 
12
aufsummern und durch die ANzahl der Interrupts teilen. und bei den 
13
nächsten Midi Daten den Timer mit diesem Counter-Wert starten zu lassen?

Gruß
Jens

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jens schrieb:
> ich hab grad folgendes Problem: ich möchte aus einem Midi Time Code
> Signal (Frequenz: 30Hz), welches über die USART empfangen wird, ein
> exakt synchrones 44.1kHz Ausgangssignal erzeugen.
Und was willst du damit lösen? Irgendwie liegt hier doch alles fest:
30Hz Eingang, 44,1kHz Ausgang --> Faktor 1470

Wie willst du denn bei einem solch extremen Verhältnis noch "synchron" 
werden/bleiben? Wenn dein Midi-Signal nur 1 Promille daneben liegt, hast 
du schon fast 2 Takte deine 44,1kHz signals verplempert...

> Meine Herangehensweise ist momentan die folgende: sobald die ersten Midi
> Daten anliegen starte ich einen Timer mit der entsprechenden Frequenz.
> Kommen die nächsten Midi Daten, lese ich das Counter-Register vom Timer
> aus und sehe, dass dieser z.B. bereits den Nulldurchgang überschritten
> hat oder kurz davor steht.
Und dann? Jetzt kommt doch der eigentliche Knackpunkt...

Seis drum: der Jitter wird immer unrelevanter, je mehr Pakete du 
empfangen hast. Du musst also zum Zeitpunkt des 1. Midipakets den 
44,1kHz-Zähler auf 0 setzen, und 1000 Midipakete später musst du den auf 
1470000 Takte hochgezählt haben. Wenn nicht, dann musst du schneller 
oder langsamer zählen. Das nennt sich PLL und kann auch in Software 
gemacht werden...


Aber was ich mich frage: was ist denn dein eigentliches Problem?

von Jens (Gast)


Lesenswert?

Lothar Miller schrieb:
> Wie willst du denn bei einem solch extremen Verhältnis noch "synchron"
> werden/bleiben? Wenn dein Midi-Signal nur 1 Promille daneben liegt, hast
> du schon fast 2 Takte deine 44,1kHz signals verplempert...

richtig, das Midi Signal scheint einen entsprechend hohen Jitter zu 
beinhalten.

Lothar Miller schrieb:
> Das nennt sich PLL und kann auch in Software gemacht werden...

Das mit der PLL hab ich verstanden, man erhöht oder erniedrigt das CNT 
Register vom Timer, damit dieser wieder synchron läuft.

Nur dachte ich, dass es vielleicht noch eine andere / bessere Methode 
gibt, weil in diesem Fall ist man ja ziemlich schnell mehrere Takte 
auseinander und muss ständig den CounterWert vom Timer anpassen.

Die Jittergröße beim Midi Signal liegt bei ca. 0,4ms (in anderen Geräte 
sogar noch höher). Trotzdem gibt es prof. Geräte die diese Konvertierung 
durchführen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jens schrieb:
> Das mit der PLL hab ich verstanden, man erhöht oder erniedrigt das CNT
> Register vom Timer, damit dieser wieder synchron läuft.
Nein, man erhöht/vermindert die Geschwindigkeit, mit der der Zähler 
zählt. Das ist etwas grundlegend Anderes!

Stell dir mal vor, du fährst auf einer Autobahn (z.B. im 
Kolonnenverkehr) hinter einem Auto her. Dadurch, dass du deine 
Geschwindigkeit anpasst, verhinderst du, dass der Abstand zu groß oder 
zu klein wird. Du passt aber nich ruckartig deinen Abstand an, dass 
der wieder stimmt (geht ja auch gar nicht).

BTW: Das Problem an sich ist immer noch unbekannt...

Jens schrieb:
> Trotzdem gibt es prof. Geräte die diese Konvertierung durchführen.
Wie heißen die und was machen die?
Ich könnte mir vorstellen: Du willst letztlich einen CD-Player (o.ä.) 
auf das Midi-Signal synchronisieren.

von Falk B. (falk)


Lesenswert?

@  Jens (Gast)

>Das mit der PLL hab ich verstanden, man erhöht oder erniedrigt das CNT
>Register vom Timer, damit dieser wieder synchron läuft.

Nö, das wäre eine arg holprige PLL. Der Trick besteht darin, den Jitter 
über große Zeiten zu mitteln und den lokalen Taktgeber nur sehr langsam 
nachzuregeln. Ist aber nicht mal auf die Schnelle gemacht, PLLs mit 
einem Multiplakator von über 1000 sind keine Peanuts.

>Nur dachte ich, dass es vielleicht noch eine andere / bessere Methode
>gibt, weil in diesem Fall ist man ja ziemlich schnell mehrere Takte
>auseinander und muss ständig den CounterWert vom Timer anpassen.

Sicher, das muss man puffern, mit einem FIFO.

>sogar noch höher). Trotzdem gibt es prof. Geräte die diese Konvertierung
>durchführen.

Eben mit Köpfchen. Aber eine PLL ist nur eine Möglichkeit, es gibt auch 
noch andere mit Interpolation von Samples bzw. Weglassen.

MFG
Falk

von Jens (Gast)


Lesenswert?

Lothar Miller schrieb:
> Nein, man erhöht/vermindert die Geschwindigkeit, mit der der Zähler
> zählt. Das ist etwas grundlegend Anderes!

d.h. man liest den Counterwert vom Timer aus und wenn dieser bereits 
über den Nulldurchgang ist, dann verkleinert man den Prescalerwert vom 
Timer um eins? Momentan ist mein Prescaler 100 bei einer Clockfrequenz 
von 72MHz. Eine Verkleinerung des Prescalers um 1 stellt allerdings eine 
größere Adaption dar als wenn ich den Counterwert um 1 erhöhe.

Lothar Miller schrieb:
> BTW: Das Problem an sich ist immer noch unbekannt...
ich suche nach der richtigen Herangehensweise, wie ich den Jitter vom 
Midi Signal in den Griff bekomme, damit ich ein gültiges 44.1kHz Signal 
erhalte und dieses nicht ständig in der Frequenz variiert.

Lothar Miller schrieb:
> Du willst letztlich einen CD-Player (o.ä.)
> auf das Midi-Signal synchronisieren.

Sorry hatte ich vergessen zu erwähnen. Ich möchte meinen CD/DVD Spieler 
damit synchronisieren.

von Jens (Gast)


Lesenswert?

Falk Brunner schrieb:
> Nö, das wäre eine arg holprige PLL. Der Trick besteht darin, den Jitter
> über große Zeiten zu mitteln und den lokalen Taktgeber nur sehr langsam
> nachzuregeln. Ist aber nicht mal auf die Schnelle gemacht, PLLs mit
> einem Multiplakator von über 1000 sind keine Peanuts.

Beim Midi Time Code wird jedes zweite Frame übertragen. Die Übertragung 
einer solchen Zeitangabe geschieht mittels 4x Paketen, die alle 120Hz 
übertragen werden. D.h. ich kann die 44.1kHz Clock maximal auf diese 4x 
Pakete synchronisieren. Dazwischen hab ich keine 
Synchronisierungs-möglichkeiten.

Den Jitter kann ich lediglich zu Beginn über ein paar Sekunden 
auf-summieren und den Timer dann mit dem Mittelwert starten lassen.

von Falk B. (falk)


Lesenswert?

@  Jens (Gast)

>ich suche nach der richtigen Herangehensweise, wie ich den Jitter vom
>Midi Signal in den Griff bekomme, damit ich ein gültiges 44.1kHz Signal
>erhalte und dieses nicht ständig in der Frequenz variiert.

Das wird schwierig, vor allem wenn du audiophil bist ;-)
Denn eine PLL hat IMMER eine leicht schwankende Frequenz.

>Sorry hatte ich vergessen zu erwähnen. Ich möchte meinen CD/DVD Spieler
>damit synchronisieren.

;-)
Kauf dir einen steuerbaren passenden Quarzoszillator (VCXO), der eine 
Vielfaches von 44,1kHz erzeugt. Damit kann man so eine PLL aufbauen. 
Oder einen DDS IC, ist vielleicht etwas besser, weil volldigital.

MFG
Falk

von Jens (Gast)


Lesenswert?

Falk Brunner schrieb:
> Kauf dir einen steuerbaren passenden Quarzoszillator (VCXO), der eine
> Vielfaches von 44,1kHz erzeugt. Damit kann man so eine PLL aufbauen.
> Oder einen DDS IC, ist vielleicht etwas besser, weil volldigital.

Danke für die Hinweise.

Dieser DDS IC (AD98379 müsste ja für meine Vorhaben völlig ausreichend 
sein, wenn ich eine 5MHz Clock verwende um noch eine kleinere Abstufung 
im Frequenzbereich zu erhalten. Oder hab ich hier irgendwas wichtiges 
übersehen?

http://www.analog.com/static/imported-files/data_sheets/AD9837.PDF

Müssen am Frequenz-Ausgang VOUT keine zusätzlichen Filtermaßnahmen etc. 
ergriffen werden?

von Jens (Gast)


Lesenswert?

Unter Verwendung eines solchen DDS ICs. Ist es hier sinnvoll den Ausgang 
Vout auch zusätzlich auf einen I/O vom Mikroprozessor zu führen, damit 
man weiß beim wievielten Interrupt der DDS ICs ist?

Also wenn z.B. der Midi Time Code mit 30Hz ankommt und gewandelt werden 
soll in das 44.1kHz Signal, dann wären dass ja pro 30Hz insgesamt 1470 
Interrupts. Wenn ich mit dem Mikrocontroller weniger zähle bis das 
nächste Midi Time Code Frame ankommt kann ich die Differenz berechnen, 
daraus die Frequenz und die Frequenz im DDS IC entsprechend anpassen.

Reicht mir beim Vout Ausgangspin des DDS ICs ein normales Gatter um das 
Signal zu teilen?

von Falk B. (falk)


Lesenswert?

@  Jens (Gast)

>Dieser DDS IC (AD98379 müsste ja für meine Vorhaben völlig ausreichend
>sein, wenn ich eine 5MHz Clock verwende um noch eine kleinere Abstufung
>im Frequenzbereich zu erhalten. Oder hab ich hier irgendwas wichtiges
>übersehen?

Ja. Dass DDS bei aller Cleverness einen Jitter erzeugt. Der ist umso 
kleiner, je höher der Takt der DDS ist. Für dein 44,1k Hz, die ja 
Audioqualität erzeugen sollen, würde ich 25-50MHz empfehlen.

>http://www.analog.com/static/imported-files/data_s...

Naja, vielleicht reicht die 16 MHz Version. Muss man mal testen.

>Müssen am Frequenz-Ausgang VOUT keine zusätzlichen Filtermaßnahmen etc.
>ergriffen werden?

Doch. Dort muss ein guter Filter dran, wenogsten zweipolig. Dahinter 
kommt ein Komparator, der aus dem gefilterten Sinus ein sauberes 
Rechteck macht.

>Unter Verwendung eines solchen DDS ICs. Ist es hier sinnvoll den Ausgang
>Vout auch zusätzlich auf einen I/O vom Mikroprozessor zu führen, damit
>man weiß beim wievielten Interrupt der DDS ICs ist?

;-)
Der DDS macht keine Interrupts. Aber ein Rückfühung braucht man in der 
Tat, den eine PLL ist ja schließlich eine phase locked loop, aka 
Phasenregelkreis. Sprich, dein 44,1kHz Signal muss nochmal 1470:1 
geteilt werden und dann mit deinen 30Hz Midisignal verglichen werden 
(Pahsenkomparator).

>Also wenn z.B. der Midi Time Code mit 30Hz ankommt und gewandelt werden
>soll in das 44.1kHz Signal, dann wären dass ja pro 30Hz insgesamt 1470
>Interrupts. Wenn ich mit dem Mikrocontroller weniger zähle bis das
>nächste Midi Time Code Frame ankommt kann ich die Differenz berechnen,
>daraus die Frequenz und die Frequenz im DDS IC entsprechend anpassen.

Jain, man muss aus der Fehlerinformation auf einen PI-Regler gehen, der 
reglet dann den DDS nach. Und wenn alles richtg dimensioniert ist auch 
stabil ohne Schwingen.

>Reicht mir beim Vout Ausgangspin des DDS ICs ein normales Gatter um das
>Signal zu teilen?

Nein, siehe oben.

MFG
Falk

von Jens (Gast)


Lesenswert?

Falk Brunner schrieb:
> Der DDS macht keine Interrupts. Aber ein Rückfühung braucht man in der
> Tat, den eine PLL ist ja schließlich eine phase locked loop, aka
> Phasenregelkreis. Sprich, dein 44,1kHz Signal muss nochmal 1470:1
> geteilt werden und dann mit deinen 30Hz Midisignal verglichen werden
> (Pahsenkomparator).

Vergleichen kann ich ja die beiden Signale selbst nur schwer. Das 
Audiosignal ist ein 44.1kHz Clocksignal, aber das Midi Signal überträgt 
ja einen Time Code - also eine Zeitinformation verpackt im Midi 
Datenformat. Das entspricht keinem reinen 30Hz Clocksignal.

Zum Beispiel beginnt die Übertragung der Zeitinformation mit folgendem 
Paket:
0xF0 0xXX 0x01 0x01 0xhh 0xmm 0xss 0xff 0xF7
- 0xhh ist die Stundeninformation
- 0xmm die Minuteninformation
- 0xss die Sekundeninformation
- 0xff die Frameinformation

Anschließend werden jeweils 4x Pakete mit einer Frequenz von 120Hz 
übertragen, die nur einen Teil der Zeitinformation beinhalten

- erstes Midi Paket:  0xF1 0x0f   (Frames: units Information)
- zweites Midi Paket  0xF1 0x1f   (Frames: Tens Information)
- drittes Midi Paket: 0xF1 0x2s   (Sekunden: Units Information)
usw.

Nach meiner Auffassung kann ich die beiden Signal bzw. die 
Zeitinformation lediglich im Mikrocontroller überprüfen oder? Man könnte 
das Vout Signal vom DDS IC runterbrechen von 44.1kHz auf die 30Hz oder 
120Hz und dieses dann dem µC zuführen. Unter welchem Namen findet man 
solche ICs, die ein Clocksignal entsprechend teilen?

von Falk B. (falk)


Lesenswert?

@  Jens (Gast)

>120Hz und dieses dann dem µC zuführen. Unter welchem Namen findet man
>solche ICs, die ein Clocksignal entsprechend teilen?

Teiler oder Zähler. Hat dein Mikrocontroller schon eingebaut.

MFG
Falk

von Jobst M. (jobstens-de)


Lesenswert?

Ich würde einmal einen Timer ca. 44100Hz erzeugen lassen. Diese würden 
eine Variable (A) bis 1470 hochzählen. Bei Überlauf (also 1470) würde 
ich eine weitere Variable (B) hochzählen.
Auch durch die 30Hz Midi-Clock würde ich eine Variable (C) hochzählen.

Bei Inkrementierung von C würde ich C und B vergleichen. Dabei wird auf 
A geschaut, um zu sehen, wie groß die Differenz ist. Bewegt sie sich in 
einem Gewissen Fenster, wird gar nichts gemacht. Weicht die Differenz 
darüber hinaus ab, wird der Timer nachgeregelt. Je weiter vom Fenster 
entfernt, um so härter.

Wenn einer der beiden Zähler B oder C überläuft, wird von beiden 128 
abgezogen. So kann man beide Zähler immer vergleichen.


Gruß

Jobst

von Jens (Gast)


Lesenswert?

Jobst M. schrieb:
> Ich würde einmal einen Timer ca. 44100Hz erzeugen lassen.

Dieser Timer müsste ja synchron laufen zum generierten 44.1kHz Signal 
des DDS ICs, was bedeutet, dass das Vout Signal vom DDS IC über einen 
Input Capture Timer erfasst wird.

von Falk B. (falk)


Lesenswert?

@  Jens (Gast)

>> Ich würde einmal einen Timer ca. 44100Hz erzeugen lassen.

>Dieser Timer müsste ja synchron laufen zum generierten 44.1kHz Signal
>des DDS ICs,

Nö, es wäre der Ersatz des DDS.

von Jens (Gast)


Lesenswert?

und wenn ich einen DDS IC verwenden würde (muss hier eine Verbindung 
zwischen Vout des DDS ICs und einem I/O vom µC bestehen)? Das hatte ich 
zuvor noch nicht ganz verstanden, weil das Midi Signal ja kein reines 
Clocksignal ist.

von Falk B. (falk)


Lesenswert?

@  Jens (Gast)

>und wenn ich einen DDS IC verwenden würde (muss hier eine Verbindung
>zwischen Vout des DDS ICs und einem I/O vom µC bestehen)?

Bist du auch lernresistent? Hast du die Postings mal IN RUHE gelesen? 
Und dich mal zur den Grundlagen einer PLL belesen?

NEIN!

Also nachholen!

>Das hatte ich
>zuvor noch nicht ganz verstanden, weil das Midi Signal ja kein reines
>Clocksignal ist.

Sicher, aber es gibt mit der Frequenz von 30 Hz ein Ereignis in deinem 
uC, das ist dein 30 Hz Referenztakt.

von Jens (Gast)


Lesenswert?

Falk Brunner schrieb:
> Sicher, aber es gibt mit der Frequenz von 30 Hz ein Ereignis in deinem
> uC, das ist dein 30 Hz Referenztakt.

ah ok, ich gebe diesen Referenztakt als Signal an einem I/O vom µC 
aus.... danke für diesen Denktanstoß.

von Jobst M. (jobstens-de)


Lesenswert?

1
*läuft schreiend davon*

von Michael (Gast)


Lesenswert?

Warum nicht einfach den DDS Takt auf einen externen Zähleingang des uC. 
Bei jedem Timecode von MIDI einen Interrupt auslösen lassen der den 
Zählerstand ausliest. Dann überprüfen ob der DDS Takt zu langsam oder zu 
schnell ist und endsprechend korregieren.

Mfg

Michael

von Falk B. (falk)


Lesenswert?

@  Michael (Gast)

>Warum nicht einfach den DDS Takt auf einen externen Zähleingang des uC.
>Bei jedem Timecode von MIDI einen Interrupt auslösen lassen der den
>Zählerstand ausliest. Dann überprüfen ob der DDS Takt zu langsam oder zu
>schnell ist und endsprechend korregieren.

So in der Richtung.

von Jens (Gast)


Lesenswert?

Michael schrieb:
> Warum nicht einfach den DDS Takt auf einen externen Zähleingang des uC.

Das meinte ich ja zuvor. Das 44.1kHz Clocksignal (Vout) vom DDS IC an 
einen I/O von meinem µC zurückführen, damit ich das mit meinem 30Hz Midi 
Signal im µC vergleichen kann. Sind Frequenz-Anpassungen zu machen würde 
ich diese dann über die SPI Verbindung zum DDS IC durchführen. Ist 
lediglich die Frage ob diese Anpassung der Frequenz auch schnell genug 
erfolgen kann.

von Michael (Gast)


Lesenswert?

Du magst ja gar nicht schnell die Frequenz verstellen. Und alle 30Hz 
schaft der SPI Bus allemal. Öfters hast du auch keine 
Timinginformationen. Zum Regeln würde ich die benötige Frequenz nur 
einmal aus einer Zeitmessung beim MIDI Signal bestimmen diese bei der 
DDS einstellen. Danach würde ich alle 30Hz die Freqenz nur noch um ein 
LSB hoch oder runterstellen.

Mfg

Michael

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.