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

Fehlersuche: Bearbeitung von Messwerten

 

Stephi
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 06.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2013, 13:52     Titel: Fehlersuche: Bearbeitung von Messwerten
  Antworten mit Zitat      
Hallo,

ich habe ein Spannungssignal, das mehrere Maxima aufweist. Dabei gibt das Signal von Maximum zu Maximum die Dauer einer Umdrehung an. Mithilfe von diesem Signal möchte ich die Signale der anderen Messwerte periodisieren.

Ein Ausschnitt des Spannungssignals:
0,684003115
0,790118834
5,073302251
4,98425191
4,944960291
4,998100601
5,011788262
0,735531227
0,754371196
Alle Maxima liegen zwischen 4 & 6.

Bis jetzt habe ich geschafft, dass mir alle Maxima aus diesem Vektor angezeigt werden. Nun möchte ich den neuen Vektor (Sample, Amplitude) so bearbeiten, dass ich pro Abschnitt der hohen Messwerte nur EINEN in dem Vektor behalte. Mein Ziel ist es einen Vektor zu bekommen, indem ich von Eintrag zu Eintrag exakt eine Umdrehung darstellen kann.
Achso dazu ist noch zu sagne, dass so ein hoher Bereich ca alle 515 Samples auftritt.

Was ich bis jetzt habe:

Code:

A = X1; % X1 ist Spannungssignal-Signal
n1 = 0;
for k=2:1:length(A)-1   %k ist sample
 if A(k)>4 & A(k)<6  
    if A(k-1)<A(k) & A(k)>A(k+1)             %Überprüfung auf Hochpunkt                          
    n1 = n1 + 1;
    C(n1,1) = k;                       % Speichern der Koordinaten der
    C(n1,2) = A(k);                    % Hochpunkte in Matrix C
    end
 end
end

for n1=1:1:length(C)-1
    if C(n1+1,1)-C(n1,1) < 400         % Sicherstellen, dass in dem Bereich
        E(n1,1) = C(n1+1,1);             % des Peaks nur EIN lokales Max. betrachtet
        n1 = n1+1;                     % wird
    else
        E(n1,1) = C(n1,1);
    end
    D(n1,1) = C(n1,1);                 % Speichern in neuer Matrix D
    D(n1,2) = C(n1,2);
end

D = D(D~=0);    % eliminiert die "Null-Einträge" in D => jeder Eintrag in D steht
                % jetzt für EINE Umdrehung
 


Das funktioniert aber nur so lange ich nicht mehr als 2 nah beieinander liegende Maxima habe.

Ich kenne mich noch nicht gut mit MATLAB aus und finde meinen Fehler nicht. Es wäre super, wenn jemand eine Idee hat.

Viele Grüße

Stephi
Private Nachricht senden Benutzer-Profile anzeigen


Stephi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 06.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2013, 14:02     Titel:
  Antworten mit Zitat      
Achso da wo E steht hatte ich eigentlich ebenfalls C stehen, habe es nur kurz zum überprüfen der Zwischenschritte geändert.
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.05.2013, 16:39     Titel:
  Antworten mit Zitat      
Hallo Stephi,

Statt E soll C stehen? Dann ist aber "E(n1,1) = C(n1,1);" ein wenig veriwrrend, oder?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2013, 19:01     Titel:
  Antworten mit Zitat      
Hallo Stephi,
ich habe noch nicht ganz herausgelesen, was Du als Ergebnis haben willst. Aber wie es aussieht, ist das Signal ja relativ stabil, so dass Du mit einem einfachen Schwellwert schon relativ weit kommst:
Code:
zeitpunkte = find(diff(C>schwelle)>0);


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Stephi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 06.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2013, 23:07     Titel:
  Antworten mit Zitat      
Hallo Jan,

mit dem C(n1,1)=C(n1,1) also statt E(was ich erst nachträglich zur Überprüfung der Zwischenschritte eingeführt hatte) wollte ich eine "Umsortierung" des Vektors C erreichen.

Das Problem, das ich damit umgehen möchte ist, dass ich nach der Suche der Maxima mehrere (pro hohen Bereich) z.B. für den Ausschnitt von oben 5,073 und 5,011 mit den dazugehörigen Samples bekomme. Ich möchte einen Vektor aufstellen, in dem jeder hohe Bereich mit nur EINEM Wert (Anzahl Samples bis dahin, sprich 1.Spalte aus C) steht, weil die Abstände von dem einen hohen Bereich zum nächsten genau EINER Umdrehung entsprechen. Auf diese eine Umdrehung bzw. später 2,3,4....Umdrehungen möchte ich meine anderen Signale beziehen. D.h. ich benötige beispielsweise einen Wert aus dem 1.hohen Bereich 89(Sample) und einen Wert aus dem 2.hohen Bereich 602(Sample) um dann die anderen Signale von Sample 89 bis Sample 602 laufen zu lassen (später auch weiter zu bearbeiten und speichern).

Liebe Grüße

Stephi
Private Nachricht senden Benutzer-Profile anzeigen
 
Stephi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 06.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2013, 23:10     Titel:
  Antworten mit Zitat      
Hallo Sirius,

ich habe versucht es noch einmal besser zu beschreiben. Leider verstehe ich nicht was der Befehl von dir machen würde. Ich habe die Funktionen nachgeschaut, bekomme aber irgendwie keinen Zusammenhang rein. Kannst du mir bitte kurz erläutern was dieser Code macht?

Das ist das erste Mal das ich mit Matlab arbeite, daher kenne ich mich noch nicht gut aus.

Liebe Grüße
Stephi
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: 07.05.2013, 11:19     Titel:
  Antworten mit Zitat      
Im Zweifelsfall einfach mal ausprobieren Wink

Test anhand deines Datenauszugs:

Code:

schwelle = 4; % selbst festgelegt
C>schwelle; % ist ein logischer Ausdruck, der 0 oder 1 liefert. 1 = wenn C> schwelle ist

% Ergebnisvektor:  0 0 1 1 1 1 1 0 0

diff(C>schwelle) % Berechnet die Differenz vom Ergebnisvektor
% Ergebnis: 0 1 0 0 0 0 -1 0

zeitpunkte = find(diff(C>schwelle)>0); % jetzt wird nach dem Index des Vektor  [0 1 0 0 0 0 -1 0] gesucht, an dem ein Wert > 0 vorliegt

% Das Ergebnis ist somit: zeitpunkte = 2, denn hier beginnen die Werte über die Schwelle zu steigen, während sie bei C(7) wieder unter die Schwelle gefallen sind.
 


Ein sehr trivialer aber wirklich guter Lösungsvorschlag von Sirius3.
Private Nachricht senden Benutzer-Profile anzeigen
 
Stephi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 06.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2013, 16:36     Titel:
  Antworten mit Zitat      
Hallo,

danke für eure Hilfe!

Ich habe es ausprobiert und es funktioniert soweit sehr gut. Allerdings bekomme ich als Ergebnis nicht die Werte, die ich benötige, sondern immer den vorherigen Eintrag.
Liegt das an dem diff Befehl? Kann ich das irgendwie umgehen?

Liebe Grüße

Stephi
Private Nachricht senden Benutzer-Profile anzeigen
 
Stephi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 06.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2013, 16:41     Titel:
  Antworten mit Zitat      
Ich habe es schon selbst mit "zeitpunkte=zeitpunkte+1" gelöst. Vielleicht nicht die eleganteste Lösung, aber jetzt passt es.

Vielen Dank nochmal :-)

Stephi
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.