Hallo,
ich beschäftige mich grade mit dem Thema DDS.
Nun habe ich dazu eine Frage.
Also, der Phase Accumulator ist ja, soweit ich das verstanden habe,
nichts anderes als ein Zähler, der die Adressen für das Phase ROM
erzeugt. Richtig?
Und das Frequency Tuning Word ist nichts anderes, als der Wert, um den
der Phase Accumulator mit jedem Takt erhöht wird. Stimmt das auch?
Nun habe ich bereits gelesen, dass bei besseren Geräten bis zu 48 Bit
breite Phase Accumulatoren verwendet werden. Dazu muss ja der Speicher,
wo dann die Waveform abgelegt ist (also das ROM) eine Grösse von mehr
als 4 Gigabyte haben! Und das auch nur, wenn die Signalform mit 8
BitGenauigkeit gespeichert wird. Meist hat man ja aber 10..14 Bits, also
wird noch mehr Speicher gebraucht!
Meine Frage heirzu ist jetzt: Wie wird das denn da gelöst? Wenn ich
einen Funktionsgenerator bauen will, kann ich ja da wohl kaum ein Flash
einbauen mit 4G Speicher.
@ Eckhard Meier (Gast)
>nichts anderes als ein Zähler, der die Adressen für das Phase ROM>erzeugt. Richtig?
Ja.
>Und das Frequency Tuning Word ist nichts anderes, als der Wert, um den>der Phase Accumulator mit jedem Takt erhöht wird. Stimmt das auch?
Ja.
>wo dann die Waveform abgelegt ist (also das ROM) eine Grösse von mehr>als 4 Gigabyte haben!
Das wären "nur" 32 Bit.
>Meine Frage heirzu ist jetzt: Wie wird das denn da gelöst?
Man nimmt vom Phasenakkumulator nur die oberen 10..16 Bits. Dadurch hat
man immer noch eine sehr hohe Frequenzauflösung.
>einen Funktionsgenerator bauen will, kann ich ja da wohl kaum ein Flash>einbauen mit 4G Speicher.
Klar, kostet doch nur noch ein paar Euro ;-)
MFG
Falk
Hallo Falk,
neee, das mit dem 4G Flash vergessen wir besser wieder ;-)
Wie viele Bits sollte man mindestens nehmen vom Phasenakku?
Und was bietet das für einen Vorteil? Man könnte dann ja direkt einen
langsameren Zähler nehmen.
Dann:
Wie stellt man die Amplitude des Ausgangssignals sinnvoll ein? Dazu
müsste man ja jeden Amplitudenwert, den man aus dem ROM gelesen hat, mit
einem bestimmten Faktor multiplizieren (oder dividieren). Das gibt ja
nen grossen Rechenaufwand. Wie wird das tatsächlich realisiert?
Und, eine letzte Frage:
Wie viele Punkte sollte man für eine ganze Periode ungefähr mindestens
haben, um einen guten Sinus erzeugen zu können? Reichen wohl 256 Punkte,
oder geht es sogar mit noch weniger?
Für einen DDS-Sinus sollte in der Tabelle kein Sprung >1
vorkommen um die Auflösung optimal auszunutzen.
Die Tabellengröße in Abhängigkeit der Auflösung des DA-Wandlers
kann man einfach Berechnen.
Bei 8 Bit währen das 804.
Da man jedoch die Tabelle auch in 2^n anlegt sind es 1024 Einträge.
Mehr Einträge bringen nichts.
avr
Eckhard Meier schrieb:
> Und was bietet das für einen Vorteil? Man könnte dann ja direkt einen> langsameren Zähler nehmen.
Stell dir einfach mal vor, dein Phasenakku hat nur 8 Bit und die
Berechnung des Frequency Tuning Word ergibt 2.5
Wie machst du das dann?
Als FTW 2 nehmen. Oder doch 3?
Man könnte natürlich auch einfach einen 9 Bit breiten Akku nehmen, davon
nur die obersten 8 Bit für die Adressierung in den Speicher nehmen und
das unterste Bit brauch ich nur deshalb, weil dort die 0.5 reinkommen
und sich sauber aufaddieren auch wenn sie in die eigentliche
Adressierung des Speichers so nicht eingehen.
Jetzt geht sich das aber nicht immer so schön aus, auf 0.5.
Was ist, wenn rauskommt, dass der Nachkommaanteil im FTW .214583 sein
müsste?
@avr
Wenn ich so die optimale Tabellengrösse berechne, funktioniert das dann
auch noch bei grösseren Frequenzen? denn da kann es ja gut sein, dass
der Phasenakku mit einem so ungünstigen Wert inkrementiert wird, dass
nicht bei jeder Periode die selben Werte aus dem Akku geholt werden.
(enthält der Akku z.B. 1024 Werte, und wird mit 5 inkrementiert, dann
kommen nach jeiner Periode 1024 andere Werte raus oder.).
@Karl heinz
Alles klar! jetzt verstehe ich. So lässt sich eine bessere Auflösung
erreichen. Vielen Dank!
@ Eckhard Meier (Gast)
>Wie viele Bits sollte man mindestens nehmen vom Phasenakku?
8++
>Und was bietet das für einen Vorteil? Man könnte dann ja direkt einen>langsameren Zähler nehmen.
Lesen. Ich schrieb was von höherer Frequenzauflösung.
>Wie stellt man die Amplitude des Ausgangssignals sinnvoll ein? Dazu>müsste man ja jeden Amplitudenwert, den man aus dem ROM gelesen hat, mit>einem bestimmten Faktor multiplizieren
Ja.
> (oder dividieren).
Nein. Man multipliziert lieber mit Zahlen kleinr 1 mittels
Festkommaarithmetik.
> Das gibt ja nen grossen Rechenaufwand.
Nöö, ein Multiplizierer ist relativ einfach in einem FPGA zu bauen.
> Wie wird das tatsächlich realisiert?
Multiplikation.
>Wenn ich so die optimale Tabellengrösse berechne, funktioniert das dann>auch noch bei grösseren Frequenzen?
Wenn dein FPGA bzw. ASCI das schafft.
> denn da kann es ja gut sein, dass>der Phasenakku mit einem so ungünstigen Wert inkrementiert wird, dass>nicht bei jeder Periode die selben Werte aus dem Akku geholt werden.
Das passiert sowieso. Das ist einer der Nachteile von DDS. Dadurch
entsteht eine ungewollte Amplitudenmodulation, welche den reinen Sinus
verunreinigt mit Nebenwellen (Zweiseitenbandmodulation).
MfG
Falk
@Falk
also, pro Periode mindestens 256 Werte sollte schon für einen
einigermassen guten Sinus reichen. Richtig?
Weiter habe ich da noch ne Frage:
Wäre es prinzipiell auch möglich, die Symmetrie von einem Dreiecksignal,
das mit DDS erzeugt wird, zu beeinflussen? Sprich die
Anstiegsgeschwindigkeit der steigenden und fallenden Flanke zu
beeinflussen.
Angenommen z.B. 10 kHz Frequenz, ergibt 10 us Periodendauer. Und die
ansteigende Flanke vom Dreiecksignal soll nur 2 us dauern, die
abfallende demnach 8 us. Ist sowas auch machbar, OHNE jede mögliche
Kombination im ROM abzulegen?
Ist grundsätzlich der Selbstbau eines DDS-Funktionsgenerators bis sagen
wir 1 MHz möglich? Das ergibt ja schon eine gewaltige Frequenz für den
Eingangstakt.
@Eckhard Meier (Gast)
>also, pro Periode mindestens 256 Werte sollte schon für einen>einigermassen guten Sinus reichen. Richtig?
Ja.
>Wäre es prinzipiell auch möglich, die Symmetrie von einem Dreiecksignal,>das mit DDS erzeugt wird, zu beeinflussen?
Ja, einfach die passende Signalform in den RAM laden. Also Dreieck statt
Sinus.
>abfallende demnach 8 us. Ist sowas auch machbar, OHNE jede mögliche>Kombination im ROM abzulegen?
Schwer. Könnte man ggf. tricksen.
>Ist grundsätzlich der Selbstbau eines DDS-Funktionsgenerators bis sagen>wir 1 MHz möglich?
Ja.
> Das ergibt ja schon eine gewaltige Frequenz für den Eingangstakt.
Warum? Theoretisch 2 MHz, wenn man nur Sinus erzeugen will. Will man
aber auch noch ein gutes Dreieck/Sägezahnsignal bei 1MHz erzeugen,
braucht man 10..50 MHz. Das ist aber auch noch machbar. Nimm einem
kleinen CPLD, gesteuert durch einen uC, z.B. AVR. Der kann dann relativ
gemütlich die verschiedenen Muster für deinen variablen Sägezahn
berechnen und in einen kleinen SRAM schreiben. Im CPLD steckt dann der
Phasenakku, welcher dann den SRAM steuert und die Daten ausgibt.
MFG
Falk
Für ein Dreiecksignal braucht es keine Tabelle.
Da ist das Ableiten des Ausgabewertes aus dem Zähler
schneller.
Die Tabelle wird für Signale benötigt deren Berechnung
zu aufwändig ist.
Eine "Selbstbau DDS" mit einem µC ala AVR ist nur im NF-Bereich
(bis ca. 15 kHz) sinnvoll, bei AVR32 auch etwas höher.
Für 1 MHz sollte man auf fertige Bausteine (Analog hat welche)
ausweichen und nur die Einstellung mit einem µC machen.
avr
Mit der Softwarelösung im AVR Controller kreigt man die Schleife auf 10
Zyklen, mit einem 24 Bit Phasenakku auch 8 Zyklen wenns sein muß. Damit
hätte man bei 20 MHz Takt immerhin schon 2 MHz Samplingrate. Das sollte
für mehr als 20 kHz reichen.