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

xlim verändern bei einem kontinuierlichem Zeitsignal

 

Sebasti

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2015, 17:29     Titel: xlim verändern bei einem kontinuierlichem Zeitsignal
  Antworten mit Zitat      
Hallo Zusammen,

ich lese aus einem Serial Port ein Zeitsignal heraus. Über eine While Schleife erstelle ich einen kontinuierlichen Plot. Leider verändert sich xlim automatisch, d.h. je länger das Signal wird desto weiter zoomt das Programm aus dem Plot heraus. Ich möchte aber, dass das Signal dauerhaft nur in einem Zeitbereich von 6 Sekunden zusehen ist.

Hier mein Code:
Code:

%% Define and open serial port
delete(instrfindall);
s = serial ('COM2');
set (s, 'BaudRate', 115200);
set (s, 'DataBits', 8);
set (s, 'StopBits', 1);
time = now;     %actual time
voltage = 0;    %define variable for signal

%Set figure
figureHandle = figure('NumberTitle','off',...
    'Name','Voltage Characteristics',...
    'Color',[0 0 0],'Visible','off');

%Set axes
axesHandle = axes('Parent',figureHandle,...
    'YGrid','on',...
    'YColor',[0.9725 0.9725 0.9725],...
    'XGrid','on',...
    'XColor',[0.9725 0.9725 0.9725],...
    'Color',[0 0 0]);

hold on;
%Set plot
plotHandle = plot(time,voltage,'Marker','.','LineWidth',1,'Color',[0 1 0]);

%Create xlabel
xlabel('Time','FontWeight','bold','FontSize',14,'Color',[1 1 0]);

%Create ylabel
ylabel('Voltage in V','FontWeight','bold','FontSize',14,'Color',[1 1 0]);

%Create title
title('Voltage Characteristics','FontSize',15,'Color',[1 1 0]);

%% Set the time interval for data collection

%Choose a time Intervall of measurement
signalTime = '00:00:20';
formatIn = 'HH:MM:SS';
integerSignalTime = datenum (signalTime, formatIn);
stopTimeInteger = time + integerSignalTime;
stopTime = datestr (stopTimeInteger, formatIn);

%%Collect data
count = 1;
timeInterval1 = '00:00:03';
formatIn = 'HH:MM:SS';
numTimeInterval1 = datenum (timeInterval1, formatIn);

while ~isequal(datestr(now,'HH:MM:SS'),stopTime)
    %time
    time(count) = now;
    %Reading Signal from serial port
    signal = fread (s);
%Mean value of signal (vector length 512)
    voltage(count) = mean(signal);
    %real-time plot
    set(plotHandle,'YData',voltage,'XData',time);
    set(figureHandle,'Visible','on');
   
    xmin = now - numTimeInterval1;
    xmax = now + numTimeInterval1;
   
    xlim([xmin xmax]);
    ylim([-0.5 100]);
    %Transformation of x-axis value in time
    datetick('x','HH:MM:SS');
   
    count = count +1;
end

%Close serial port
fclose(s);
delete(s);
clear s;

 


Wenn ich den Code so laufen lasse, hat die X_achse gar keine Achsenbeschriftung. Lasse ich xlim weg, bleibt wie beschrieben xmin immer gleich aber xmax wird, je länger das Signal dauert, immer größer.

Vielen Dank!!

Beste Grüße
Sebastian


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.10.2015, 17:39     Titel:
  Antworten mit Zitat      
Hallo,

so länglicher Code ist ohne Beispieldaten schwer zu durchblicken.

Die Optionen 'keeplimits' oder 'keepticks' sollten helfen.

Wenn du R2014b oder aktueller hast, würde ich zu datetime raten. Dort ist das Zoom-Verhalten deutlich besser.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2015, 18:07     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine schnelle Antwort. Ich habe beide Option bereits vorher schon getestet, leider ohne Erfolg.
Beispieldaten zu Verfügung zu stellen ist ein bisschen schwierig. Ich hätte gerne, dass durchgehend wenn in der Schleife ein Signal eingelesen wird, dass Signal in einem Bereich von 6 Sekunden (aktuelle Zeit +- 3 Sekunden) dargestellt wird, da es sich um ein EKG Signal handelt. Also xlim folgendermaßen nach jedem durchlauf neu angepasst wird:

Code:

xlim([(now - datenum('00:00:03', 'HH:MM:SS')) (now + datenum('00:00:03', 'HH:MM:SS'))]);
 


Matlab versucht jedoch das ganze Signal in einen Plot zubekommen, xmax wird also immer größer und xmin bleibt gleich. Wird die Zeitskala größer kann das EKG Signal nicht mehr vernüpftig interpretiert werden.

Beste Grüße
Sebasti
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.10.2015, 20:23     Titel:
  Antworten mit Zitat      
Hallo,

zunächst mal: welche Version hast du? Mit R2014b oder neuer würde ich wie gesagt datetime verwenden.

Zitat:
Ich habe beide Option bereits vorher schon getestet, leider ohne Erfolg.

Was genau hast du versucht, und was ist dabei aufgetreten?

Zitat:
Beispieldaten zu Verfügung zu stellen ist ein bisschen schwierig.

Sollten nicht zwei oder drei Ausschnitte des Signals reichen?
Ohne Daten ist das nunmal nicht nachzuvollziehen. Statt dass ich mir jetzt Daten aus den Rippen schneide, bei denen das Verhalten am Ende nicht auftritt, wäre es schon nett, wenn du das übernimmst.

Die Problematik ist an sich klar. Mit den genannten Optionen sollte aber vermieden werden können, dass sie auftritt.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2015, 09:30     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe Beispieldaten über einen Zeitraum von 30 Sekunden eingelesen und beigefügt über:

Code:

dlmwrite('values.txt',[voltage;time],'delimiter',' ');
 


Als Matlab Version habe ich R2012a, daher kann ich datetime nicht verwenden.

Die beiden Optionen habe ich folgendermaßen nacheinander ausprobiert:

Code:

datetick('x','HH:MM:SS','keeplimits');
datetick('x','HH:MM:SS','keepticks');
datetick('x','HH:MM:SS','keepticks','keeplimits');
 


Bei keeplimits hat sich nichts verändert und bei keepticks ist die Achsenbeschriftung verschwunden (genau wie bei der dritten Variante). Zudem habe ich mir am Ende einfach mal einen Ausschnitt über 24 werte plotten lassen.

Code:

countStart = 24;
countEnd = 48;
set(plotHandle,'YData',voltage(countStart:countEnd),'XData',time(countStart:countEnd));
set(figureHandle,'Visible','on');
xmin = time(countStart);
xmax = time(countEnd);
xlim([xmin xmax]);
datetick('x','HH:MM:SS','keeplimits');
 


Obwohl ich xlim für diesen Bereich gesetzt habe erhalte ich folgenden Plot (Anhang: IMG1.fig).

Vielen Dank!
Sebasti

IMG1.fig
 Beschreibung:

Download
 Dateiname:  IMG1.fig
 Dateigröße:  3.53 KB
 Heruntergeladen:  288 mal
values.txt
 Beschreibung:

Download
 Dateiname:  values.txt
 Dateigröße:  4.53 KB
 Heruntergeladen:  327 mal
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.10.2015, 16:45     Titel:
  Antworten mit Zitat      
Hallo,

und was soll ich jetzt mit den Daten anfangen? Zumal time auch noch so abgespeichert ist, dass es sich ja gar nicht ändert, da die Dezimalstellen fehlen.

Hier Code mit Dummy-Daten:

Code:
startDate = datenum(2015, 10, 29, 0, 0, 0);
endDate = datenum(2015, 10, 30, 0, 0, 0);
time = startDate:1/(24*60^2):endDate; % sekündlich
voltage = rand(size(time));

countEnd = 24:24:numel(time);
countStart = countEnd - 23;
plotHandle = plot(time(countStart(1):countEnd(1)), voltage(countStart(1):countEnd(1)));

for I = 1:numel(countStart)
    currentRange = countStart(I):countEnd(I);
    set(plotHandle,'YData',voltage(currentRange),'XData',time(currentRange));
    xmin = time(countStart(I));
    xmax = time(countEnd(I));
    xlim([xmin xmax]);
    datetick('x','HH:MM:SS','keeplimits');
    pause(1)
end


Grüße,
Harald
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.