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.
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?
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.
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.
@ 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
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.
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.
@ 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
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?
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?
@ 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
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?
@ 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
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
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.
@ 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.
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.
@ 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.
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ß.
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
@ 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.
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.
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