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

Auswertung von Messwertvektor "von vorne nach hinten&qu

 

liquid
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 25.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2016, 13:53     Titel: Auswertung von Messwertvektor "von vorne nach hinten&qu
  Antworten mit Zitat      
Hallo,

ich benötige aktuell Hilfe bei der Auswertung einer Messreihe via Matlab. Der Einfachheit halber habe ich kurz ein Skript zusammengeschustert, welches ein ähnliches Signal wie das aus der Messreihe erzeugt. Es handelt sich dabei um eine vage Sinus-/Wellenförmige Messreihe mit Abschnitten im unteren Bereich (minimaler Messbereich wird unterschritten). Frequenz und Form der Werte ändern sich über den Zeitbereich (es werden Kalibrierungen am Messsystem vorgenommen etc.). Im Anschluss soll versucht werden, über die Form des Messsignals Rückschlüsse auf die Veränderungen im Messsystem zu ziehen.

Code:
%% Generiere virtuelle Messwerte

y=zeros(1,400)
A=1
omega=0.2

for t=1:400
    y(t)=A*sin(omega*t+4)+2
    A=A-0.0001
    omega=omega+0.001
    if y(t)<=2.2
    y(t)=2.2
    end;
end;

th=1:400;
plot(th,y);
ylim([1.5 3.5]);
 


Das Messsignal sieht jetzt in etwa so aus:




Jetzt möchte ich für die Auswertung fürs erste überprüfen, inwiefern sich die "Breite der Wellenhügel" im Zeitverlauf ändert. Der Ergebnisvektor k soll dann also an jeder Stelle l=1...n die Anzahl der Messwerte enthalten, die über einem bestimmten Schwellwert liegen. Sobald der Schwellwert unterschritten wird, wird die auf die nächste Stelle gewechselt. Klingt erstmal simpel, nur bekomme ich es im Augenblick einfach nicht gebacken... mein Vorgehen aktuell:


Code:
%% Auswertung der Messwerte

k=zeros(1,500);
l=1;
i0=1

for l=1:100  
    for i=i0:400
        if y>2.3
            k(l)=k(l)+1;
            i0=i;
        else
            l=l+1;
        end;
    end;
end;



Wie man vermutlich merkt bin ich nicht gerade geschickt im Umgang mit Matlab und würde mich daher über Hilfe freuen. Im aktuellen Stand bleibt der Vektor k "leer" (also mit Nullen gefüllt).


Danke & viele Grüße
l.
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 04.04.2016, 18:32     Titel: Re: Auswertung von Messwertvektor "von vorne nach hinte
  Antworten mit Zitat      
Code:
%% Auswertung der Messwerte

k=zeros(1,100); % k wird höchstens l lang
i0 = 1;

for l=1:100   %was soll die äußere Schleife machen?
    for iLauf=i0:400  % i ist die imaginäre Einheit! nicht überschreiben!
        if y>2.3  % hier musst du den index von y setzen! sonst wird ges. Matrix abgefragt und das ist hier nie true
            k(l)=k(l)+1;
            %i0=i;  % vermutlich überflüssig
        else
           % l=l+1; % hochgezählt wird in for-schleife automatisch
        end;
    end;
end;



Alternativvorschlag:
1. auf gesamten Datenvektor y > 2.3 anwenden => Vektor , welcher 1 ist, wenn Bedingung erfüllt.
2. erste Ableitung des Vektors bilden (diff) -> Vektor, welcher 1 ist an Stellen, in denen Schwellwert gerade überschritten und -1 an Stellen, wo Schwellwert gerade noch nicht unterschritten.
3. mit den Indexen weiterarbeiten (-> find)

Edit:
Wenn du nur die Breite der Schwingungen willst:
Code:
k = 0;
for l = 1:size(y,2)
    if y(l) > 2.3
        k(end) = k(end) + 1;
    else
        if (k(end) ~= 0)
            k(end+1) = 0;
        end
    end
end

_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
liquid
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 25.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2016, 07:46     Titel:
  Antworten mit Zitat      
Hallo Martina,

Code:
k = 0;
for l = 1:size(y,2)
    if y(l) > 2.3
        k(end) = k(end) + 1;
    else
        if (k(end) ~= 0)
            k(end+1) = 0;
        end
    end
end


Hiermit funktioniert es wie es soll. Ich bin mir nichtmehr sicher wie ich auf die Idee mit den ineinander geschachtelten Schleifen kam.... Rolling Eyes Very Happy

Danke & viele Grüße,
liquid
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.04.2016, 12:45     Titel:
  Antworten mit Zitat      
Hallo liquid,

Siehe auch: http://www.mathworks.com/matlabcent.....eexchange/41813-runlength

Code:
[Value, Len] = RunLength(y > 2.3);

Gruß, Jan
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.