wenn ich ein Signal mit einem Tiefpass filtere, so ergibt sich das logisch unvermeidbare Delay von x Samples in Abhängigkeit von der Filterkonfiguration. Im angehängten Screenshot habe ich ein Zufallssignal mit einem Butterworth-Tiefpass gefiltert (rot=Eingang/blau=Ausgang):
Am Anfang sieht man den daraufhin entstandenen Offset von x Samples, um die das Signal am Ende gekürzt ist.
Meine Frage: Wie kann ich erreichen, dass die Samples am Ende des Originalsignals nach der Filterung erhalten bleiben ? Mir ist klar, dass der Buffer dadurch länger werden müsste, aber nicht, wie ich dies mit Matlab umsetzen kann.
Du kannst mal versuchen ans Ende deines Signal vor der Filterung noch Nullen ans Ende anzuhängen, und zwar in der Länge des Filters also in deinem Bsp. 20+1.
Allerdings wird dann natürlich auch dieser Endbereich etwas verändert, da das Filter ja mit den Nullen weiterrechnet. Oder du nimmst statt der Nullen den letzten Wert des Signals und hängst ihn 21x hinten an.
Oder du initialisierst das Filter über zi
Code:
[y,zf] = filter(b,a,X,zi) % accepts initial conditions, zi, and returns the final conditions, zf, of the filter delays. Input zi is a vector of length max(length(a),length(b))-1, or an array with the leading dimension of size max(length(a),length(b))-1 and with remaining dimensions matching those of X.
Danke für die rasche Anwort ! Tatsächlich würde eine Wiederholung des letzten Wertes oder ein Setzen auf 0 das Signal zu sehr verfäschen. Ich probierte es bisher mit einer Extrapolation des Signals, was relativ gut funktionierte, dachte aber, dass es ggf. einen simpleren Weg gibt.
Hast du denn mal den Weg über das zi probiert und dir dann den zf Vektor angesehen? Ich habe es nicht ausprobiert...aber nach meinem Verständnis der Doku zu dem Befehl müssten das die Werte sein, die sich sozusagen noch in den Registern des Filters befinden. Durch das Anhängen von zusätzlichen Werte ans Nutzsignal werden diese Werte ja aus den Registern geschoben.
Die Filterung eines Signals der Länge n entspricht ja der Faltung mit der Impulsantwort h des Filters der Länge m. Beim Faltungssatz ergibt sich ja folgende Länge...
y[n + m -1] = signal[n] * h[m]
Die Filterfunktion gibt aber im default nur n Werte wieder aus. Die m-1 Werte sind dann noch im Register.
Du könntest auch die Filterung statt mit der Funktion filter selbst berechnen. Dazu nutzt du z.B. erst die filter Funktion zur Berechnung der Impulsantwort, in dem du einen Dirac als Eingangssignal [1,0,0,0,...,0] übergibst und dann die Filterung deines Signals entweder mit der Funktion
Code:
N = % Länge - 1 der Impulsantwort
dirac = [1, zeros(1,N)];
h = filter(b,a,dirac);
y_filt = conv(signal,h)% = Faltung mit der Impulsantwort h
OK - danke, dass Du den Ansatz mit zi (und Ansatz 3) noch genauer erklärt hast, da ich nun erst verstanden habe, worauf Du hinaus willst. Ich probiere es asap aus und melde mich mit den Ergebnissen.
Vielleicht sollte ich noch erwähnen, dass die Impulsantwort des Filters so lang sein muss, dass sich das Filter wieder eingeschwungen hat. Also am Ende der Impulsantwort am besten Nullen vorliegen. Der Dirac als Eingangssignal muss also entsprechend lang genug sein.
Ist das nicht der Fall, wird es bei der Filterung durch die Faltung dann zu Artefakten im gefilterten Signal kommen.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.