Forum: Mikrocontroller und Digitale Elektronik Frage zum Phasenakkumulator beim DDS


von Ali K. (teddy50)


Lesenswert?

Hallo,
ich habe eine Frage.

Mit der Schrittweite beim Phasenakkumulator kann ich die 
Ausgangsfrequenz erhöhen, weil ja um 2Pi "schneller" umrundet wird.
Zum Beispiel für eine doppelte Frequenz gebe ich jeden 2. Wert aus.

Wie gehe ich vor, wenn ich die Frequenz zb halbieren will?
Gebe ich dafür dann 2x den selben Wert aus oder reduziere ich fclk um 
Faktor 2?

Viele Grüße

von Falk B. (falk)


Lesenswert?

Ali K. schrieb:
> Hallo,
> ich habe eine Frage.
>
> Mit der Schrittweite beim Phasenakkumulator kann ich die
> Ausgangsfrequenz erhöhen, weil ja um 2Pi "schneller" umrundet wird.
> Zum Beispiel für eine doppelte Frequenz gebe ich jeden 2. Wert aus.
>
> Wie gehe ich vor, wenn ich die Frequenz zb halbieren will?

Wirklich?

> Gebe ich dafür dann 2x den selben Wert aus

So in etwa.

> oder reduziere ich fclk um
> Faktor 2?

Nö, die ist konstant.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Ali K. schrieb:

> Mit der Schrittweite beim Phasenakkumulator kann ich die
> Ausgangsfrequenz erhöhen, weil ja um 2Pi "schneller" umrundet wird.

Ja.

> Zum Beispiel für eine doppelte Frequenz gebe ich jeden 2. Wert aus.

Ja. Dafür braucht man aber keinen Phasenakku. Den braucht man nur, wenn 
die Verhältnisse nicht-ganzzahlig sind.

> Wie gehe ich vor, wenn ich die Frequenz zb halbieren will?

Dann braucht man immer noch keinen Phasenakku. Halbieren bedeutet: 
Frequenzverhältnis 2:1. Das ist immer noch was ganzzahliges. Also kein 
Phasenfehler möglich. Also kein Phasenakku nötig.

Der ganze Sinn eines Phasenakkus ist nämlich, die fraktionalen Teile 
möglichst gut zu berücksichtigen und ggf. durch einen zusätzlichen oder 
weggelassenen Ganzzahl-Schritt zu "kompensieren".

So lange die Freqenzverhältnisse ganzzahlig sind, braucht man einfach 
keinen Phasenakku.

von Ali K. (teddy50)


Lesenswert?

Ob S. schrieb:
> Ali K. schrieb:
>> Mit der Schrittweite beim Phasenakkumulator kann ich die
>> Ausgangsfrequenz erhöhen, weil ja um 2Pi "schneller" umrundet wird.
>
> Ja.
>> Zum Beispiel für eine doppelte Frequenz gebe ich jeden 2. Wert aus.
>
> Ja. Dafür braucht man aber keinen Phasenakku. Den braucht man nur, wenn
> die Verhältnisse nicht-ganzzahlig sind.
>> Wie gehe ich vor, wenn ich die Frequenz zb halbieren will?
>
> Dann braucht man immer noch keinen Phasenakku. Halbieren bedeutet:
> Frequenzverhältnis 2:1. Das ist immer noch was ganzzahliges. Also kein
> Phasenfehler möglich. Also kein Phasenakku nötig.
> Der ganze Sinn eines Phasenakkus ist nämlich, die fraktionalen Teile
> möglichst gut zu berücksichtigen und ggf. durch einen zusätzlichen oder
> weggelassenen Ganzzahl-Schritt zu "kompensieren".
> So lange die Freqenzverhältnisse ganzzahlig sind, braucht man einfach
> keinen Phasenakku.

Kannst du mir das mit den fraktionalen Teilen erklären und wie man das 
umsetzen könnte?
Ich finde dazu nichts Online.
Alle Quellen die ich bisher gelesen habe beschäftigen sich nicht mit 
fraktionalen Teilen.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Ali K. schrieb:
>> So lange die Freqenzverhältnisse ganzzahlig sind, braucht man einfach
>> keinen Phasenakku.
>
> Kannst du mir das mit den fraktionalen Teilen erklären und wie man das
> umsetzen könnte?
> Ich finde dazu nichts Online.

