MAT03 Datenauswertung

Autor Martin Grimmer
Letzte Bearbeitung 14. Jan 2014
Matlab Datei Testdaten

In diesem Wiki werden wesentliche Schritte zur Auswertung und Darstellung von Messdaten einer Bewegungsanalyse (Kräfte, EMG, etc.) mit Hilfe von MATLAB beschrieben.

Programmoberfläche bereinigen

Für den Beginn eines Quellcodes sind folgende Befehle zu empfehlen.

clc;               %deletes content of command window
clear all;         %deletes workspace
close all;         %closes figures 

Datensatz laden

Als erster Arbeitsschritt werden die Messdaten geleden. Dazu kann man vorerst das Verzeichnis öffnen in welchem die Daten vorliegen.

cd('C:\...');      %Instead of ... use file folder
Nachfolgend kann der Datensatz geladen werden.

Methode V1

load Testdaten.mat

Methode V2 Komfortabler geht dies über eine grafische Benutzeroberfläche.

[FileName,PathName] = uigetfile('*.mat','Select the MATLAB data file');
cd(PathName);
load(FileName);

Schritte, Wiederholungen ausschneiden

Zum ausschneiden von Schritten sollen 2 Methoden vorgestellt werden. Die erste erfolgt manuell ist aber eher ungenau. Die zweite erfolgt automatisch und ist wesentlich reproduzierbarer.

Methode V1 Hier wird vorerst der Datensatz als Vollbildgrafik ausgegeben. Anschließend können über einen Cursor die entsprechenden Start- und Endpunkte angeklickt werden.

hfig=(figure);
set(hfig,'Units', 'Normalized', 'OuterPosition', [0 0 1 1]); %both lines used to plot fullscreen
plot(Fz);                                                    %plot of variable Fz
  
ginput(2);                                                   %ginput creates cursor, in brackets number of positions required 
Start_End=round(ans(:,1));                                %variable Start_End gets X values from ginput

Methode V2 Für die zweite Methode sollte als erstes die Definition einer Kraftschwelle erfolgen, bei welcher der Bodenkontakt als solcher erkannt werden soll.

Level=50;                                     %Level of force where step should be detected 
i=1;                                          %running variable that increases from 1 to the maximum number of frames of Fz
pos=1;                                        %running variable position for saving i values when contact happens
while i < length(Fz)                          %as long i is smaller than length of Fz
    i=i+1;
    if Fz(i) > Level                          %if force of Fz higher than the detection level
        Start_End(pos,1)=i;                %a value for Start_End is saved
        pos=pos+1;                            %to avoid overwriting of Start_End position to save is increased
        while Fz(i) > Level && i < length(Fz) %after finding a value higher than Level the system continious searching for a value smaller than the level
                                              %in addition the system should stop if the increasing variable i reaches the value of the length of Fz (to avoid error)
            i=i+1;
        end;
        Start_End(pos,1)=i;                %if a smaller value is found the value of i (frame) is saved to Start_End
        pos=pos+1;                            %to avoid overwriting of Start_End position to save is increased
    end;
end;

Daten interpolieren

Je nach Versuch sind die ausgeschnittenen Daten unterschiedlich lang. Die Anzahl der Frames unterscheidet sich. Um die Länge der Datensätze zu standartisieren werden diese auf eine einheitliche Länge von 100 Prozent d.h. entsprechend 100 Werte interpoliert.

Dies kann für die Gangdaten von der Landung bis zum Abheben des Fußes (Standphase) oder von der Landung bis zur nächsten Landung (Gangzyklus) erfolgen. Im Beispiel wird der komplette Zyklus ausgeschnitten.

Number_of_Steps=length(Start_End)/2;                   %number of steps should be defined

for i=1:Number_of_Steps-1                              
    data=Fz(Start_End(i*2-1):Start_End(i*2+1));   %data is used from one starting point to the next starting point - whole gait cycle
   
    Fz_100(:,i) = interp1(1 : length(data)  , data   , linspace(1, length(data),100)); 
                 %interp1(original structure, values , new structure                )                                                                     
end;

Mittelwerte und Standartabweichung

Zur Bildung von Mittelwert und Standartabweichung werden die Befehle mean und std genutzt.

Mean_Fz_100=mean(Fz_100,2);            %the number 2 is the dimension used to make the mean from the columns
STD_Fz_100=std(Fz_100,0,2);            %(value,flag,dimension)

===== Datensatz speichern =====
cd 'C:\...';                                  %... should be changed to saving directory
save('Savename.mat','*');                     %'*' saves all variables in workspace, could be replaced by single variable names that should be saved

Bearbeitung EMG Daten

EMG Daten können in einem ersten Schritt durch einen Bandpassfilter z.B. zwischen 5-20Hz und 400-450Hz von unnötigen Störsignalen befreit werden.

In einem zweiten Schritt werden EMG Daten gleichrichtet. Dies bedeutet, dass der Betrag gebildet wird und somit alle negativen Werte positiv werden.

EMG_abs=abs(EMG);

Um Verläufe grafisch besser darzustellen wird meist ein Filter genutzt. Hier als Beispiel ein Butterworth Filter.

fc = 3;                                        % Cut-off frequency (Hz)
fs = 1000;                                     % Sampling rate (Hz)
order = 2;                                     % Filter order
[B,A] = butter(order,fc/(fs/2));               % Coefficients B and A are defined using the inputs

EMG_abs_filt = filtfilt(B,A,EMG_abs);          %EMG data is filtered

Zur grafischen Darstellung der 3 Varianten kann folgender Code verwendet werden.

figure(2);
plot(EMG,'k');hold on;
plot(EMG_abs,'b','LineStyle','--');hold on;
plot(EMG_abs_filt,'r','LineWidth',3);
legend('Measured','Absolute','Filtered Absolute');

Erfassung mehrerer Probanden

Um mehrere Probanden zu erfassen empfielt es sich das Programm in eine Schleife einzubinden. Diese könnte dann wie folgt aussehen.

Programmoberfläche bereinigen

for subject = 1:5                      %start of for loop, when there are for example 5 subjects 1:5 - 1 to 5

Datensatz laden

Schritte, Wiederholungen ausschneiden

Daten interpolieren

Mittelwerte und Standartabweichung

Hier müssen nun die errechnetten Mittelwerte der einzelnen Probanden in eine neue Variable übergeben werden, um im Anschluss ein Mittel aller Probanden zu berechnen.

ALL_Subjects_Mean_Fz_100(:,subjects)=Mean_Fz_100;

end;                                                             %end of for loop 

Mean_ALL_Subjects_Mean_Fz_100=mean(ALL_Subjects_Mean_Fz_100);    %grand mean of the individual subject means
Datensatz speichern

Weitere Infos zu MATLAB

matlab/mat03.txt · Zuletzt geändert: 12.10.2015 15:16 von Dario Tokur
GNU Free Documentation License 1.3
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0