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?
PS: Im Prinzip suche ich eigentlich nur einen einfachen interpolierenden Filter für Oversampling bei der Signalsynthese :)
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.
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.
Ah. Alten Thread gefunden. Aber wenn ich die komplette LUT langsamer durchtakte habe ich doch ebenfalls Artefakte ohne Interpolation?
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.
Wo filterst du deine zweite Stufe? Durch den variablen Takt hast du doch auch frequenzvariables Aliasing?
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
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?
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.