Benutzer-Werkzeuge

Webseiten-Werkzeuge


matlab:mat03

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
matlab:mat03 [21.11.2012 20:46] Filip Cengicmatlab:mat03 [27.11.2022 23:55] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
-====== MAT3 Kugelstoßen ======+====== MAT03 Datenauswertung====== 
 + 
 +^ Autor | Martin Grimmer | 
 +^ Letzte Bearbeitung | 14. Jan 2014 | 
 +^ Matlab Datei | {{:matlab:testdaten.zip| 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. 
 + 
 +<html><pre class="code"> 
 +clc;               %deletes content of command window 
 +clear all;         %deletes workspace 
 +close all;         %closes figures  
 +</pre></html> 
 + 
 +===== Datensatz laden ===== 
 +Als erster Arbeitsschritt werden die Messdaten geleden. Dazu kann man vorerst das Verzeichnis öffnen in welchem die Daten vorliegen. 
 + 
 +<html><pre class="code"> 
 +cd('C:\...');      %Instead of ... use file folder 
 +</pre></html> 
 +Nachfolgend kann der Datensatz geladen werden. 
 + 
 +**Methode V1** 
 + 
 +  
 +<html><pre class="code"> 
 +load Testdaten.mat 
 +</pre></html> 
 + 
 +**Methode V2** 
 +Komfortabler geht dies über eine grafische Benutzeroberfläche. 
 + 
 +<html><pre class="code"> 
 +[FileName,PathName] = uigetfile('*.mat','Select the MATLAB data file'); 
 +cd(PathName); 
 +load(FileName); 
 +</pre></html> 
 + 
 +===== 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. 
 +<html><pre class="code"> 
 +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 
 +</pre></html> 
 + 
 +**Methode V2** 
 +Für die zweite Methode sollte als erstes die Definition einer Kraftschwelle erfolgen, bei welcher der Bodenkontakt als solcher erkannt werden soll. 
 +<html><pre class="code"> 
 +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; 
 +</pre></html> 
 + 
 +===== 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. 
 +<html><pre class="code"> 
 +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; 
 +</pre></html> 
 + 
 +===== Mittelwerte und Standartabweichung ===== 
 +Zur Bildung von Mittelwert und Standartabweichung werden die Befehle mean und std genutzt. 
 +<html><pre class="code"> 
 +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) 
 +</pre></html> 
 +<html><pre class="code"> 
 + 
 +===== 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 
 +</pre></html> 
 + 
 +===== 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. 
 +<html><pre class="code"> 
 +EMG_abs=abs(EMG); 
 +</pre></html> 
 + 
 +Um Verläufe grafisch besser darzustellen wird meist ein Filter genutzt. Hier als Beispiel ein Butterworth Filter. 
 +<html><pre class="code"> 
 +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 
 +</pre></html> 
 + 
 +Zur grafischen Darstellung der 3 Varianten kann folgender Code verwendet werden. 
 +<html><pre class="code"> 
 +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'); 
 +</pre></html> 
 + 
 +===== 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** 
 +<html><pre class="code"> 
 +for subject = 1:5                      %start of for loop, when there are for example 5 subjects 1:5 - 1 to 5 
 +</pre></html> 
 + 
 +**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. 
 +<html><pre class="code"> 
 +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 
 +</pre></html> 
 +**Datensatz speichern** 
 + 
 + 
 +===== Weitere Infos zu MATLAB ===== 
 + 
 +  * [[http://wiki.ifs-tud.de/matlab|Weitere Materialien zu Matlab auf IFS-Wiki]]
  
-^ Modul | [[MATLAB:MAT03|MAT03 - Kugelstoßen in Matlab]]| 
-^ Kategorie | [[:MATLAB| Matlab]]| 
-^ Autor | [[:team#filip_cengic|Filip Cengic]] | 
-^ Voraussetzung | [[:MATLAB:MAT01|Einführung Matlab]] | 
-^ Bearbeitungsdauer | ca. 30 Minuten | 
-<html></br></html> 
-Aufgabe war den **optimalen Winkel** herauszufinden bei einer **Abwurfhöhe von 2,5 m**. Dabei ist die **Weite** des Kugelstoßers vorgegeben (10 m). Im zweiten Aufgabenteil sollte ebenfalls der **optimale Winkel** und die **maximale Weite** bei einer **Abwurfhöhe von 5 m** ermittelt werden. 
-<html></br></html> 
-<html></br></html> 
-Die beiden Lösungen zu den Aufgabenteilen sind in folgender Grafik aufgetragen. Die x-Achse (Winkel) ist bei beiden Grafiken dieselbe, allerdings nicht die y-Achse: Im ersten Aufgabenteil bezeichnen die Funktionswerte die minimale Abwurfgeschwindigkeit (in m/s) für verschiedene Winkel (bei einer vorgegebenen Weite von 10 m).  
-<html></br></html> 
-Aufgabe b) gibt Auskunft über die maximale Wurfweite für verschiedene Abwurfwinkel. Dabei entspricht die Abwurfgeschwindigkeit der errechneten Geschwindigkeit aus dem ersten Aufgabenteil. Somit haben wir 2 Parameter gegeben für die Gleichung des schrägen Wurfs und können nach dem Winkel (3. Parameter) auflösen. Die maximal erreichbare Weite wird pro Iteration zwischengespeichert. Mittels der p-q-Formel lassen sich die Nullstellen (Schnittpunkt der Parabel mit der x-Achse = Wurfweite) bestimmen. Uns interessiert in diesem Fall nur die positive Nullstelle, da wir nicht nach hinten werfen. 
-<html></br></html> 
-<html></br></html> 
-Den optimalen Winkel können wir nun aus beiden Grafen ablesen. Dieser entspricht dem x-Wert der jeweiligen Extrempunkte. In Aufgabe a) liegt ein Tiefpunkt vor und der Hochpunkt im 2. Aufgabenteil gibt uns Informationen über den gesuchten Winkel für die maximale Wurfweite. 
-<html></br></html> 
-<html></br></html> 
-{{:matlab:graph_kugel.jpg?nolink&600|}} 
-<html></br></html> 
-<html></br></html> 
-===== Video - Mathe & Matlab  ===== 
  
-Folgendes Video zeigt einen möglichen Lösungsweg der 3. Übungsaufgabe. 
-<html></br></html> 
-<html></br></html> 
-{{youtube>large:4QKbggZBUBA|Musterloesung der 3. Übungsaufgabe}} 
-<html></br></html> 
-<html></br></html> 
 {{indexmenu_n>3}} {{indexmenu_n>3}}
matlab/mat03.1353527185.txt.gz · Zuletzt geändert: 27.11.2022 23:54 (Externe Bearbeitung)


Warning: Undefined variable $orig_id in /is/htdocs/wp1019470_OPI92FFHXV/www/wikiLehre/lib/plugins/openas/action.php on line 232