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
> ... 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.
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?
Das sagt jetzt aber nichts über deinen Phasengang aus, sondern ist nur die Verzögerung, die durch deinen Filter entsteht.
Aber die Phasenverschiebung ist direkt proportional zu den Verzögerung?oder? phi°=360 x f x dt
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
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?
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.
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
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.
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.
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.
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.
Wie muss ich dann die beiden kombinieren ,durch multiplikation oder Summe? gilt das auch für IIR Filter oder? Danke
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 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
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.
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
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.
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.
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?
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@
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.