Bist du blind oder ein Troll? DDS macht das alles schon für dich!

Im Ultraschnelldurchlauf.

DDS ohne fraktionalen Anteil, nur Integer (Ganzzahl)

Stell dir einen 8 Bit Akku vor. Dieser "füttert" einen Dekoder 
(Tabelle), welche aus der Phase einen Sinuswert macht, ebenfalls mit 8 
Bit Auflösung, nur halt bipolar mit -127 bis +127. Ein DAC + Filter 
macht daraus ein Analogsignal.
Das Frequenzeinstellwort (englisch frequency tuning word, FTW) legt die 
Schrittweite des Phasenakkus fest. Kleinster Wert ist 1.
Wenn die DDS mit 1 MHz taktet, dauert es bei FTW=1 256 Takte für einen 
vollen Umlauf des Phasenakkus. Die Ausgangsfrequenz ist 1 MHz / 256 = 
3,90625 kHz. Erhöht man FTW auf 2, dauert es nur noch 128 Takt, die 
Ausgangsfrequenz verdoppelt sich auf 7,8125kHz. Dabei wird nur jeser 2. 
Wert der Sinustabelle ausgegeben. Das reicht aber für eine 
Rekonstruktion des Sinuswertes, den Rest glättet (interpoliert) der 
Ausgangsfilter.
Nun kann man FTW auf jeden beliebeigen Wert zwischen 1 und 128 setzen, 
entsprechend schneller wird die Tabelle durchlaufen, trotz konstantem 
Takt von 1 MHz. Die meisten Werte für FTW sind KEIN ganzzahliger Teiler 
des 8 Bit (256) Akkus, d.h. nach einem vollen Umlauf geht es nicht bei 0 
wieder los, sondern bei einem anderen Wert. Beim nächsten Durchlauf ist 
der auch wieder anders! Das geht ne ganze Weile, irgendwann ist es dann 
wieder 0 und der Makrozyklus beginnt erneut.

Und jetzt die allgemeine DDS mit fraktionalem Anteil.

Dazu wird der Akku und das FTW auf 16 Bit erweitert. Die oberen 8 Bit 
des Akkus füttern immer noch die Tabelle und DAC, die unteren werden nur 
im Akku benutzt. Wenn man nun den kleinsten Wert 1 für FTW einstellt, 
dauert es 256 Takte, bis das Bit #8 seinen Wert ändert. Das ist das 
unterste Bit an der Sinustabelle. Und es dauert 256*256 = 65536 Takte, 
bis der Phasenakku einmal komplett einen Zyklus durchlaufen hat. Durch 
die "ungenutzen" Bits im Phasenakku, welche NICHT ind er Sinustabelle 
genutzt werden, kann man die Schrittweite verkleinern und damit die 
Frequenzauflösung der DDS erhöhen.

Beitrag "Re: SPWM auf Atmega8, bitte um Feedback hinsichtlich Optimierung"

von Veit D. (devil-elec)


Lesenswert?

Hallo,

üblicherweise durchläuft man eine vorberechnete Tabelle, bspw. für einen 
Sinus. Damit wird am Ende ein Compare Wert für einen Timer gefüttert. 
Stützstellen genannt. Will man die Frequenz des DDS Signales ändern, hat 
man 2 Möglichkeiten. Grobe Änderungen könnten mit der Sprungweite vom 
Index der Tabelle gemacht werden. Sprich das Phasendelta und damit dem 
Phasenakku. Man nimmt bspw. nicht jeden Wert der Tabelle sondern nur 
jeden 2. Wert der Tabelle. Oder jeden 3. Wert usw. Damit wird die DDS 
Frequenz höher.
Oder man ändert die Frequenz vom Timer. Das wäre die Feinjustage.
Je nach Frequenz und Rechenzeit muss man ggf. beides anpassen.

https://www.mikrocontroller.net/articles/DDS

von Falk B. (falk)


Lesenswert?

Veit D. schrieb:
> üblicherweise durchläuft man eine vorberechnete Tabelle, bspw. für einen
> Sinus. Damit wird am Ende ein Compare Wert für einen Timer gefüttert.
> Stützstellen genannt.

Du verwirrst mehr, als du erklärst. Wie der DAC am Ende der Kette 
arbeitet, ist für das Verständnis von DDS egal.

> Will man die Frequenz des DDS Signales ändern, hat
> man 2 Möglichkeiten.

Nö, nur eine.

> Grobe Änderungen könnten mit der Sprungweite vom
> Index der Tabelle gemacht werden.

Falsch. Damit macht man die kleinen Änderungen. Und auch die großen.

> Sprich das Phasendelta und damit dem
> Phasenakku. Man nimmt bspw. nicht jeden Wert der Tabelle sondern nur
> jeden 2. Wert der Tabelle. Oder jeden 3. Wert usw. Damit wird die DDS
> Frequenz höher.

> Oder man ändert die Frequenz vom Timer. Das wäre die Feinjustage.

Nö. Der Takt der DDS ist praktisch immer konstant, auch wenn man 
natürlich einen DDS-IC mit verschiedenen Takten betreiben kann. Und dein 
Timer hier ist der DA-Wandler, der mittels PWM den Analowert 
erzeugen soll. dessen Frequenz hat nahezu gar nichts mit der 
Ausgangsfrequenz der DDS zu tun.

> Je nach Frequenz und Rechenzeit muss man ggf. beides anpassen.

Du geht von einer Softwarelösung aus. Das ist aber eher nur eine, eher 
langsame und niederfrequente Variante einer DDS. Die meisten laufen 
rattenschnell in Hardware!

von Mark S. (voltwide)


Lesenswert?

Ali K. schrieb:
> Mit der Schrittweite beim Phasenakkumulator

Damit ist doch bereits alles gesagt. Die Schrittweite - aka der 
Phasensprung - ist proportional zur Ausgabefrequenz. Für doppelte 
Ausgangsfrequenz brauchst Du also doppelte Schrittweite - und dazwischen 
kannst du linear noch feiner abstufen. All dies funktioniert bei 
konstanter Abtastfrequenz. Ist das denn so schwer?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ali K. schrieb:
> Alle Quellen die ich bisher gelesen habe beschäftigen sich nicht mit
> fraktionalen Teilen.

Aus gutem Grund. Vergiss deswegen das "fraktional" im Zusammenhang mit
DDS einfach.

Bei einem DDS gibt es zwei wichtige Frequenzen, Die Taktfrequenz f_clk
und die Frequenzauflösung f₀ = f_clk / 2ⁿ, wobei n die Bitbreite des
Phasenakkumulators ist. Die mit dem DDS erzeugbaren Frequenzen f_out
sind ganzzahlige Vielfache von f₀, d.h.

  f_out = k · f₀   (k ∈ ℕ, 1 ≤ k < 2ⁿ⁻¹)

Zur Erzeugung der gewünschten Ausgangsfrequenz wird in jedem Taktzyklus
der Phasenakkumulatorregister um k erhöht (mod 2ⁿ). Die Tabelle mit der
Schwingungsform hat die Größe m ≤ n und wird über die m höchstwertigen
Bits des Phasenakkumulatorregisters adressiert, so dass mit jedem
vollständigen Durchlauf des Phasenakkumulatorregisters auch die Tabelle
genau einmal durchlaufen wird. Die jeweils adressierten Einträge der
Tabelle werden schließlich dem DAC zugeführt.

Dass je nach vorgewählter Ausgangsfrequenz Tabellenwerte übersprungen
oder mehrfach ausgegeben werden, ergibt sich aus den beschriebenen
Prinzip ganz automatisch.

Das ist alles, was man wissen muss, und das Wort "fraktional" taucht in
dieser Erklärung an keiner Stelle auf.

: Bearbeitet durch Moderator
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Yalu X. schrieb:

> Ali K. schrieb:
>> Alle Quellen die ich bisher gelesen habe beschäftigen sich nicht mit
>> fraktionalen Teilen.
>
> Aus gutem Grund. Vergiss deswegen das "fraktional" im Zusammenhang mit
> DDS einfach.

LOL.

> Bei einem DDS gibt es zwei wichtige Frequenzen, Die Taktfrequenz f_clk
> und die Frequenzauflösung f₀ = f_clk / 2ⁿ, wobei n die Bitbreite des
> Phasenakkumulators ist. Die mit dem DDS erzeugbaren Frequenzen f_out
> sind ganzzahlige Vielfache von f₀, d.h.
>
>   f_out = k · f₀   (k ∈ ℕ, 1 ≤ k < 2ⁿ⁻¹)

