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

Datenreihen synchronisieren anhand gleicher Parameter

 

MenschMeier
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 22.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2013, 15:58     Titel: Datenreihen synchronisieren anhand gleicher Parameter
  Antworten mit Zitat      
Hallo,
ich habe zwei unterschiedliche Datenquellen, welche ich synchronisieren möchte. Die eine Quelle besitzt aber keinen Zeitstempel und daher muss ich die Synchronisierung über die Parameter realisieren. Es existieren Parameter, welche von beiden Quellen aufgezeichnet werden. So in etwa:

Quelle 1: Parameter A, E, F
Quelle 2: Parameter A, B, C, D

Die Idee ist nun, die Messdaten der beiden Quellen so gegeneinander zu verschieben, bis der Fehler (MSE) zwischen den beiden Parametern A minimal ist. Leider hab ich keine genaue Idee, wie ich solch eine Minimierung vornehmen kann. Von "Hand" möchte ich die ungern programmieren, da wird es doch bestimmt eine Route geben. Kennt jemand so etwas?

Vielen Dank und einen schönen Sonntag


EDIT:
Ich habe mich jetzt mal an eine kleine Iplementierung gemacht. Bin aber nicht sicher, ob das sehr effizient ist. Gerade bei sehr großen Datenmengen wird die schleife recht lang.

Code:

function DatenSynchronisation
 
clc
clear
 
%Zeitschritte der Datenquelle 1
t1=0:0.1:10;
 
%Datenquelle 1
d1=sin(t1);
 
%Datenquelle 2
d2=d1(1,20:(end-20));
 
%Rauschen erzeugen
d1=awgn(d1,10,'measured') ;
d2=awgn(d2,10,'measured') ;
 
%Zeitschritte der Datenquelle 2 (beginnt einfach beim ersten Zeitschrift)
t2=t1(1,1:length(d2));
 
%Plot vor der Synchronisation
plot(t1,d1,'Color','red'), hold on, plot(t2,d2)
 
% Datensynchronisation
for i=1:30

    % Erzeuge gekürzte Daten von d1, welche in der Schleife wandern
    d1s=d1(1,i:(length(d2)+i-1));
 
    %Berechne den MSE der gekürzten Daten und des Datensatzes ohne      
       Zeitstempel
    error=d1s-d2;
    MSE(i)=mean(error.^2)
   
end
[C,I]=min(MSE)
t2s=t1(1,I:length(d2)-1+I)
 
%Synchronisierter Datenplot
figure
plot(t1,d1,'Color','red')
hold on
plot(t2s,d2);
 
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: 08.04.2013, 09:11     Titel: Re: Datenreihen synchronisieren anhand gleicher Parameter
  Antworten mit Zitat      
Hallo MenschMeier,

Ein paar Kommentare zum Code:
1. Wozu löschst Du das Command-Window per CLC? Dies macht es schwerer eventuelle Fehler- oder Warn-Meldungen zu sehen. Deshalb ist das keine gute Idee.
2. CLEAR löscht den lokalen Workspace. Zu Beginn einer Funktion ist der aber sowieso leer. Das CLEAR verschwendet damit nur Zeit. Das ist zwar nicht viel, aber nützlich ist es nicht.
3. ERROR ist ein sehr wichtiger Befehl in Matlab. Wenn du eine Variable "error" nennst, kann man ihn aber nicht mehr direkt aufrufen. Du benutzt zwar diesen befehl bisher nicht, aber das sog. shadowing von Built-in Funktionen führt immer wieder zu unerwarteten Schwierigkeiten. Verwende also besser einen anderen Namen.
4. Das Programm sieht eigentlich nicht schlecht aus. Ein Effizienz-Problem ist die fehlende Pre-allocation vom MSE: In jeder Iteration wird das Array vergrößert. Dafür wird ein neues Array erzeugt und die alten Werte kopiert. Bei einer Endgröße von 30 Elementen, müssen also insgesamt SUM(1:30)*8 Byte reserviert und kopiert werden, was immerhin 3720 Byte sind, obwohl das Array am Schluss nur 240 Bytes benötigt. Dieser Overhead steigt aber mit zunehmender Endgröße rasant an: Bei 1000 Elementen benötigst Du schon mehr als 4MB, bei 10'000 schon 400MB.
Deshalb ist eine Pre-allocation Pflicht für effiziente Programme:
Code:
% Vor die Schleife:
MSE = zeros(1, 30);

Der CONV-Befehl könnte hilfreich sein.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MenschMeier
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 22.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2013, 10:39     Titel:
  Antworten mit Zitat      
Hey Jan,
sry für die späte Rückmeldung. Erstmal danke für deine Code-Kommentare. Aktuell sieht es so aus:

Code:
function [ZeitschritteB] = MessdatenSynchronisation(ZeitschritteA, DatenA, DatenB )
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here

for i=1:(length(DatenA)-length(DatenB)-1)
   
    WanderendeDatenA=DatenA(1,i:(length(DatenB)+i-1));

    error=WanderendeDatenA-DatenB;
    MSE(i)=mean(error.^2)
   
end
[C,I]=min(MSE)
ZeitschritteB=ZeitschritteA(1,I:length(DatenB)+I-1)

end
 


Leider ist der Code bei großen Werten nicht sehr sinnvoll. Muss mir da noch eine intelligentere Lösung überlegen. Vielleicht ist mein Code für jemanden mit weniger Messdaten ganz passabel.

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