Ich verwende einen NCO, um Frequenzen zwischen 10 und 30 MHz
herzustellen. Die Taktfrequenz des FPGA liegt bei 100 MHz. Jetzt ist es
js so, dass der NCO für Frequenzen von z.B. 29 MHz nicht mit den 100
harmoniert. Der Phasenakku wird dann um einen "krummen" Wert
fortgeschrieben.
Je nach Rundung bekomme ich damit eine z.B. etwas zu kleine Frequenz,
was dazu führt, dass die Phase vom Ideal wegläuft.
Frage: Wird das irgendwie ausgeglichen?
Oder muss ich das per Hand machen, durch z.B: reset?
Gisbert schrieb:> Je nach Rundung bekomme ich damit eine z.B. etwas zu kleine Frequenz,> was dazu führt, dass die Phase vom Ideal wegläuft.
Richtig.
Deine Frequenzauflösung wird durch die Bitbreite des Akkus vorgegeben:
1
F_step = F_sampling / ( 2**akku_width)
Bei 100 MHz und z.B. 8 Bit kannst Du nur Schritte von 390.625 kHz
einstellen.
> Frage: Wird das irgendwie ausgeglichen?
Nein.
> Oder muss ich das per Hand machen, durch z.B: reset?
Damit hast Du einen Frequenzsprung (und möglicherweise auch einen
Phasensprung).
Wie genau ist denn Deine Taktquelle?
Und warum brauchst Du eine so genaue Frequenz?
Bei Funksystemen muß man z.B. damit rechnen das die Frequenz der
Gegenstelle abweicht. (Doppler-Effekt, andere Temperatur etc. pp)
Duke
>> Oder muss ich das per Hand machen,>Damit hast Du einen Frequenzsprung
Somit wäre aber die Phase zumindest für eine gewisse Zeit in dem
gewünschten range zu halten.
Um solche Effekte bei Spüngen zu mindern, kann man in digitalen
Analog-Systemen (und solchen die beanspruchen, sowas zu sein :-) ein
künstliches Phasenrauschen aufsetzen und Filtern. Damit "verteilt" sich
der Sprung.
Ein NCO hat eigentlich keinen solchen Phasensprung. Selbst wenn ich die
29 MHz mit einem Takt von "nur" 30 MHz erzeuge, dann addiere ich immer
einen bestimmten Wert, und nur die Breite des Akkumulators legt die
Phasenabweichung fest, bzw. die Breite der anschließenden D/A-Wandlung.
Das geht (fast) mit beliebiger Präzision. Phasensprünge werden zur
Modulation des NCO verwendet, abrupte Sprünge geben PSK, ein +-Offset
erzeugt FM, eine binäre Multiplikation des Akkumulators erzeugt AM, und
so fort......
Aber es gibt doch ein Ganzzahlprolem!(?) Der Akku wird mit einem Wert
addiert, der dazu führt, das nach der Zahl der Takte/Sekunde zu einem
kompletten Akkuüberlauf führt. Wenn aber die gwünschte Freuquenz nicht
ganzzahlig zur Taktfrequenz üpasst, geht es nicht ganz genau.
Der Akkuüberlauf ist nur der Wert, der 360 Grad Phase entspricht, und
wird einmal pro Periode erreicht.
Der Trick: Der Akkumulator läuft nicht immer wieder bei Null los.
Das sind zwei unterschiedliche Dinge:
1) Phasenrauschen:
Der Sinuswert wird von einem hochgenauen Akku abgenommen und ist
aufgrund der Rundung in der Phase ungenau. Folglich ist der Wert
ungenau. Im Mittel stellt sich ein Phasenrauschen um eine Periode ein,
die exakt der Akkumulatorperiode entspricht.
2) Frequenz:
Der Akku selbst ist nicht beliebig gross und der "Hinzuzählwert" der ja
die Frequenz bestimmt, unterliegt auch einer Rundung. Die reale Frequenz
ergibt sich zu f= Akkugroesse / (Taktfrequenz * Schrittweite).
Wenn diese Zahlen nicht optimal zusammenpassen, kommt man zu einer
gerundeten = falschen Frequenz!
Ein wichtiger Punkt ist auch die Dimensionierung von Akku gegen
Tabellengrösse.
Einen Phasensprung in dem Sinn gibt es nicht, aber eine flasche
Frequenz. Das ist u.U, schwerwiegender. Es ist daruf zu achten, dass der
Akumulator genügend gross und die Auflösung fein genug ist.
Bei der Grafik wird der Akku auf 11 Bit gekürzt, was bei dem grossen
Akku bei 96kHz reicht, trotzdem stimmt die Frequenz noch nicht gut
genug. Wenn man die Abtastfreuquenz erhöht, um mehr Bandbreite zu
bekommen, muss der Akku quadratisch wachsen, weil sonst der
Schrittfaktor nicht genau eingestellt werden kann.
Was spräche gegen einen größeren Akkumulator? Soviel mehr Platz braucht
der nicht. Ich weiss nicht auswendig, was der Core so kann, aber da
solte genug Reserve drin sein.