Hallo, ich erzeuge einen Sinus mittels DDS auf einem Atmel-SAMD11 Mikrocontroller. Die Signalfrequenz beträgt f = 41.212 kHz, die Samplingrate fs = 320 kHz. Die Sinuswerte sind in einer Tabelle abgelegt und werden im Rhythmus der Samplingrate auf den 10-bit DAC des µC ausgegeben. Nach jeweils 17 Perioden bzw. 412.5 µs wiederholt sich das Ganze. Das Spektrum des Signals habe ich angehängt. Es handelt sich direkt um den ADC-Ausgang, ohne Rekonstruktionsfilter. Die Grundschwingung ist mit -9dbV da wo sie sein soll. Auch die beiden großen Peaks rechts im Bild kann ich mir gut erklären. Sie liegen bei fs - f und fs + f, kommen also durch den Abtastvorgang zustande. Doch warum ist die 2.Harmonische bei 82.4 kHz so deutlich sichtbar? Nichtlinearitäten sollten doch eigentlich nur ungerade Harmonische erzeugen. Irgendetwas muss meine Sinushalbwellen asymmetrisch verzerren. An den Daten liegt es nicht, denn bei einer Sinusfrequenz von 40 kHZ, erzeugt mittels der Folge 512, 873, 1023, 873, 512, 151, 1, 151, 512, ..., gibt ebenfalls eine 2. Harmonische mit ca. -50dBV Amplitude. Die Nichtlinearität stört mich in meinem Anwendungsfall zwar nicht wirklich, trotzdem hätte ich nach der Faustformel SNR = 6N+1.8 dB bei 10 bit Auflösung ein besseres Ergebnis erwartet. Wer kennt sich mit DDS aus? Was erzeugt die Oberschwingungen?
> Und die Laenge der Tabelle ist ?
132 Einträge, wovon aber nur 33 gespeichert sind, die anderen werden
durch Rückwärtslesen bzw. Vorzeichenwechsel on-the-fly berechnet.
Aha. Dann versuch doch mal zu schauen, was mit 17 Perioden auf diesen Werten passiert. Ich haett allerdings eine Listenlaenge von 2^N genommen. Das macht den Wrap-around einfacher.
Mike schrieb: >> Und die Laenge der Tabelle ist ? > 132 Einträge, wovon aber nur 33 gespeichert sind, die anderen werden > durch Rückwärtslesen bzw. Vorzeichenwechsel on-the-fly berechnet. Bei einer DDS mit 10bit DAC nimmt man typischerwesie eine 12bit Tabelle (4096 Einträge). Diese Zahl kann man mittels erträglichem "real time" Rechenaufwand auf z. B. 1/4 reduzieren (0...90° Tabelle).
> die anderen werden durch Rückwärtslesen bzw. Vorzeichenwechsel > on-the-fly berechnet. Dauert diese Berechnung in allen Fällen gleich lange?
eProfi schrieb: >> die anderen werden durch Rückwärtslesen bzw. Vorzeichenwechsel >> on-the-fly berechnet. > Dauert diese Berechnung in allen Fällen gleich lange? Bei einer "krummen" Frequenz (ungleich Ftakt/2^n) werden alle 4096 verschiedenen Phasenwerte angesprungen. > erzeugt mittels der Folge 512, 873, 1023, 873, 512, 151, 1, 151, 512 Gibst du nur diese 8 verschiedenen Werte aus? Das ginge nur, wenn deine erzeugte Frequenz Ftakt/8 ist. Die zusätzliche Nichtlinearität des realen DACs geht natürlich auch ein.
:
Bearbeitet durch User
Mike schrieb: > An den Daten liegt es nicht, denn bei einer Sinusfrequenz von 40 kHZ, > erzeugt mittels der Folge 512, 873, 1023, 873, 512, 151, 1, 151, 512, > ..., gibt ebenfalls eine 2. Harmonische mit ca. -50dBV Amplitude. Doch, klar sind das die Daten. Die Oberwelle steckt in der Tabelle. Klassisches Rundungsproblem. Die 873 und 151 sind garantiert gerundet, während die anderen wahrscheinlich prima stimmen. Mit nur einem Faktor 1000 an Auflösung darf man mehr nicht erwarten. Also höher Auflösen. Allerdings bringt das auch nur was, wenn die Sinuswerte exakt getroffen werden. Um das zu mindern, muss ein anderer ADC und ein guter Filter her, was bei der geringen Zahl der Punkte nicht wirklich zu machen ist. Ansonsten hilft nur höher abtasten, verrauschen, dithern, um das Störspektrum zu verteilen. Du musst dir bewusst sein, dass 4 diskrete Punkte je Halbwelle eher ein Rechteckgenerator sind, als ein Sinusgenerator und an Oberwellen liefert der bei binärer Phasenteilung (Faltung!) einen Faktor 2 für jede Stufe.
:
Bearbeitet durch User
Ich glaube, dass ich die Ursache für die Anharmonizitäten gefunden habe. An den Daten oder dem Rechenalgorithmus liegt es definitiv nicht. Eine Erweiterung der Tabelle auf 12bit oder mehr bringt ohnehin nichts, wenn der DAC nur 10bit verarbeiten kann. Die Rundungsfehler führen i.a. zu spektral breit verteiltem Quantisierungsrauschen, nicht jedoch zu anharmonischen Verzerrungen. Ich habe versuchsweise mal die Samplingrate um den Faktor 10 auf 32kHz bei sonst gleichen Tabellendaten reduziert, und siehe da: Die 2. Harmonische verschwindet im Rauschuntergrund und die 3. liegt nun 55 dB unter der Grundschwingung. Ein genauer Blick auf das zeitabhängige Signal zeigt, dass der DAC keine sauberen Signalsprünge erzeugt, sondern eine endliche Anstieg- bzw. Abfallzeit benötigt. Dabei sind die Abfallzeiten um ca. 5% länger als die Anstiegszeiten und dazu noch aussteuerungsabhängig. In SCR08 kann man das gut sehen. Dies führt zu einer Verzerrung der Symmetrie und damit zum Auftreten einer 2. und höherer Harmonischen. Vermutlich ist die Gegentakt-Endstufe des DAC nicht ganz symmetrisch. Da der DAC mit maximal 350 kS/s spezifiziert ist, bin ich mit 320 kS/s schon hart am Limit und die endliche Slew-rate des Ausgangstreibers macht sich bemerkbar. Theoretisch müsste man das durch "Nachtrimmen" des Datensatzes korrigieren lassen, doch dazu ich habe im Moment weder Zeit noch Lust. Die Dauer der Berechnung spielt übrigens keine Rolle, da die Ergebnisse in einem doppelten Puffer abgelegt werden, aus dem sich der DAC selbsttändig zu den richtigen Zeitpunkten bedient. Puffer-Unterläufe gibt es nicht, diese würde mir der DAC als Fehler melden. Sie würden sich ohnehin deutlich drastischer auf das Signal auswirken.
Mike schrieb: > Eine > Erweiterung der Tabelle auf 12bit oder mehr bringt ohnehin nichts, wenn > der DAC nur 10bit verarbeiten kann. Kennst du dich eigentlich mit der Zahl PI aus? Nicht? Na dann bedenke mal folgendes: Eine Periode sprich Vollkreis dauert 2 PI und der Wertebereich des Ausganges ist 2, reicht nämlich von -1 bis +1. Klar bis jetzt? So. die Periode ist also etwa 3.1415 mal größer als der Ausgangs-Wertevorrat. Wenn dein DAC nun 10 Bit, also 1024 Schritte breit ist, sollte deine Tabelle folglich wenigstens 3141 Schritte umfassen, sonst vergeigst du nämlich dein LSB des DAC durch größere X-Rundungsfehler, als der DAC es durch Y-Fehler tut. Da ist es durchaus hilfreich, wenn die Tabelle die nächsthöhere 2er Potenz groß ist, also 12 Bit. Ist dir das jetzt klarer geworden? W.S.
Hast du berücksichtigt, dass das Zeitintervall, über das die FFT gerechnet wird, ein ganzzahliges Vielfaches der Periodendauer des mittels DDS erzeugten Sinussignals sein muss? Sonst sind keine sinnvollen Ergebnisse zu erwarten. Da die einzelnen Sinusschwingungen leicht unterschiedlich aussehen und sich erst nach 17 Schwingungen wiederholen, würde ich die FFT sogar über ein ganzzahliges Vielfaches des 17-fachen der Periode des Sinussignals laufen lassen.
Ich habe den Eindruck, dass Mike von DDS redet obwohl anscheinend überhaupt kein "echtes" DDS verwendet wird.
Helmut S. schrieb: > Ich habe den Eindruck, dass Mike von DDS redet obwohl anscheinend > überhaupt kein "echtes" DDS verwendet wird. OK, es ist ein Spezialfall der direkten digitalen Synthese, man könnte es auch Wavetable-Synthesis nennen. Da ich nur ganz besimmte Frequenzen brauche, die zudem noch mit der Abtastfrequenz in einem rationalen Verhältnis stehen (im obigen Beispiel ist f = 17/132 fs), habe ich die Sinuswerte an den insgesamt 132 Phasenwerten vorberechnet und in einer Tabelle abgespeichert. Der Phasenschritt ist hierbei auf 17*Pi/66 festgelegt. Diese 132 Werte werden dann einfach zyklisch an den DAC geschickt. Ausnutzung der Symmetrie erlaubt noch einer Verkleinerung um den Faktor 4, was zu insgesamt nur 33 Tabelleneinträgen führt. Letztendlich brauche ich in meiner Anwendung nur 2 unterschiedliche Sinusfrequenzen, so dass eine komplette Speicherung der Sinuswerte für beliebige Phasenwerte zwischen 0 und 2Pi bzw. 0 und Pi/2 überflüssig ist.
Hallo Mike, danke für deine Erklärung. Jetzt ist mir klar warum du nur eine begrenzte Zahl von Werten benötigst. Gruß Helmut
Mike schrieb: > Die Rundungsfehler führen i.a. zu > spektral breit verteiltem Quantisierungsrauschen, nicht jedoch zu > anharmonischen Verzerrungen. Doch, das tun sie durchaus, denn die eingeprägten Fehler sind nicht irgendein Rauschen, sondern ganz konkrete, überlagerte Rechtecke, die nach Maßgabe der Abtastung mit der Zielfrequenz gefaltet werden. In Deinem skizzierten Fall der periodischen Wiederholung von 8 Werten betonst Du genau diese Werte, weil 4 exakt auf dem Sollwert liegen und die anderen eben nicht. Ich habe mal eine Grafik angefügt, die das erklärt. Rot ist ein gezoomter Fehler gegenüber dem idealen Sinus. Ganz links kann man Deinen Fall erkennen, in dem die doppelte Frequenz entsteht. Inwieweit das Schalten Deines Transistors die Thematik noch beflügelt, kann Ich von hieraus nicht sagen, aber das Einprägen der f*2 ist definitiv der Fall und auch relevant, weil die Auflösung mit Faktor 1000 eben nicht mehr hergeben kann, als 30dB Abstand. Das passt IMHO zu der gemessenen Amplitude. Die Thematik ist ein ganz generelles Problem der DDS neben dem Phasenrauschen. Es entstehen bei jeder Frequenz ganz bestimmte Spektren, die die Filterung "erledigen" muss. Das gelingt natürlich nur für Frequenzen weit jenseits der Grenzfrequenz. Rundungsfehler können zu einem Offset führen, der weggefiltert wird, sobald ein AA-Filter angeschlossen ist, was aber immer zu einer Schwebung führt. Diese Schwebung kann durchaus sehr niederfrequent sein und je nach Reaktion des Filters beim sweepen sehr stören, wie man hinten in den Grafiken sieht. Unten ist ein Beispiel mit Phasen- und Amplitudendithering. Das Rauschen des Fehlers ist sogar absolut größer, dessen spektrale Verteilung aber günstiger, da flacher und weiter oben sodass es besser im Filter kleben bleibt. Durchschnittlich (z.B. für rosa Rauschen) sind etwa 3-6 dB an Verminderung des Rauschintegrals drin. Bei dem theoretischen weissen Rauschen noch mehr.
Mike schrieb: > Da ich nur ganz besimmte Frequenzen > brauche, die zudem noch mit der Abtastfrequenz in einem rationalen > Verhältnis stehen (im obigen Beispiel ist f = 17/132 fs), habe ich die > Sinuswerte an den insgesamt 132 Phasenwerten vorberechnet und in einer > Tabelle abgespeichert. Die Überlegung ist grundsätzlich nicht falsch, ändert aber nichts am Sachverhalt der endlichen Auflösung und dem damit eingespeisten Fehler. Wenn man mit festen Frequenzen arbeitet, würde man das Rauschen diesbezüglich optimieren, indem man es über die Tabelle verteilt, d.h. entsprechend statisch rundet. Ob das in Deinem Fall geht, kann man von hieraus nicht sagen. Ganz generell muss man hier die DDS infragestellen, da bei einem ganzzahligen Verhältnis ein echter Sinusgenerator als Schwingkreis sicher zielführender ist. Da muss man dann auch keine Tabellenwerte nachladen.
>Ganz generell muss man hier die DDS infragestellen, da bei einem
ganzzahligen Verhältnis ein echter Sinusgenerator als Schwingkreis
sicher zielführender ist. Da muss man dann auch keine Tabellenwerte
nachladen.
Nee. Ein Schwingkreis hat eine Frequenz, irgendeine, waehrend ein DDS
auf den Quarz stimmt.
Sapperlot W. schrieb: > Nee. Ein Schwingkreis hat eine Frequenz, irgendeine, waehrend ein DDS > auf den Quarz stimmt. Nein, der Schwingkreis hat nicht irgendeine Frequenz, sondern die, die anhand der Parameter eingestellt ist und da die Berechnung isochron arbeitet, ist die Schwingung exakt ein festes und u.U. sogar ganzzahliges Teilerverhältnis des Quarzes. Warum sollte das nicht so sein? Das einzige, was passiert, sind Rundungsfehler, die einen minimalen Drift erzeugen. Diesen kann man aber auch zuvor berechnen und in die Rechnung einfließen lassen. Nimm Dir mal die Gleichung unten im Abschnitt "Sinusfunktion und direkte Wellenerzeugung" in Klangerzeugung. Die ist vollkommen deterministisch und reproduzierbar. Jürgen S. schrieb: > indem man es über die Tabelle verteilt, d.h. > entsprechend statisch rundet. Kleiner Schreibfehler: Ich meinte "statistisch" rundet. Dies erfordert eine kontinuierliche Berechnung des Rauschwertes und damit eine Änderung der Werte und Löslösen von der Tabelle. Der Mittelweg wäre, die Tabelle genauer abzuspeichern und den Wert zu verrauschen und dann statistisch gerundet zum Wandler zu schicken. Damit entfällt im allgemeinen Fall die ständige Berechnung des Sinuswertes. Üblicherweise fasst man dithering und Interpolation der Tabelle zusammen. Wie Ich aber schon schrieb, plädiere Ich in diesem Fall für einen generischen Sinus. Allgemeiner Artikel hier im Wiki: Sinusgenerator mit IIR-Filter Oder auch hier: Beitrag "Sinuserzeugung in VHDL"
:
Bearbeitet durch User
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.