Hallo, weiß jemand zufällig was genau bei der filtfilt Funktion in MatLab passiert. Konkret meine ich die Initialbedingungen der Filter. Wie sind die darauf gekommen ? Ich kann es zwar in C nachprogrammieren, doch würde ich gerne wissen was ich programmiere :D. Kennt sich einer damit aus ? Oder weiss einer wo die Erklärung im Netz zu finden ist. Ein Link wäre schon toll. Hat man als Randbedingungen 0 zieht das Signal natürlich an den Rändern gegen 0. Für meine Anwendung unschön. Gruß, Eric
Das sagt Mathworks zu den intial conditions: filtfilt uses the filter function. filtfilt attempts to minimize start-up transients by adjusting the initial conditions to match the DC component of the signal. The algorithm also prepends several filter lengths of a flipped, reflected copy of the input signal. 'help filtfilt' bringt sowas. Gute Nacht Detlef
Hallo, ja das habe ich auch gelesen. Doch wie funktioniert der Algorithmus genau ?Das war meine eigentliche Frage. Wann kann der angewendet werden und wann sollte er nicht verwendet werden usw. ? Gruß, Eric
Normalerweise sehe ich mir bei so etwas die entsprechend geklonte Funktion in GNU Octave an. Da gibt es Source-Code. Allerdings scheinen die bei Octave ein paar Probleme bei der Implementierung zu haben: http://octave.sourceforge.net/signal/function/filtfilt.html > Forward and reverse filter the signal. This corrects for phase distortion > introduced by a one-pass filter, though it does square the magnitude > response in the process. That's the theory at least. In practice the phase > correction is not perfect, and magnitude response is distorted, > particularly in the stop band. Bleibt nur sich quer durch die Literatur zu wühlen, ob sich dort etwas findet.
Hallo, ich hätte nochmal ne Frage. Habe ein FIlter in Direktform 2 und in Direktform 2 transponiert programmiert. Ich brauch ja Initialbedingungen Hier mal mein Matlab Code für die Direktform 2 normal:
1 | for i=1:1:sz |
2 | new_sample=input(i); |
3 | w1(1) = new_sample + ( -a1(1) * w1(2)) + (-a2(1)*w1(3)); |
4 | res1=(b0(1)*w1(1))+(b1(1)*w1(2))+(b2(1)*w1(3)); |
5 | w1(3)=w1(2); |
6 | w1(2)=w1(1); |
7 | output(i)=res1*gain; |
8 | |
9 | end |
Nun habe ich bemerkt, das wenn ich bei den beiden Formen die Zustände (hier w1) ändere nur ein richtiges Ergebnis bei der Direktform 2 transponiert herauskommt. Im Buch wird als Beispiel auch immer mit Direktform2 transponiert gerechnet bei Verwendung von Zuständen. Aber es muss doch auch gehen in der normalen Direktform2. Das wundert mich gerade irgendwie. Ist an der Gleichung irgendwo ein Fehler (muss ja :D), den ich gerade nicht sehe. Wenn mit 0 initalisiert wird funktionierts einwandfrei
:
Bearbeitet durch Admin
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.