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

Rechtecksignale

 

Gast_des_Forums

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2011, 07:27     Titel: Rechtecksignale
  Antworten mit Zitat      
Hallo Forumgemeinde,

ich habe viele Messkanäle in einer Messung, die über den CAN aufgenommen wurden sind. Auf dem CAN werden die Botschaften je nach Priorität und Auslastung gesendet. Nun muss ich die Signale auf eine gemeinsame Zeitbasis bringen. Bei den meisten Signalen benutze ich den interp1 Befehl mit der spline Methode dafür. Bei einigen Signalen kann ich diesen Befehl jedoch nicht verwenden, da die Daten zu unregelmaßig gesendet werden. Hier möchte ich gerne Signalwerte solange konstant lassen, bis sich der Wert ändert. Bisher löse ich die so.

Code:

Ableitung_der_Signale = diff (origanal_Messdaten);
Index_Ableitung_ungleich_Null = find (Ableitung_der_Signale ~= 0);
Rechtecksignal (1) = original_Messdaten (1);
Startwert = 1;

for Signal_erzeugen = 1 : size (Index_Ableitung_ungleich_Null)

originaler_Zeitwert_an_gesuchter_Stelle = originale_Zeitdaten (Ableitung_der_Signale (Signal_erzeugen));

gesuchter_Interpolierter_Zeitwert = interpolierter_Zeitvektor ( abs (interpolierter_Zeitvektor - originaler_Zeitwert_an_gesuchter_Stelle ) == min ( abs (interpolierter_Zeitvektor - originaler_Zeitwert_an_gesuchter_Stelle)));

Index_gesuchter_Interpolierter_Zeitwert = find (interpolierter_Zeitvektor == gesuchter_Interpolierter_Zeitwert (1));

Rechtecksignal (Startwert : Index_gesuchter_Interpolierter_Zeitwert ) = origanal_Messdaten ( Index_Ableitung_ungleich_Null ( Signal_erzeugen ));

Startwert  = Index_gesuchter_Interpolierter_Zeitwert ;

end
 
% Da es möglich ist, dass sich die original_Messdaten zum Ende konstant geblieben sind und damit die Ableitung nichts detektieren kann, nehme ich den letzten Signalwert und schreibe ihn in den Rechteckvektor

Rechtecksignal (Startwert : size (interpolierter_Zeitvektor)) = origanal_Messdaten ( size (origanal_Messdaten));

 


Nun sind meine Messungen mehrere Stunden lang und diese Lösung ist etwas langsam. Deshalb meine Frage, gibt es eine bessere und schnellere Lösung für mein Problem? Über Hinweise und Anregungen freue ich mich.

MfG


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.09.2011, 10:40     Titel: Re: Rechtecksignale
  Antworten mit Zitat      
Hallo Gast_des_Forums,

Die langen Namen der Variablen machen das Lesen für mich sehr schwierig.
Kannst Du nochmal knapp beschreiben, wie die Inputs und Outputs aussehen? Ein kleines Beispiel mit z.B. 6 Punkten könnte auch hilfreich sein.

Dann nehmen ich an, gibt es ein sehr einfache Interpolationsmethode, bei der nicht der "nearest" (siehe INTERP1), sondern der "previous" Wert benutzt wird. Dies wäre dann auch deutlich schneller als das gemütliche INTERP1.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast_des_Forums

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2011, 11:56     Titel:
  Antworten mit Zitat      
Hi,

hier ein kleines Beispiel:

Code:


X_Original = 2:0.5:5
Y_Original = [1 1 2 5 7 7]
X_Interpoliert = 0:0.01:10

ydiff = diff (Y_Original);

ydiff0 = find(ydiff ~=0);
Start = 1;

for K = 1 : size (ydiff0)

Zeitwert = X_Original ( ydiff0 (K));

Zeitwert_Interp = X_Interpoliert ( abs ( X_Interpoliert - Zeitwert ) == min (abs ( X_Interpoliert - Zeitwert ) ))

Index_Zeit = find ( X_Interpoliert  == Zeitwert_Interp)

Y_Interpoliert (Start : Index_Zeit) = Y_Original (ydiff0 (K ));

Start  = Index_Zeit +1;

end

Y_Interpoliert (Start : size (X_Interpoliert) =  Y_Original (size (Y_Original));

 


Ich wünsche es mir, dass es eine einfache Interpolationmethode geben würde (sicherlich gibt es). Hatte mal google bemüht, aber wenn man den Befehlsnamen nicht genau weiss, ist die Suche etwas schwierig. Um nicht unnötig Zeitzuverlieren habe ih es halt erstmal so gelöst.

MfG
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.09.2011, 15:07     Titel:
  Antworten mit Zitat      
Hallo Gast_des_Forums,

Dein Code enthält einiges Bugs. Es wäre hilfreich, wenn Du ihn vor dem Posten testen würdest.
Code:
X_Original = 2:0.5:5
Y_Original = [1 1 2 5 7 7]
% X_Original hat 7 Elemente, Y_Original hat nur 6...

for K = 1 : size (ydiff0)
% SIZE liefert einen Vektor zurück. Du meinst wohl "length(ydiff0)".

Y_Interpoliert (Start : size (X_Interpoliert) =  Y_Original (size (Y_Original));
% SIZE nochmal

Zudem springt Y_Interpoliert schon einen Index früher auf den neuen Wert, als die Werte in den Original-Daten auftreten. Ist das beabsichtigt?

Eine effiziente Standard-Methode zur Interpolation, die den vorhergehenden Messwert benutzt:
Code:
[igno, index] = histc(X_Interpoliert, X_Original);
first = find(index, 1, 'first');  % Fill initial block
index(1:first - 1)  = 1;
last  = find(index, 1, 'last');  % Fill final block
index(last + 1:end) = length(X_Original);
Y_Interpoliert = Y_Original(index);

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