www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP IIR Filter ohne Phasenverschiebung


Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,
ich habe eine Frage bezüglich Digital Filter, ich habe mit Matlab einen 
digitalen Tiefpasfilter ( IIR) entworfen und in C++ Implemtiert, nur 
leider habe ich immer eine Phasenverschiebung die abhängig von der 
Frequenz des Eingangssignales, hätte jemanden eine Idee um diese 
Phasenverschiebung weg zu machen oder zu komposieren. Die Lösung muss 
auch programmierbar sein. Es wäre sehr nett wenn mir jemand Hilft. :D

Autor: Freizeitbastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm FIR statt IIR

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ... nur leider habe ich immer eine Phasenverschiebung die abhängig
> von der Frequenz des Eingangssignales, ...

Die Phasenverschiebung ist bei jedem Filter frequenzabhängig. Du
möchtest wahrscheinlich, dass der Phasengang linear und somit die
Laufzeit für alle Frequenzen gleich ist (konstante Gruppenlaufzeit).

Das geht tatsächlich nur mit einem FIR-, nicht aber mit einem
IIR-Filter.

Autor: Ali K. (lernen)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich habe auch versucht mit fir ,nachteil hohe ordnung, aber ich habe 
immer noch eine Phasenverschiebung, anbei findet ihr ein Beispiel, am 
Eingang leigen mehrere sinus Kurven mit verschiedenen Frequenzen nur die 
Sinus mit 0,6 Herz kommt durch. Es ist immer noch verschoben.
Das gelbe Signal ist das gefilterte.
 Habt ihr vielleicht noch eine Idee?

