mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FIR Interpolation mit dsPIC


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Gee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rainer S. (enevile)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.microchip.com/doclisting/TechDoc.aspx?type=CodeExamples

Kann da ein bisschen stöbern. Fand da viele nützliche Sachen

Autor: Chatauchseinedaseinsberechtigungistnichtsoschwer (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Gee schrieb:
> Anmerkung ich bin nur im Assembler bewandert

Dann lerne als ersten Schritt C!

Autor: Possetitjel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Schalubischlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Possetitjel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Schlaubischlumpf (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
> 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.

Autor: Gee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Possetitjel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Gee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Ansatz klingt interessant, werde ich mir mal anschauen

Autor: Gee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Possetitjel schrieb:
> der aus der Summe
> herausfällt, subtrahieren.

Kannst du mir das vielleicht genauer erklären?

Autor: Dergute W. (derguteweka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Gee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Dergute W. (derguteweka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.