den moving average filter, kann man ja auch auch mit einem discrete-filter-block realisieren, indem man als nenner [1] und als zähler, [1 1 1 1 1] wählt ... die resultierende kurve ist die gleiche
Das Ergbnis ändert sich nicht...aber lassen wir das
Nicht schön, aber selten...und liefert das gleiche Ergebnis wie smooth()
Code:
y = rand(100,1);
yy = smooth (y); % so soll das ergebnis aussehen
time = (1:100)';
y_vec = [time y]; % from workspace(sample time 1)
y_sim = filter(ones(5,1),5,y);
% Laut Matlab Doku berechnet smooth so der ersten und letzten beiden Werte. Mit einem Filter geht das so nicht, da es ja ein Ein- und Ausschwingverhalten hat, weshalb das MW-Filter bei diesen Werten etwas anderes liefert. Auch mit einer Initialisierung des Filters kommst du nicht auf das Signal von smooth an den Rändern, wenn du alle Werte von y_sim nutzt. Gleichzeitig verschiebe ich das Filtersignal, so dass der Delay von 3 Werten des Filters entfällt.
y2(1) = y(1);
y2(2) = (y(1) + y(2) + y(3))/3;
y2(3:98) = y_sim(5:100);
y2(99) = (y(98) + y(99) + y(100))/3;
y2(100) = y(100);
figure(1) clf plot(time, y, 'b.-', time, yy, 'r.-', time, y2, 'g--') xlim([0max(time)])
vllt hab ich es nicht ganz verstanden was du möchtest aber ich glaube es geht darum dass die conv und filter funktionen am anfang und ende falsche ergebnisse liefern. das lässt sich bei conv so umgehen:
Die Mittelung soll in jedem Schritt stattfinden, also für jeden Wert, sodass sich die kurve nach und nach aufbaut und nicht nachträglich alles auf einmal.
Mit dem Einschwingen am Anfang kann ich mich noch abfinden, ist ja auch irgendwie logisch, nur warum von 0 und nicht vom 1. Wert aus? Und woher kommt die zeitliche Verschiebung der Werte? Diese stellt eigentlich das hauptproblem dar.
-> Also ich hätte gerne eine Kurve die sich aus a in smooth(a) einschwingt.
Mit dem Einschwingen am Anfang kann ich mich noch abfinden, ist ja auch irgendwie logisch, nur warum von 0 und nicht vom 1. Wert aus? Und woher kommt die zeitliche Verschiebung der Werte? Diese stellt eigentlich das hauptproblem dar.
Das Einschwingen von 0 aus passiert, da in der Funktion filter() keine extra Initialisierung vorgenommen wurde. Deshalb sind zunächst fünf Nullen in dem Filter. Willst von 1 aus starten, musst du das Filter so laden:
Oder z.B. mit dem Mittelwert der ersten 5 Werte. Jedes Filter hat nun mal eine Einschwingzeit...es dauert doch, bis der erste Werte (gewichtet) am Ausgang des Filters erscheint. Das kannst du nur verhindern, wenn du den Delay durch Linksschieben des Ausgangssignals beseitigst.
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.