Forum: Digitale Signalverarbeitung / DSP / Machine Learning Sinus per DDS, warum 2. Harmonische?


von Mike (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Pandur S. (jetztnicht)


Lesenswert?

Und die Laenge der Tabelle ist ?

von Mike (Gast)


Lesenswert?

> 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.

von Pandur S. (jetztnicht)


Lesenswert?

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.

von Helmut S. (helmuts)


Lesenswert?

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).

von eProfi (Gast)


Lesenswert?

> die anderen werden durch Rückwärtslesen bzw. Vorzeichenwechsel
> on-the-fly berechnet.
Dauert diese Berechnung in allen Fällen gleich lange?

von Helmut S. (helmuts)


Lesenswert?

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
von Audiomann (Gast)


Lesenswert?

die -30dB gegen das Original sind doch nicht viel, oder?

von J. S. (engineer) Benutzerseite


Lesenswert?

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
von Mike (Gast)


Angehängte Dateien:

Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Helmut S. (helmuts)


Lesenswert?

Ich habe den Eindruck, dass Mike von DDS redet obwohl anscheinend 
überhaupt kein "echtes" DDS verwendet wird.

von Mike (Gast)


Lesenswert?

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.

von Helmut S. (helmuts)


Lesenswert?

Hallo Mike,

danke für deine Erklärung. Jetzt ist mir klar warum du nur eine 
begrenzte Zahl von Werten benötigst.

Gruß
Helmut

von J. S. (engineer) Benutzerseite


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Pandur S. (jetztnicht)


Lesenswert?

>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.

von J. S. (engineer) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.