WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Tiefpassverzögerung / Samples erhalten

 

jazzalex
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 26.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2014, 08:53     Titel: Tiefpassverzögerung / Samples erhalten
  Antworten mit Zitat      
Hallo zusammen,

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):

Code:

[B,A] = butter(20,[0.20],'low');
output = filter(B,A,input);
 


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.

Danke im voraus,
Grüße

Alex

offset.jpg
 Beschreibung:

Download
 Dateiname:  offset.jpg
 Dateigröße:  123.29 KB
 Heruntergeladen:  274 mal
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 16.10.2014, 09:13     Titel:
  Antworten mit Zitat      
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.
 


Falls das nicht den gewünschten Effekt hat, wird es denke ich etwas komplizierter.
Private Nachricht senden Benutzer-Profile anzeigen
 
jazzalex
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 26.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2014, 10:31     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 16.10.2014, 10:49     Titel:
  Antworten mit Zitat      
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


durchführst oder bei sehr vielen Werten ist die Faltung über die FFT deutlich schneller. Dazu gibt es hier die Funktion "FFT_Faltung.m"
Private Nachricht senden Benutzer-Profile anzeigen
 
jazzalex
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 26.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2014, 10:57     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 16.10.2014, 12:45     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.