Forum: Digitale Signalverarbeitung / DSP / Machine Learning DDS Interpolation


von Torben Kuhn (Gast)


Lesenswert?

Hallo,

im Moment experimentiere ich mit dem DDS-Prinzip und bin nun bei der 
Frage nach der Interpolation:

Beispiel:
8 bit x 8 bit LUT für das Signal (beliebige Form)
16 bit Phasenakkumulator (PA), die obersten 8 bit gehen auf die LUT
12 bit DA-Wandler

Bei einem Phaseninkrement von 0d16 wird nun jedes Byte aus der LUT 4x in 
Folge addressiert. Gibt eine schöne Treppe im Ausgangssignal. Daher 
interpoliere ich linear mittels PA[3..6] und LUT[PA[7..15]] & 
LUT[PA[7..15]+1] und bilde damit meine 4 LSB für den DA-Wandler. 
Funktioniert.

Nun habe ich etwas über die sin(x)/x Interpolation gelesen, aber noch 
keine praktische Umsetzung gefunden. Ich deute es so, dass ich mein 
Signal aus der LUT mit der sin(x)/x-Funktion falten muß. Nun liegen 
meine Vorlesungen zur digitalen Signalverarbeitung aber schon ein 
viertel Jahrhundert zurück, daher die Frage wie hier eine einfache 
Formel im Zeitbereich aussieht, 1 Sample vor aktuellem & 1 Sample nach 
aktuellem? Entsprächen die Nullstellen bei PI oder 2*PI meinen Samples 
aus der LUT?

von Torben Kuhn (Gast)


Lesenswert?

PS: Im Prinzip suche ich eigentlich nur einen einfachen interpolierenden 
Filter für Oversampling bei der Signalsynthese :)

von Audiohans (Gast)


Lesenswert?

Ich habe damals das hier implementiert:
http://www.96khz.org/oldpages/sinesynthesisdds.htm

Je nach Genauigkeitswunsch einfach die Akkumulatorauflösung vergrößern 
und den IIR-Filter dimensionieren.

von chris (Gast)


Lesenswert?

Das erinnert mich an
Beitrag "Nicht-Sinus DDS"

von Torben Kuhn (Gast)


Lesenswert?

Den Thread kenne ich schon, werde aber daraus nicht schlau.

Bislang interpoliere linear ich über 16 Taktzyklen zum nächsten 
LUT-Wert. Das funktioniert für Signale mit "mäßiger" Steigung ganz gut. 
Ein Rechteck (als Extrem) wird dadurch zum Trapez.

Wie interpolieren DSOs zwischen den Samplewerten, wenn die Anzahl 
Samples pro Bildschirm kleiner ist als die horizontale Auflösung? Bei 
meinem Rigol steht da Sin(x)/x zur Auswahl, d.h. die Samples werden in 
eine Formel gespeist und am Ende kommen ein paar mehr Samples heraus?

Wäre das dann ein FIR-Filter, dessen Koeffizienten sich aus der 
sin(x)/x-Funktion im Zeitbereich ergeben?

von Gost (Gast)


Lesenswert?

Rechtecke wirst Du in einer DDS ohnehin nicht abbilden können, weil die 
Knicke bei der Interpolation und die Stufen selbst durch einen Filter 
beseitigt werden müssen.

Die SINC-Funktion "sin(x)/x-Funktion" hat hier primär die Aufgabe, die 
Abflachung am Bandende zu reduzieren, meine ich.

von chris_ (Gast)


Lesenswert?

Die Sprungantwort eine idealen Tiempassfillters ist eine Sinux(x)/x 
Funktion, oder kurz "sinc" Funktion.

https://de.wikipedia.org/wiki/Idealer_Tiefpass

Man kann die Werte der Sinc-Funktion direkt als Koeffizienten eines 
FIR-Filters verwenden.

https://de.wikipedia.org/wiki/Filter_mit_endlicher_Impulsantwort

Es gibt dabei zwei Probleme.

1. Für einen idealen FIR-Tiefpass mit der Sinc-Funktion als 
Koeffizienten bräuchte man unendlich viele Koeffizienten und damit 
unendlich viel Rechenzeit.
2. Ein FIR-Filter ist "Causal", d.h. das Ausgangssignal entsteht erst, 
wenn schon ein Eingangssignal da ist. Die Impulsantwort eines 
Sinc-Filters würde schon vor dem Zeitpunkt Null beginnen. Das geht 
nicht, deshalb ist das Ausgangssignal zeitlich verschoben.

Lösungen:
1a. Man lässt einfach Koeefizienten weg ( am Rand werden die 
Koeffizienten sowieso immer kleiner )
1b. Man legt eine Fensterfunktion über den SINC die ab einem bestimmten 
Zeitpunkt Null sind:
http://www.dspguide.com/ch16.htm

2. Man verschiebt die Filterkoofizienten. Das Ausgangssignal des 
FIR-Filter erhält dadurch eine bestimmte Verzögerune ( N/2 )

