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

Datenreihe auf gleiche Länge anpassen

 

ThKo26
Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 15.02.2018, 22:50     Titel: Datenreihe auf gleiche Länge anpassen
  Antworten mit Zitat      
Hallo zusammen,

ich habe wieder mal ein Problem in Matlab und stehe auf dem Schlauch.

Ich habe Messdaten mit unterschiedlicher Frequenzabtastrate

mat File liegt bei.

Mein Skript:
Code:
load('Race_D1R4L4.mat');
data = data{1,1};

a = 1000;% WTXData.TIME.SampleRates; % Abtastfrequenz Time
b = 100; % WTXData.CHYG.SampleRates; % Abtastfrequenz CHYG
c = 100; % WTXData.CHXG.SampleRates; % Abtastfrequenz CHXG
d = 200; % WTXData.CHXV.SampleRates; % Abtastfrequenz CHXV
e = 500; % WTXData.SPRXFL.SampleRates; % Abtastfrequenz SPRXFL
f = 500; % WTXData.SPRXFR.SampleRates; % Abtastfrequenz SPRXFR
g = 500; % WTXData.SPRXRL.SampleRates; % Abtastfrequenz SPRXRL
h = 500; % WTXData.SPRXRR.SampleRates; % Abtastfrequenz SPRXRR

fs = 200; %goal 200Hz output for every channel
k = [a,b,c,d,e,f,g,h];
[m,n] = size(k);

if k(n) < 200
    data.Time =
   
   if k(n) = 200
       
        if k(n) > 200
           
        end
    end
end
 


a -f sind die Frequenzen, mit denen das Signal abgetastet wurde. Meine Zielfrequenz ist fs.

ich möchte nun für fs < 200 die Daten interpolieren mit dem Befehl interpl.

die Messreihen mit fs = 200 einfach behalten

und fs> 200 soll nur der Wert genutzt x-Fache Wert genutzt werden.
Beispiel: data.Time= (1:k/fs:end)
k ist die Frequenz mit der das Signale herausgeschrieben wurde.

zusätzlich sollen die Messreihen die Namen behalten. und alles in eine Table abgespeichert werden.

Ich bitte um eure Hilfe.

Ich werde selbst weiterprobieren und fortschritte posten.

Grüße
Thomas

Race_D1R4L4.mat
 Beschreibung:

Download
 Dateiname:  Race_D1R4L4.mat
 Dateigröße:  643.22 KB
 Heruntergeladen:  311 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.02.2018, 14:52     Titel:
  Antworten mit Zitat      
Hallo,

... und was hast du nun versucht / welche Probleme sind aufgetreten?

Wenn du schon weißt, welchen Befehl du verwenden möchtest, dann ist das gröbste doch schon erledigt.

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 16.02.2018, 15:20     Titel:
  Antworten mit Zitat      
Hallo Harald,

mein Problem ist, ob ich if oder for nutze.
Außerdem habe ich probleme mit der Umsetzung Smile Da ich nicht auf die struct zugreifen kann, wie ich es aus der Tabelle kenne.

Ich poste später meinen aktuellen Stand mit den jeweligen Fehlern.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.02.2018, 15:21     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
mein Problem ist, ob ich if oder for nutze.

Beides. Eine for-Schleife über die Signale, und darin eine if-Abfrage je nach Frequenz.

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 17.02.2018, 15:35     Titel:
  Antworten mit Zitat      
Hallo,

mein Code:

Code:
Channels={...channels
    'CHYG','CHXG','CHXV',...
    'SPRXFL','SPRXFR','SPRXRL','SPRXRR','TIME'};



Code:

load('Race_D1R4L4.mat');
data = data{1,1};
data.TIME = data.t;
data = rmfield(data,'t')


Code:
a = 100; % WTXData.CHYG.SampleRates; % Abtastfrequenz CHYG
b = 100; % WTXData.CHXG.SampleRates; % Abtastfrequenz CHXG
c = 200; % WTXData.CHXV.SampleRates; % Abtastfrequenz CHXV
d = 500; % WTXData.SPRXFL.SampleRates; % Abtastfrequenz SPRXFL
e = 500; % WTXData.SPRXFR.SampleRates; % Abtastfrequenz SPRXFR
f = 500; % WTXData.SPRXRL.SampleRates; % Abtastfrequenz SPRXRL
g = 500; % WTXData.SPRXRR.SampleRates; % Abtastfrequenz SPRXRR
h = 1000;% WTXData.TIME.SampleRates; % Abtastfrequenz Time

fs = 200; %goal 200Hz output for every channel
k = [a,b,c,d,e,f,g,h];
[m,n] = size(k);