Richtig. Blöd nur, wenn die Zielfrequenz halt gerade kein ganzzahliges 
Vielfaches von f0 ist. Was übrigens der Regelfall ist. Inbesondere dann, 
wenn es nicht nur um Trivialitäten wie die Darstellung einer diskreten 
Frequenz geht...

Wie du vermutlich sowieso nur zu allzugut weisst...

Manchmal fragt man sich, wo die echten Trolle sitzen...

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Ob S. schrieb:

> Richtig. Blöd nur, wenn die Zielfrequenz halt gerade kein ganzzahliges
> Vielfaches von f0 ist. Was übrigens der Regelfall ist. Inbesondere dann,
> wenn es nicht nur um Trivialitäten wie die Darstellung einer diskreten
> Frequenz geht...

Natürlich: und man f0 nicht beliebig hoch wählen kann. Wegen der 
normativen Kraft des Faktischen, also der verfügbaren Hardware...

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ob S. schrieb:
> Richtig. Blöd nur, wenn die Zielfrequenz halt gerade kein ganzzahliges
> Vielfaches von f0 ist.

Bei meinem Billigfunktionsgenerator ist f₀ = 250MHz / 2⁴⁸ ≈ 0,89 µHz.
Wenn ich damit ein 1MHz-Signal erzeugen will, bekomme ich stattdessen
1,000000000000334MHz (bei perfekt genauem f_clk). Damit kann ich aber
gerade noch so leben, zumal der Quarzoszillator des DDS vermutlich um
viele Größenordnungen ungenauer ist.

von Ali K. (teddy50)


Lesenswert?

Yalu X. schrieb:
> Ali K. schrieb:
>> Alle Quellen die ich bisher gelesen habe beschäftigen sich nicht mit
>> fraktionalen Teilen.
>
> Aus gutem Grund. Vergiss deswegen das "fraktional" im Zusammenhang mit
> DDS einfach.
>
> Bei einem DDS gibt es zwei wichtige Frequenzen, Die Taktfrequenz f_clk
> und die Frequenzauflösung f₀ = f_clk / 2ⁿ, wobei n die Bitbreite des
> Phasenakkumulators ist. Die mit dem DDS erzeugbaren Frequenzen f_out
> sind ganzzahlige Vielfache von f₀, d.h.
>
>   f_out = k · f₀   (k ∈ ℕ, 1 ≤ k < 2ⁿ⁻¹)
>
> Zur Erzeugung der gewünschten Ausgangsfrequenz wird in jedem Taktzyklus
> der Phasenakkumulatorregister um k erhöht (mod 2ⁿ). Die Tabelle mit der
> Schwingungsform hat die Größe m ≤ n und wird über die m höchstwertigen
> Bits des Phasenakkumulatorregisters adressiert, so dass mit jedem
> vollständigen Durchlauf des Phasenakkumulatorregisters auch die Tabelle
> genau einmal durchlaufen wird. Die jeweils adressierten Einträge der
> Tabelle werden schließlich dem DAC zugeführt.
>
> Dass je nach vorgewählter Ausgangsfrequenz Tabellenwerte übersprungen
> oder mehrfach ausgegeben werden, ergibt sich aus den beschriebenen
> Prinzip ganz automatisch.
>
> Das ist alles, was man wissen muss, und das Wort "fraktional" taucht in
> dieser Erklärung an keiner Stelle auf.

Hey danke für die Erklärung.
Das ist natürlich easy.

Wenn ich aber die Frequenz z.B. halbieren will, kann der 
Phasenakkumulatorregister erst nach jedem 2. Taktzyklus erhöht werden?
Wäre das eine gängige Vorgehensweise?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ali K. schrieb:
> Wenn ich aber die Frequenz z.B. halbieren will,

Welche Frequenz möchtest du halbieren? Das DDS ist kein Frequenzteiler.
Du gibst eine absolute Frequenz vor, und das DDS versucht, diese im
Rahmen seiner hardwaretechnischen Möglichkeiten bestmöglich umzusetzen.

> kann der Phasenakkumulatorregister erst nach jedem 2. Taktzyklus
> erhöht werden? Wäre das eine gängige Vorgehensweise?

Nein, das Phasenakkumulatorregister wird in jedem Taktzyklus um den Wert
de Frequenzsteuerworts, also um mindestens 1 erhöht.

