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

moving average filter mit variabler Filterlänge?

 

Boromir05
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 08.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2016, 11:40     Titel: moving average filter mit variabler Filterlänge?
  Antworten mit Zitat      
Hallohalli,

Mit dem moving average Filter (gleitender Mittelwert) kann man ja zu jedem Zeitpunkt einen Wert angeben, der dem Mittelwert über eine definierte Anzahl vergangener Messpunkte entspricht.
Bei einer Filterlänge von 5, gibt der Befehl z.B. bei x=10 den Mittelwert der Messpunkte 6-10 an.
Code:
Filterlaenge=5;
a=1;
b = repmat(1/Filterlaenge,[1,Filterlaenge]);
Datenreihe1_gefiltert=filter(b,a, Datenreihe1);

Ich möchte nun die Filterlänge nicht fest vorgeben, sondern (abhängig von einer anderen Datenreihe) für quasi jeden Messpunkt variabel gestalten.
Die Filterlänge soll an jedem Punkt genau so lang sein, dass eine Datenreihe2 in dieser Zeit aufsummiert einen definierten Wert annimmt. Beziehungsweise genau so weit zurückreichen, dass dieser Wert gerade überschritten wird.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.435
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.08.2016, 13:26     Titel:
  Antworten mit Zitat      
Hallo,

da ist mir keine fertige Funktion bekannt.
Um die Filterlänge zu bestimmen, sollte cumsum helfen.
Für das Filtern an sich sehe ich keinen Weg um eine for-Schleife.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Boromir05
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 08.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2016, 15:07     Titel:
  Antworten mit Zitat      
Ja, dass es da keine eigene Funktion für gibt, das dachte ich mir bereits Wink

Ich wusste gar nicht, dass es die Funktion cumsum gibt. Habe bisher cumtrapz genutzt... Shocked

Aber auch damit:
cumsum gibt mir den aufsummierten Wert "bis jetzt".
Wie sage ich MatLab dann, dass genau so lange aufsummiert werden soll, bis Datenreihe2= x ist?
Und dann muss ich den Abstand zwischen den Zeitpunkten bestimmen, zwischen denen aufsummiert wird. --> Das ist meine Filterlänge für den Moment

Mir fehlt leider komplett die Idee (und wohl auch das Know-how), wie ich da rangehen soll Confused

Code:

Datenreihe2_cumsum=cumsum(Datenreihe2);
for n=1:inf;
    if Datenreihe2_cumsum(n)<x
         % alles filtern
         Filterlaenge=n;
    else
        % filtern über Länge t, sodass  Datenreihe in dieser Zeit = x
       
        Datenreihe2_cumsum(n)-Datenreihe2_cumsum(t1)=x;
          % funktioniert natürlich nicht.
          % Müsste mir in dem Fall t1 ausspucken, damit mir das was bringt.
       
        Filterlaenge  n - t1 ;
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.435
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.08.2016, 08:25     Titel:
  Antworten mit Zitat      
Hallo,

mir fehlt noch das genaue Verständnis, was gerechnet werden soll.

Vielleicht kannst du das anhand von Vektoren der Länge 10 oder so mal verdeutlichen?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Boromir05
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 08.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2016, 14:20     Titel:
  Antworten mit Zitat      
Cool wäre für eine spätere Online-Auswertung, dass die Funktion sagt, über wie viele zurückliegende Zeiteinheiten aufsummiert werden muss

angenommen:
Code:
Datenreihe2 = [2 1 3 1 2 4 3 0 1 0];
x=5;

for n=1:inf;

% die Funktion soll zu jeder Sekunde nach hinten aufsummieren
% und gesucht ist jeweils das "a", damit
cumsum(Datenreihe2( n-a-1 : n )) >= 5;
end

% Das Ergebnis sollte dann soetwas sein wie:
a = [1 2 3 4 4 4 3 3 4 5]

%{
die einzelnen Stellen erklärt:
1: über mehr Stellen kann er nicht nach hinten aufsummieren. ist ja die erste Stelle.
2: selber Grund
3: 3+1+2>=5 --> a=3 (aufsummieren über 3 Stellen: aktueller Wert und die 2 davorliegenden)
3: 1+3+1>=5 --> a=3
3: 2+1+3>=5 --> a=3
2: 4+2
2: 3+4
3: 0+3+4
4: 1+0+3+4
5: 0+1+0+3+4
%}

% der Vektor a wäre damit dann die variable Filterlänge, die ich für meine Funktion benötige

for n=1:inf;

b = 1;
c = repmat(1/a(n),[1,a(n)]);
Datenreihe1_gefiltert(n)=filter(c,b,Datenreihe1(n));

end
 


Ich hoffe, dass ich mich nicht wieder irgendwo vertan habe und dass zumindest meine Absicht klar wird Laughing
(Kommentarfeld geht im Code irgendwie nicht?)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.435
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.08.2016, 21:01     Titel:
  Antworten mit Zitat      
Hallo,

wenn du erst angibst, wie das Ergebnis etwa aussehen soll, und dann das tatsächlich gewünschte Ergebnis in sehr unüblicher Notation ausgibst, ist das sehr verwirrend.

Vorschlag:
Code:
Datenreihe2 = [2 1 3 1 2 4 3 0 1 0];
x = 5;

for k = 1:numel(Datenreihe2)
    if cumDatenreihe(k) <= x
        a(k) = k;
    else
        a(k) = find(cumsum(Datenreihe2(k:-1:1)) >= x, 1);
    end
end


Bei Performance-Problemen müsste man sich eine Möglichkeit einfallen lassen, auf das Bilden der kumulativen Summe in jeder Iteration zu verzichten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Boromir05
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 08.08.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2016, 12:12     Titel:
  Antworten mit Zitat      
Moin Harald,

ganz ehrlich: Ich kann mir nicht erklären, warum der Ergebnisvektor a nicht mit meiner ausführlichen Beschreibung übereinstimmt... War ein anstrengender Tag gestern... da habe ich wohl beim zusammenfassen der beschriebenen Einzelergebnisse Mist gebaut.

natürlich sollte a=[1 2 3 3 3 2 2 3 4 5] sein.


Vielen Dank, dein Code funktioniert schonmal!!
Code:
Datenreihe2 = [2 1 3 1 2 4 3 0 1 0];
x = 5;
cumDatenreihe2=cumsum(Datenreihe2);
for k = 1:numel(Datenreihe2)
    if cumDatenreihe2(k) <= x
        a(k) = k;
    else
        a(k) = find( cumsum(Datenreihe2(k:-1:1)) >=x, 1);
    end
end

Ich kann ihn auch nachvollziehen, da wäre ich selber aber nie drauf gekommen.
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 - 2024 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.