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