Wenn die Schwingungsformtabelle aber kleiner als der Wertebereich des
Phasenakkumulators ist (was üblicherweise der Fall ist), d.h. wenn nicht
alle Bits des Phasenakkumulatorregisters zur Adressierung der Tabelle
genutzt werden, dann führt nicht jede Erhöhung notwendigerweise zu einer
Änderung der Tabellenadresse. Deswegen kann derselbe Ausgangswert über
mehrere Zyklen unverändert stehenbleiben.

: Bearbeitet durch Moderator
von Rainer W. (rawi)


Lesenswert?

Ali K. schrieb:
> Wenn ich aber die Frequenz z.B. halbieren will, kann der
> Phasenakkumulatorregister erst nach jedem 2. Taktzyklus erhöht werden?
> Wäre das eine gängige Vorgehensweise?

Um die Frequenz zu halbieren, erhöhst du den Phasenakkumulator bei jedem 
Schritt nur um den halben Winkel.

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Rainer W. schrieb:
> Schritt nur um den halben Winkel.
und damit das richtig funktioniert, muss man sicherstellen, dass dieses 
"hlabieren" trotzdem zu einem Ganzzahlschritt führt, was nach sich 
zieht, die Tabelle ausreichend lang zu machen. Auch oben raus kommt man 
schnell an Probleme, wenn die Frequenz sich dahin bewegt, dass man nur 
noch wenige Punkte verwendet.

Irgendwann ist das Prinzip erschöpft und man muss über Dithern und 
Interpolation nachdenken.
http://www.96khz.org/oldpages/soundsynthesiswithdds.htm

: Bearbeitet durch User
von Purzel H. (hacky)


Lesenswert?

Die Tabelle wird halt so gross wie sie sein soll. Der AD9854 zB hat 
12bit DACs, die Phasenregister sind 48 bit. Das ergibt dann eine 
Frequenzaufloesung von 1 uHz, bei 300MHz. Es gibt auch Teile mit hoeher 
amplitudenaufgeloesten DACs, mit 14, resp 16 bits.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Purzel H. schrieb:
> Die Tabelle wird halt so gross wie sie sein soll.

Ach was?

> Der AD9854 zB hat
> 12bit DACs, die Phasenregister sind 48 bit.

Aha! Und was sagt und das? Daß das Phasenregister meistens DEUTLICH 
breiter als der Eingang des Sinusdekoders ist!

> Das ergibt dann eine
> Frequenzaufloesung von 1 uHz, bei 300MHz. Es gibt auch Teile mit hoeher
> amplitudenaufgeloesten DACs, mit 14, resp 16 bits.

Welche denn? Oberhalb von 12 Bits wird die Luft eher dünn, einen 16 Bit 
DAC hab in in einem DDS-IC bisher nicht gesehen. Der FY6900 hat 
einen 14 Bit DAC drin.

von Purzel H. (hacky)


Lesenswert?

Der AD9102 hat 14bit mit 180 MSample. Der AD9164 hat scheint's 16 bit 
mit 12 GSample, allerdings nur update rate. Dafuer Baseband DC - 2.5 
GHz. Dieser 169 pin BGA soll sogar schon erhaeltlich sein fuer 600$ bei 
Analog selbst und bei digikey
Der AD9174 hat 2x16 bit @ 12Gsample, der AD9177 hat 4x16bit @ 12 GSample

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Purzel H. schrieb:
> Der AD9102 hat 14bit mit 180 MSample. Der AD9164 hat scheint's 16 bit
> mit 12 GSample,

Ein Wahnsinn! Ein 16 Bit DAC mit 12 GSPS!

von Walter T. (nicolas)


Lesenswert?

Kennt jemand von euch guten allgemeinen Lesestoff zu dem Thema?

von Falk B. (falk)


Lesenswert?

Walter T. schrieb:
> Kennt jemand von euch guten allgemeinen Lesestoff zu dem Thema?

Das uralte Dokument zu den Grundlagen von DDS von Analog ist immer noch 
aktuell, denn die Grundlagen haben sich nicht geändert.

Den Link findet man im Artikel DDS.

http://www.analog.com/static/imported-files/tutorials/450968421DDS_Tutorial_rev12-2-99.pdf

von Walter T. (nicolas)


Lesenswert?

Danke, das sieht wirklich gut aus. Genau der richtige Stoff für einen 
oder mehrere Abende am Kamin mit einem Glas Rotwein.

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.