IIR Filter ohne Phasenverschiebung

OP #951632
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
Gast #951662
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.
OP #952247
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?
Angehängte Dateien:
Gast #952444
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
OP #952712
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?
Gast #953272
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.
OP #953662
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
Gast #953750
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.
Gast #954209
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.
#955199
Lesenswert?

Es gibt quasilineare IIR-Filter
http://www.mathworks.com/access/helpdesk/help/toolbox/filterdesign/index.html?/access/helpdesk/help/toolbox/filterdesign/ref/iirlinphase.html
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/ssv1_2/sv_3.pdf
Gast #955665
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
Admin Persönliche Seite #956334
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.
OP #958137
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
Angehängte Dateien:
Gast #958634
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.
OP #964875
Lesenswert?

Christoph Kessler wrote:
> Es gibt quasilineare IIR-Filter
> 
http://www.mathworks.com/access/helpdesk/help/toolbox/filterdesign/index.html?/access/helpdesk/help/toolbox/filterdesign/ref/iirlinphase.html
> 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/ssv1_2/sv_3.pdf

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.
Gast #975390
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?
Gast #1378559
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@

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren