www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Polyphase Interpolation


Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab einen Polyphase Dezimator und Interpolator. Wie ich rausgefunden 
habe, braucht man den Dezimator einfach nur halb so schnell Takten. Der 
Interpolator bereitet mir aber noch Kopfzerbrechen.

Ich hab einen Tiefpass+Dezimator, der funktioniert. Und ich hab einen 
Tiefpass+Interpolator, der funktioniert nicht. Berechnet wurde alles 
nach [1]. Also das Matlab-Zeug auf der Seite funktioniert natürlich, 
meine VHDL-Implementierung will nicht so recht und ich weiß nicht was 
Matlab da überhaupt implizit noch alles macht ...

Taktet man den einfach nur 2mal so hoch, oder muss man trotzdem noch für 
jedes 2te Sample eine 0 einfügen?

Fehlersuche ist irgendwie schwierig, wenn man das genaue 
Funktionsprinzip nicht kennt und man findet scheinbar nur bei 
ieeexplorer was brauchbares und da kostet es scheinbar was ...

Mfg
Thomas Pototschnig

[1]: 
http://www.mathworks.fr/products/filterdesign/demo...

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Also das Matlab-Zeug auf der Seite funktioniert natürlich, meine 
>>VHDL-Implementierung will nicht so recht
hm

>>Taktet man den einfach nur 2mal so hoch, oder muss man trotzdem noch für
>>jedes 2te Sample eine 0 einfügen?

Dezimation: filtern und dann jedes x-te sample wegschmeissen.

Interpolation: 0 einschieben (oder sample wiederholen), dann filtern. 
Wie soll denn das sonst mit der Interpolation gehen, wenn Du 10 
samples/s reinkriegst, aber 20/s rausschiebst !!?? Durch das Einschieben 
der Nullen erhälst Du im Spektrum zusätzliche Frequenzkomponenten, die 
Du rausfiltern willst/muß.

Das ist in Matlab einfach zu sehen: nimm eine Sinuswelle, schiebe 
zwischen zwei samples immer ne Null rein und kuck Dir das Spektrum von 
dem Ding an, damit ist alles erklärt.

Die Filterei des interpolierten Signals hat mit Polyphase erstmal nix 
zum tun. Bei einer FIR Filterstruktur kannst Du dann natürlich 
ausnutzen, daß jeder x-te sample 0 ist.

>>Fehlersuche ist irgendwie schwierig, wenn man das genaue Funktionsprinzip 
>>nicht kennt
Das ist wohl so, und daß Du in VHDL debugst machts nicht einfacher.

Cheers
Detlef

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Filterei des interpolierten Signals hat mit Polyphase erstmal nix
> zum tun. Bei einer FIR Filterstruktur kannst Du dann natürlich
> ausnutzen, daß jeder x-te sample 0 ist.

Naja ... Bei der Matlab-Implementierung wird ein Tiefpass mit einem 
Polyphase Interpolations, bzw Dezimationsfilter kombiniert. Die werden 
dann Hlp und Glp genannt. Die Polyphase struktur kann ich mir schon 
vorstellen, die kommt ja durch die Ausnutzung der 0er zustande, die man 
in den FIR reinschieben würde. Soweit ich das verstehe braucht man das 
beim Polyphase Interpolator nicht machen, also man taktet die Samples 
einfach 2 mal so schnell in den Filter rein (d.h. 2 Samples sind immer 
gleich) und kriegt das richtige in der gewünschten Samplerate raus.

Ist das so?

Mfg
Thomas Pototschnig

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ist das. Wenn Du jeweils eine Null einschieben willst, teilst Du Dein 
FIR Filter in even/odd Koeffizienten. Die Eingangsdaten schiebst Du in 
beide Filter rein, für ein Eingangssample gibts eine Ausgangssample aus 
dem Filter mit den even und eins aus dem Filter mit den odd Koeffs., 
also doppelt so viele. Das ist aber einfach zu sehen, wenn man sich 
vorstellt, wie die interpolierenden Nullen in ein FIR filter reinlaufen 
und wie man die Multiplikation mit 0 vermeiden kann.

Cheers
Detlef

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal :-)

Also meine Filter machen jetzt das was sie sollen, allerdings scheint 
die filter()-Funktion von Matlab doch noch 0er einzufügen. Wenn man nur 
die Filterkoeffizienten verwendet, dann besitzt der Filter eine 
Verstärkung von 2. Wenn man 0er einfügt, beträgt die Skalierung wieder 
1. Das Hauptproblem bei meinem VHDL-Code lag aber natürlich woanders ;-)

So oder so, meine "perfect reconstruction" 2-Kanal-Filter-Bank 
funktioniert jetzt ...

Danke für die Hilfe :-)

Mfg
Thomas Pototschnig

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.