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.
> 2 MHz Samplingrate.
das reicht sogar für theoretisch 1MHz, wenn Du den richtigen
Antialiasing
Filter dahinter setzt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.