Code:
for l=1:length(Channels)
    if k(n) < 200
        data.Channels(1) = data.Channels(1) (1:k(n)/fs:end);
       
            if k(n) == 200
                data.Channels(1) = data.Channels(1);
               
                    if k(n) > 200
                        x = k(n);
                        xq = fs;
                        data.Channels(1) = interp1(x,data.Channels(1,xq);            
               
                    end
            end
    end
end


Ich bekomme es nicht hin, dass ich in der Struktur auf
data.TIME zugreifen kann, ohne TIME zu nutzen.

data.(Channels(1)), data.[Channels(1)],data.(Channels{1}),
deshalb kommt der Fehler
Code:
Cannot call or Index into a temporaray array.


Bitte um hilfe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.02.2018, 15:55     Titel:
  Antworten mit Zitat      
Hallo,

die Codestruktur ist so nicht sinnvoll. Der Teil "if k(n) == 200" ist innerhalb von "if k(n) < 200" und kann somit nicht erreicht werden.

Du hast l als Schleifenindex, wovon ich aufgrund der Verwechslungsgefahr mit 1 abraten würde. Wo verwendest du das l denn aber?

Die richtige Syntax ist data.(Channels{1}) . Welche Probleme treten damit auf?

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 17.02.2018, 16:07     Titel:
  Antworten mit Zitat      
Hallo

Zitat:
die Codestruktur ist so nicht sinnvoll.


stimmt, das macht keinen Sinn!
Zitat:

Die richtige Syntax ist data.(Channels{1})


jetzt kommt der Fehler nicht mehr, hatte anscheind etwas vergessen.

aktueller Code:
Code:
for z=1:length(Channels)
    if k(n) > 200
        data.(Channels{z}) = data.(Channels{z})(1:k(n)/fs:end);
    end
    if k(n) == 200
        data.(Channels{z}) = data.(Channels{z});
    end
    if k(n) < 200
        x = k(n);
        xq = fs;
        data.(Channels{z})= interp1(x,data.(Channels{z}),xq);
    end
end


Jetzt läuft es ohne Fehler, aber es kommen die falschen Ergebnisse raus. es sollten alle Channels die gleiche Länge habe,

Irgednwoe macht er einen fehler.

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 17.02.2018, 16:17     Titel:
  Antworten mit Zitat      
Daten:

Data: Frequenz: Ergbnis [ist]: Ergebnis [soll]:
10712 100 2143 21424
10712 100 2143 21424
21424 200 4285 21424
53560 500 10712 21424
53560 500 10712 21424
53560 500 10712 21424
53560 500 10712 21424
107120 1000 21424 21424

Die if. Folge funktioniert nicht. Werde mal schauen wo der Fehler leigt.

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 17.02.2018, 16:27     Titel:
  Antworten mit Zitat      
mein Code:

Code:
for z=1:length(Channels)
    if k(z) > 200
        data.(Channels{z}) = data.(Channels{z})(1:k(z)/fs:end);
    end
    if k(z) == 200
        data.(Channels{z}) = data.(Channels{z});
    end
    if k(z) < 200
        totalsamples = size(data.(Channels{z}),1);
        x = totalsamples;
        xq = 1:k(z)/fs:totalsamples;
        data.(Channels{z})= interp1(x,data.(Channels{z}),xq);
    end
end


Fehler:

Code:
Error using griddedInterpolant
Interpolation requires at least two sample points in each dimension.

Error in interp1 (line 186)
        F = griddedInterpolant(X,V,method);


danke für die Hilfe.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

dann schau dir doch mal die beteiligten Variablen bei dem Befehl an.
x = totalsamples ist ganz sicher keine sinnvolle Einstellung. Das erste Argument muss der zugehörige Zeitvektor zu den Daten sein.

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 17.02.2018, 20:15     Titel:
  Antworten mit Zitat      
Hallo,

Code:
x = totalsamples ist ganz sicher keine sinnvolle Einstellung

dummer Fehler!

Ich bekomme eine Warnung:
Code:
Warning: Integer operands are required for colon operator when used as index


die Ergebnisse passen aber, bis auf die interpol. Da habe ich statt 21424 21423.

Code:

Code:
       totalsamples = size(data.(Channels{z}),1);
        x = 1:totalsamples;
        xq = 1:k(z)/fs:totalsamples;


Es sind einmal Zeilenvektoren und Spalenvektoren, gibt es einen Befehl, damit es einheitlich ist ? (siehe Bild)

Danke für die Hilfe.

Grüße

Unbenannt.JPG
 Beschreibung:

Download
 Dateiname:  Unbenannt.JPG
 Dateigröße:  25.12 KB
 Heruntergeladen:  260 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Warning: Integer operands are required for colon operator when used as index

Die Warnung ist doch recht klar, oder? Man könnte die Schrittweite beispielsweise runden.

Zitat:
die Ergebnisse passen aber, bis auf die interpol. Da habe ich statt 21424 21423.

Dann nutze mal den Debugger um zu schauen, woran das liegt. Ich würde generell linspace verwenden, wenn ich Vektoren gleicher Länge will.

Zitat:
Es sind einmal Zeilenvektoren und Spalenvektoren, gibt es einen Befehl, damit es einheitlich ist ? (siehe Bild)

Du dürftest besser als ich wissen, welche Vektoren von welchem Fall kommen. Um aus Zeilenvektoren Spaltenvektoren zu machen (oder umgekehrt), braucht man nur zu transponieren ( nachgestelltes ' ).

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