Insgesammt aber:
Für die DDS wäre es am Recheneffizientesten, einfach die Anzahl der 
Stützstellen zu erhöhen und sich die Interpolation mittels SINC-Filter 
zu sparen.

von Gost (Gast)


Lesenswert?

chris_ schrieb:
> Für die DDS wäre es am Recheneffizientesten, einfach die Anzahl der
> Stützstellen zu erhöhen und sich die Interpolation mittels SINC-Filter
> zu sparen.

Die Interpolation bringt schon enorme Vorteile, ansonsten würde man 
schon ordentlich mehr Punkte brauchen. Das Filter täte ich weglassen. 
Das bringt nicht viel mehr.

von Torben Kuhn (Gast)


Lesenswert?

Das mit den Filterkoeffizienten von der sin(x)/x Funktion habe ich mir 
schon überlegt aber wie komme ich von T (meinem Abtastinterval) auf x? 
Die Funktion hat ja Nullstellen bei n*Pi das werden wohl nicht meine 
Koeffizienten sein

Stützstellen sind leider endlich. Geht nur darum mit dem DDS beliebige 
Kurvenformen zu erzeugen (educational purposes)

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Wenn Du mit der DDS beliebige Kurvenformen erzeugen willst, muss Du Dir 
über eine Grenzfrequenz klar werden. Ob Du das mit einem AA-Filter oder 
mit einem FIR-Filter tust, ist Geschmackssache.

Die Interpolation wird so oder so irgendwie stattfinden. Im Extremfall 
durch das Bandlimit eines OPs nach einem DAC.

Eine hochaufgelöste DDS als NICHT-Sinus geht so richtig nur mit einer 
zweistufigen DDS. Die eine für die Frequenz, mit Sinus und Filter und 
PLL als Frequenzhochsetzer als Takt, die andere mit fester Auflösung und 
hoher Grenzfrequenz im Bereich der halben Samplerate.

von Torben Kuhn (Gast)


Lesenswert?

Zweistufige DDS? Wie muss ich mir das vorstellen? Gibts da ein 
Prinzipschema?

von Torben Kuhn (Gast)


Lesenswert?

Ah. Alten Thread gefunden. Aber wenn ich die komplette LUT langsamer 
durchtakte habe ich doch ebenfalls Artefakte ohne Interpolation?

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

1)

Frequnzwert, Akku, Phase Dithering, Sinustabelle, Amplitudendithering, 
Filtering, DAC, AA-Filter, Offsetkompensation, OPV, Symmetrierer, 
Schmitttrigger, PLL

2)

PLL, Teiler, Zähler, Random-Value-Tabelle, DAC, Filter, OPV - fertig.

Z,B, mit der ersten 5 ... 10 MHz, mit der PLL hoch auf 200 MHz, dann 
eine 2000 Punktetabelle mit der Welle und Signal bis 100kHz. Sowas mache 
ich z.B. mit meinem Synthy.

von Jürgen S. (engineer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Es braucht im Übrigen gar nicht so eine hohe Auflösung für die DDS wenn 
man interpoliert und filtert. Bei nur 4 Bit für die Phase und 5 für die 
Auflösung kommt man ohne Filter schon auf unter 2% absoluten Fehler 
(rote Kurve). Mit Filter und einem Frequenzteiler, kann das sogar auf 
eine PLL.

Das Entscheidende ist, dass die Frequenz zwischen drin, analog, also 
ungerastert ist und in der zweiten DDS jeder Punkt immer und ganz genau 
1x benutzt wird. Dann bekommt man auch steile Flanken hin.

von Torben Kuhn (Gast)


Lesenswert?

Wo filterst du deine zweite Stufe? Durch den variablen Takt hast du doch 
auch frequenzvariables Aliasing?

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Der AA-Filter macht das Signal ideal sinusförmig. Geht ausreichend gut 
bis etwa einem Zehntel der Abtastfrequenz. Mit einigen Tricks wie 
Schwebungskompenation noch höher. Ich arbeite so auf 200MHz / 20...40. 
Macht die Variation innerhalb einer Oktave. Nach der PLL in der zweiten 
kann man umschalten und mit der halben  einem Viertel  einem Achtel 
der Frequenz arbeiten, um die Oktaven zu bekommen. Die saubere 
frequenzunabhängige AA-Funktion im zweiten mach ein spezielles 
Dithering, das den Analogfilter perfekt aussteuert.

Wenn Du da mehr, als Nyquist raushauen möchtest, musst Du eben 
Kompromisse eingehen. Gfs ein umschaltbares Filter.

: Bearbeitet durch User
von Torben Kuhn (Gast)


Lesenswert?

Jürgen S. schrieb:
> Die saubere
> frequenzunabhängige AA-Funktion im zweiten mach ein spezielles
> Dithering, das den Analogfilter perfekt aussteuert.

Das ist es was mich interessiert. Kannst/magst du mir hier mehr darüber 
erzählen?

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Sieh mal den Artikel Dithering

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.