Hallo, in meiner aktuellen "Bastelei" Fange ich ein I2S Signal (48kHz /
16 Bit) mit meinem PIC (dsPIC33EP16GS504) auf und gebe es als PWM raus
mit 288kHz und 13 Bit Auflösung.
Funktioniert soweit, bis auf dei Tatsache das der Sinus ab etwa 4kHz
nicht mehr schön aussieht. Nun müsste ich noch Interpolieren von 48kHz
auf 288kHz.
Habe mir vorübergehend eine einfache Interpolation geschrieben die
bewirkt das die fehlenden Abtastwerte linear aufgefüllt werden das
funktioeniert sogar ziemlich gut. Sowol am Oszi als auch mit
angeschlosenen Lautsprecher kann ich jetzt bis zu meinen gewünschten
16kHz aufregeln. Allerdings bei steigender Frequenz zunehmend mit
Artefakten.
Nun die Frage: hat schon mal jemand mit FIR Interpolations Filter auf
dem dsPIC gearbeitet und mir ne kleine Starthilfe geben welche librarys
von microchip ich da am besten nehme und welche tools ich zum berechnen
des Filters nehmen kann. Anmerkung ich bin nur im Assembler bewandert
Gee schrieb:> Habe mir vorübergehend eine einfache Interpolation> geschrieben die bewirkt das die fehlenden Abtastwerte> linear aufgefüllt werden
Naja, konsequent wäre jetzt, kubische Parabeln zu
interpolieren. Hängt von Deiner mathematischen
Abenteuerlust ab, ob Du Dir das zutraust...
> Naja, konsequent wäre jetzt, kubische Parabeln zu> interpolieren.
So ein Quatsch. Er hat ja ein einigermassen ordentliches
Signal und keine Truemmer.
Vielleicht sollte der TO mal sein Supersampling debuggen.
Ansonsten koennte er sich auch ein paat PT8211 aus China kommen lassen.
Dieses PWM-Gemurkse fuer Audio ist widerlich.
Schalubischlumpf schrieb:>> Naja, konsequent wäre jetzt, kubische Parabeln zu>> interpolieren.>> So ein Quatsch. Er hat ja ein einigermassen ordentliches> Signal und keine Truemmer.
???
Er möchte ein Upsampling von 48kHz auf 288kHz machen,
das bedeutet, dass zwischen je zwei Abtastpunkte weitere
fünf zu interpolieren sind.
Lineare Interpolation stößt bei relativ hohen Frequenzen
an ihre Grenzen, also ist es nur logisch, es mit einem
Polynom höherer Ordnung zu versuchen.
> also ist es nur logisch, es mit einem> Polynom höherer Ordnung zu versuchen.
Das Ergebnis duerfte etwa genau so bescheiden sein,
wie die "Darstellungskorrektur" bei Schinaboelleroszis
wo aus einer unzureichenden Wertebasis steile Flanken
hingerechnet werden.
Ein quadratischer Anteil duerfte nur bei den Minima und Maxima
des Signals ueberhaupt nennenswert sein.
Ein kubischer schon gar nicht...
Bei einem linearen Oversampling werden da halt ein paar
zusaetzliche Oberwellen erzeugt, die allerdings nicht
stationaer sind und damit kaum einen Beitrag leisen.
Possetitjel schrieb:> Lineare Interpolation stößt bei relativ hohen Frequenzen> an ihre Grenzen, also ist es nur logisch, es mit einem> Polynom höherer Ordnung zu versuchen.
Das stimmt, mit einer Polynomischen Formel die am besten noch die
letzten 3 Werte statt nur die letzten 2 zur Berechnugn heranzieht
könnte man schon einen schöne Sinus reproduzieren nur wird das zu
rechenintensiv für die 70 MIPS des dsPIC. Ich müsste halt irgendwie
Zugriff auf die DSP Einheit bekommen da diese seberat zum normalen Core
arbeitet und diese Rechenoperationen paralell ausführen kann. Ich tu
mich nur immer so schwer mit neuen Dingen und benötige erstmal einen
Ansatzpunkt
Gee schrieb:> Possetitjel schrieb:>> Lineare Interpolation stößt bei relativ hohen Frequenzen>> an ihre Grenzen, also ist es nur logisch, es mit einem>> Polynom höherer Ordnung zu versuchen.>> Das stimmt, mit einer Polynomischen Formel die am besten> noch die letzten 3 Werte statt nur die letzten 2 zur> Berechnugn heranzieht könnte man schon einen schöne Sinus> reproduzieren nur wird das zu rechenintensiv für die> 70 MIPS des dsPIC.
Bin ich gar nicht sicher; das müsste man sich wirklich im
Detail überlegen.
> Ich müsste halt irgendwie Zugriff auf die DSP Einheit> bekommen da diese seberat zum normalen Core arbeitet> und diese Rechenoperationen paralell ausführen kann. Ich> tu mich nur immer so schwer mit neuen Dingen und benötige> erstmal einen Ansatzpunkt
Hmm... Upsampling und lineare Interpolation hast Du ja
offenbar schon im Griff. Wenn Du diese linear inter-
polierte Wertefolge durch ein gleitendes Mittel filterst,
verschwinden die Knicke an den ursprünglichen Stützstellen.
Die gefilterten Werte kann man ggf. nochmal mit einem
gleitenden Mittel filtern.
Gleitendes Mittel geht rekursiv; immer den neuen Wert zur
alten Summe zuzählen und den letzten, der aus der Summe
herausfällt, subtrahieren. Das macht zwei Additionen je
Sample.
Moin,
Ich wuerd' mal noch CIC-Filter in den Ring werfen; wenn der DSP mit 32
bit Samples gut (=schnell) zurecht kommt; damit gibt's dann so eine
Interpolation mit Polynomen beliebiger Ordnung. Vorteil: Fuers Filtern
brauchts keine Multiplikationen, nur Additionen und Subtraktionen.
Nachteil: Passband laeuft nicht gerade, da muss man ggf. schon mal
vorverzerrren.
Oooder aber z.b. mit einem Polyphasen-FIR arbeiten; d.h. man berechnet
sich ein Prototypen-FIR mit einer Laenge von N*6 und leitet sich daraus
6 einzelne FIR-Filter jeweils mit Laenge N ab; fuer jedes Ausgangssample
muss dann eines der FIR-Filter mit Laenge N einmal durchgerechnet
werden.
Was waere denn da fuer eine Laenge N moeglich bei den 288kHz Sampling
rate - also wann macht der DSP nicht mehr mit?
Und was ist die max. Frequenz im Audio (Je tiefer die unterhalb der
24kHz liegt, desto besser werden die Filter)?
Gruss
WK
Wie gesagt als maximale Frequenz würden mir 16-17kHz reichen, darüber
hinaus höre ich eh nix mehr. Eingangsformat ist immer PCM 48kHz 16 Bit,
Ausgang ist immer PWM 288kHz / 13 Bit. Also immer konstant 6 faches
Upsampeln.. Ein dsPIC ist immer für die Wandlung von 2 Kanälen
verantwortlich. Diese muss er in Echtzeit abarbeiten können. Für Lin.
Interpol. reichts. Obs für Poly. reicht weis ich nicht aber denke es
wird knapp.. würde es mal probieren wenn ich genau schritt für schritt
wüsste wie diese Funktioniert könnte ich es in Assembler schreiben und
dann testen.. Als erstes müsste ich wissen wieviele vorangegangene
Samples ich als Berechnungsgrundlage für den Filter benötige. Für die
Lin. Interpol. reichen mir ja zwei.. für Poly brauch ich sicher 3 bis 6
oder?
Moin,
Ja, das wird schon hinhauen. Guck' dir mal CIC-Filter an. Die sind auch
in Assembler simpelst zu realisieren - musst nur auf die Bitbreite
achten, d.h. fuer deine Anwendung: mit (mindestens) 32bit arbeiten.
Jenachdem wieviele Differenzierer und Integratoren du da kaskdierst,
wird dein Signal eben durch Polynome N-ter Ordnung "ergaenzt".
Allgemein: Je mehr Samples aus der 48kHz Clockdomaene du fuer deine
Interpolation heranziehst, desto "schoener" kann sie werden. Aber du
musst halt dann auch mehr rechnen.
Wenn du immer nur ein Sample aus der 48kHz Domaene hast, kannst du nix
anderes machen, als dieses Sample 6x zu widerholen. Wenn du 2 Samples
hast, dann kannst du linear zwischen den beiden approximieren. Wenn du 3
Samples hast, kannst du quadratisch zwischen beiden approximieren; Wenn
du 4 Samples hast, kubisch, etc. bla.
Und so aehnlich gehts auch mit Polyphasen-FIR Filtern.
Gruss
WK