Inhaltsverzeichnis
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 folderNachfolgend 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 meansDatensatz speichern