Autor: joep (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sagt jetzt aber nichts über deinen Phasengang aus, sondern ist nur 
die Verzögerung, die durch deinen Filter entsteht.

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber die Phasenverschiebung ist direkt proportional zu den 
Verzögerung?oder?
    phi°=360 x f x dt

Autor: FL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

einen Filter ohne Verzögerung gibt es nicht (oder richtig: er ist nicht 
kausal).
Deshalb vermuten hier alle im Forum, du möchtest einen Filter haben, der 
eine konstante Gruppenlaufzeit hat. Das bedeutet, dass jede mögliche 
Frequenz am Eingang des Filters die gleiche Verzögerung erfährt.
Es bedeutet jedoch deshalb gleichzeitig, dass die Phasenverschiebung 
proportional zur Frequenz ist. Also: Hat Dein Filter bei 100 Hz 
Eingangssignal eine Phasenverschiebung von 45 Grad, so sind es bei 200 
Hz 90 Grad.

Ist es das was Du haben willst?

Gruß
FL

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Hilfe,
Ja FL
eigentlich ich wollte an der erste Stelle einen digitalen Filter mit 
geringeren Verzögerung,
und an der Zweite Stelle,was du gemeinst hast eine konstante 
Gruppenlaufzeit.
Hätte jemand eine Idee um das zu realisieren?
Wie kann ich am besten die Phasenverschiebung in Matlab oder allgemein 
ermitteln?

Autor: joep (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird wahrscheinlich schwer werden beides zu realisieren, also geringe 
Gruppenlaufzeit und linearer Phasengang (wenn ich dich richtig 
verstanden habe ist es ja das, was du willst, oder?). Für ersteres wäre 
ein IIR-Filter besser geeignet als ein FIR-Filter, allerdings sind 
IIR-Filter meißt nicht linear im Phasengang. Für die Linearität im 
Phasengang wäre ein FIR-Filter perfekt, allerdings ist da die 
Gruppenlaufzeit deutlich höher. Musst dich also entweder auf eine der 
Vorgaben beschränken oder eben einen Mittelweg finden.

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast recht,ich habe es mir auch gemerkt,es gibt nur entweder oder? 
Weisst du vielleicht einen Mittelweg?

aber ich habe von einem Kollegen gehört es gibt eine andere Lösung und 
die heißt "Bidirektionale Filter", aber ich habe keine Ahnung wie es 
funktionniert.
Hätte jemand eine Idee wie das Prinzip läuft. und wie es realisierbar 
ist.

Gruss A

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meint der, einmal vorwärts und einmal rückwärts zu filtern?
Dabei sollten sich Phasenverschiebungen aufheben, bei Matlab heißt das 
glaub ich dann filtfilt(). Geht aber logischerweise nur offline.

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja genau vorwährst und rückwärts, aber kannst du ein bischen genauer 
sein.
wie meinst du mit offline, matlab befehl allein wird mir nicht so viel 
helfen weil ich nur in matlab simulieren  und dann in C++ umsetzen muss.
Danke.

Autor: joep (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft dir das:
http://www.dspguide.com/ch19/4.htm

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
für mich vorwärts ist schon vorstellbar aber ich verstehe immer noch wie 
es gemeint mit rückwärts?
Kann mir jemand erklären? oder eine Seite wo mehr drin steht am besten 
auf deutsch.

Autor: joep (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht doch in dem Text drin:
Angenommen du hast 150 samples, die du filtern willst, dann filterst du 
einmal von sample 0 bis sample 150 (also sample 0 ist dein erster 
Eingangswert, sample 1 dein zweiter usw.) und dann von sample 150 bis 
sample 0 (sample 150 ist dein erster Eingangswert, dann sample 149 
usw.). Beides kombiniert ergibt dann die Ausgangswerte des Filters.

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie muss ich dann die beiden kombinieren ,durch multiplikation oder 
Summe?
gilt das auch für IIR Filter oder?
Danke

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt quasilineare IIR-Filter
http://www.mathworks.com/access/helpdesk/help/tool...
Matlab-Befehl "iirlinphase"
Ansonsten könnte man mittels Allpass die Phase korrigieren.

zu vorwärts/rückwärts finde ich nur das Stichwort "lineare Prädiktion", 
da werden anscheinend IIR-Filter "rückwärts" entworfen:
http://www.ikp.uni-bonn.de/dt/lehre/materialien/ss...

Autor: FL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ali,

joep hat schon beschrieben wie du die beiden Filtervorgänge kombinieren 
sollst: Wenn Dein Eingangssignal x[n] ist, dann filterst Du es zunächst 
ganz normal mit dem Filter, das Ausgangssignal nennen wir y[n].
Dieses y[n] "drehst Du dann um" (soll heißen: letzter Wert wird erster, 
vorletzer wird zweiter usw.) und filterst das Resultat (y'[n]) erneut 
mit dem Filter. Du erhälst dann das Signal z'[n], welches Du dann noch 
einmal "umdrehen" must, um das endgültige Signal zu erhalten.

Richtig Sinn macht das ganze nur mit linearphasigen (sprich: 
FIR)-Filtern, denn hier hat das Signal z[n] dann wirklich keinerlei 
Verzögerung oder Phasenverschiebung gegen x[n].

Wie schon gesagt geht das ganze aber nur "offline", da ja das gesamte 
Signal vorhanden sein muß, um es "umdrehen" und mehrfach filtern zu 
können -- nix für Echtzeit also.


@Christoph Kessler: "Lineare Prädiktion" hat mit diesem Thema übrigens 
nix zu tun -- dabei geht es um den Entwurf eines (minimalphasigen 
IIR-)Filters, welcher ein lineares System (z.B. den menschlichen 
Vokaltrakt) modelliert. Das dazu "inverse" FIR-Filter kann man dann zu 
einer "inversen Filterung" benutzen, welche die Singalveränderungen 
durch das modellierte System wieder herausrechnet.
Verwendung findet dieses Verfahren z.B. in Sprachcodern, da eine solches 
"Auseinandernehmen" des Sprachsignals eine effektivere Codierung (und 
damit Bitraten-Reduktion) ermöglicht.
Aber wie gesagt, mit der Verhinderung von Phasenverschiebung und 
Verzögerung hat dies nichts zu tun.

Gruß
FL

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei nichtrekursiven Filtern macht Rückwärtsfiltern keinen Sinn, man 
bekommt das gleiche Ergebnis wenn man statt dem Signal die Impulsantwort 
umdreht und vorwärts anwendet. Bei IIR kann man das machen um eine 
lineare Phase zu bekommen, aber wenn das Signal sowieso schon komplett 
vorliegt kannst du auch gleich ein akausales FIR-Filter verwenden.

Autor: Ali K. (lernen)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
ich habe es durch ein m-file ausprobiert Fir und Fir mit vor-rückwärts 
filterung gemacht, und es hat geklappt,das Ausgang Signal hat wieder die 
gleiche Phase wie das Eingangssignal, wess aber nicht  ob es auch mit 
einem echten signal klappt.
Mir interessiert was der FL gesagt hat, das diese Vor-rückwärtsfilterung 
gilt nur in Offline? Stimmt das? Ich weiss auch nicht was mit Offline 
gemeint ist,heißt es, das es nicht gilt für ein kontinuierliches 
Eingangsignal?

Anbei findet Ihr ein Mfile von der Simulation?

Ich wäre sehr dankbar für die Antwort

Autor: joep (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit offline ist gemeint, dass du bereits das gesamte Signal, das du 
filtern möchtest "kennen" musst bevor du mit dem Filtern beginnen 
kannst. Du musst das Signal ja einmal vorwärts und dann wückwärts 
filtern.
Das bedeutet, bei einem Rechtecksignal, dass nach z.B. 100 Samples 
aufhört, könntest du den Algorithmus anwenden. Bei einem undenlich lange 
laufenden Signal z.B. nicht, da du ja niemals das gesamte Signal filtern 
(und danach rückwärts filtern) kannst, da es ja nicht endet.

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph Kessler wrote:
> Es gibt quasilineare IIR-Filter
> 
http://www.mathworks.com/access/helpdesk/help/tool...
> Matlab-Befehl "iirlinphase"
> Ansonsten könnte man mittels Allpass die Phase korrigieren.
>
> zu vorwärts/rückwärts finde ich nur das Stichwort "lineare Prädiktion",
> da werden anscheinend IIR-Filter "rückwärts" entworfen:
> http://www.ikp.uni-bonn.de/dt/lehre/materialien/ss...

Hallo Christoph
ich habe in einem Buch gelesen dass man die Phase mit allpass 
korriegieren kann aber steht nicht wie man das realisiert.
ich hätte eine Frage, bei diesem fdatool in matlab gibt kein 
Allpass,aber ich habe ein Befehl in matlab "dfilt.allpass" gefunden, 
aber ich weiss nicht wie ich das kombiniere wenn zb:
mein IIR_koeffizienten vom fdatool sind num[b1,b2,....] und 
den[a1,a2,...].wie kann ich es simulieren Und wie ich den Code vom 
Allpass in c++ umsetze.
Vielen Danke.

Autor: julian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum Allpass:
ist glaub schon möglich, aber ich meine mich zu erinnern das es auch 
eher schlecht als recht klappt. im grunde lässt ein allpass ja alle 
frequenzen durch, dreht nur frequenzabhängig an der phase rum. man muss 
ihn jetzt so designen, das er den Phasenversatz vom IIR kompensiert.

hab ich allerdings selbst noch nie gemacht, daher kann ich da keine 
allzuguten tipps geben.

Allpässe kann man mit einem Ringpuffer wunderbar programmieren... ist im 
grunde nur eine Verzögerung des signals, das dann auf den eingang per 
feedbackschleife zurückgeführt wird.

es gibt auch noch einen trick wie man das vowärts rückwärts filtern 
direkt auf das signal anwenden kann... man dreht nicht die Zeit des 
Samples um, das ist ja kausal bedingt nicht möglich. in der mathematik 
lässt sich die zeit allerdings wunderbar umdrehen. ich mein mich zu 
erinnern, das man einfach die pole und nullstellen bei dem IIR 
vertauscht. das gibt dann einen filter bei dem die zeit rückwärts läuft. 
das hat allerdings auch zur folge das der filter unstabil wird. er geht 
ja nicht mehr gegen null, sondern gegen unendlich. um dieses problem zu 
umgehen, kannst du dann einfach 2 dieser filter nehmen, un immer wenn 
einer ausbricht, schaltest du auf den anderen um und setzt den ersten 
wieder zurück... nennt sich truncated IIR. ist jetzt auch nur aus dem 
kopf rekonstruiert. gibt ein IEEE paper dazu.

da stößt du allerdings dann wirklich schon in regionen vor wo man sich 
mit DSP auskennen sollte...

was hast du denn überhaupt vor?

Autor: Dipl.-Ing. fr@ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ali,

es heißt das Filter! Filter, die Signale filtern und keinen Kaffee (oder 
so) was, sind grundsätzlich neutrum.

Filter ohne Phasenverschiebung und/oder Gruppenlaufzeit existieren 
nicht. Die einfachste Möglichkeit, eine konstante Gruppenlaufzeit in 
einem Filter zu realisieren ist, ein FIR-Filter zu realisieren, das eine 
ungerade Koeffizientenanzahl und symmetrische Koeffizienten aufweist. 
Die Gruppenlaufzeit ist immer (M-1)/2, wobei M die Koeffizientenanzahl 
darstellt.

Wenn eine kurze Verzögerung (~Gruppenlaufzeit) erwünscht ist, veringere 
die Koffizientenanzahl und verschlechtere somit die 
Übertragungscharakteristik.

Ansonsten hilft auch immer RTFM.

Gruß fr@

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Thread ist ein Jahr alt - nur mal so nebenbei bemerkt.

Autor: Ali K. (lernen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber trotzdem danke fr@

Gruß  Ali

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.