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
http://www.microchip.com/doclisting/TechDoc.aspx?type=CodeExamples Kann da ein bisschen stöbern. Fand da viele nützliche Sachen
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.
Possetitjel schrieb: > der aus der Summe > herausfällt, subtrahieren. Kannst du mir das vielleicht genauer erklären?
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
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.