ich arbeite an einem Projekt (EMG) und bin eigentlich ein Matlab - Frischling, und hab mit Programmierung (noch) wenig am Hut. Die Frage ist, ob ihr mir vielleicht helfen könnt! Hab in den Ganzen Foren viel gesehen, und ich bin mir sicher dass es grundsätzlich möglich ist, aber leider weiß ich nicht wie:
Ich habe ein EMG Signal (20 Minuten lang - beim Radfahren). Ich möchte nur die Muskelkontraktionen herausfiltern und pro Muskelkontration möchte ich dann die Medianfrequenz und den RMS Wert(e) haben! Ich könnte mit dem Programm manuell Events generieren, so wie ich mir das vorstelle, Problem ist, dass ich etwa 9 Muskeln pro Probanden habe und etwa 10 Messungen - das heißt ich würde manuell wortwörtlich alt werden - zusätzlich kann ich nur subjektiv entscheiden wann eine Kontraktion (burst) stattfindet und wann diese wieder aufhört wodurch die Genauigkeit und der Messfehler stark variiert.
als Ergenis wünsche ich mir dann einen Spaltenfektor, der mir zur zeit x einen y-Wert (Medianfrequenz, gemittelte RMS) liefert und zur zeit xn die n te Medianfrequenz bzw. gemittelte RMS).
Meine Frage ist: ist das überhaupt möglich ???
Es wäre natürlich eine große Hilfe, könnte ich das automatisch machen! Lt. Literatur wird der "Onset" definiert: die schwingung größer als 3*std über ein Zeitfenster von 50ms.
Würde mich sehr freuen, wenn mir jemand helfen könnte!
Ab genau diesem Satz ist die Frage nicht mehr klar. Was heißt "ein Signal haben" genau?
Zitat:
Meine Frage ist: ist das überhaupt möglich ;) ???
Ich bin fest überzeugt, dass "das" möglich ist. Aber die Beschreibung ist noch viel zu allgemein um nachvollziehen zu können, welches konkrete Problem Du lösen möchtest.
Das Anfügen der Mail-Adresse ist im Forum nicht gerne gesehen. Ein Forum lebt davon, dass auch andere von der Lösung profitieren können. Wenn Du das Problem privat besprechen möchtest und den Helfer für seine Arbeiten auch entlohnen möchtest, wäre die "Programmieraufträge"-Kategorie passend.
Man sieht dass ich ein absoluter Frischling bin, und mich damit ganz wenig auskenne Mein Problem ist, dass ich dass was ich will nicht wirklich in Wort fassen kann, aber ich versuche es einmal!
Was ich mit dem EMG messe, sind Muskelaktivitäten. Wenn ein Muskel ruht, rauscht das Signal um die Nulllinie (geht ganz wenig auf und ab) und in der aktiven Phase, wenn der Muskel innerviert sind die Spannungen bedeutend höher! (Habe ein Bild hochgeladen und rot eingekreist - und ist die aktive Innervaionsphase)
Im Internet habe ich einen Code gefunden, der für eine Muskelkontraktion den On und Offset bestimmen kann:
Code:
function onoff = emgonoff(rawemg, fs, ws, sd) % EMGONOFF - Find on/off times and indicies of raw EMG data. % Calculate average(mean) value of resting EMG % Define "on" EMG as the sample where average value of EMG in a given window % range around the sample is a given # of std. dev. above avg. resting EMG.
%
% onoff = emgonoff(rawemg, fs, ws, sd)
%
% Use the mouse to select two ranges of "resting" EMG from a graph of the % full-wave rectified EMG data. Click four times: start and end of 1st % resting range, and start and end of 2nd resting range. Mouse clicks need % to be consecutive and in order of increasing time (i.e. left-to-right on % the graph). The first range should precede the EMG burst associated with % the muscle contraction under consideration. The sedond range should be % the resting EMG data immediately following the EMG burst.
%
% rawemg = input file raw emg data (1-column vector) % fs = sampling rate of raw EMG data in Hz % ws = window size in milliseconds (50ms @ 2400Hz = 120 samples) % sd = number of std. deviations above resting rms emg to trigger an "ON" % Default values: % ws = 50ms % sd = 1
% Algorythm for EMG onset & offset taken from % Hodges, P.W. and B.H. Bui, _A comparison of computer-based methods for % the determination of onset of muscle contraction using electromyography._ % Electroencephalography & Clinical Neurophysiology, 1996. 101(6): p. 511-9
%
% Created by: Kieran A. Coghlan, BSME, MSES % SUNY at Buffalo, New York % <kc_news@sonic.net> % Last modified: 1 May, 2006
%% Check inputs for defaults ifnargin < 2, error('Not enough inputs. Type "help emgonoff" for help.'); end ifnargin < 3, ws = 50; end ifnargin < 4, sd = 1; end;
%% Full-Wave-Rectify the raw data
fwlo = abs(rawemg(:,1));
%% prepare for loop % Get two ranges for resting emg (before & after burst) using ginput
R = input('\nUse the mouse to select FOUR points to define the begining and \nend of two data ranges that will be used to calculate average\nresting EMG values before and after the EMG burst (muscle contraction)\nPress [RETURN] to begin: ');
clear R;
f1 = figure;
plot(fwlo);
[x y] = ginput(4); %click four times: two for start/end of resting emg before burst two for resting emg after burst
x = round(x);
clear y;
%close(f1);clear f1; % Leave commented if you want to keep EMG graph up to % % do a visual QA of on/off results.
%% preallocate arrays
mvgav = zeros(x(4)-x(1),1);
onoff(1,1) = 0;
i=0;
restav = mean(fwlo(x(1):x(2))); %average value of rest EMG before ON
reststd = std(fwlo(x(1):x(2))); %std. dev. of rest EMG before ON
restav2 = mean(fwlo(x(3):x(4))); %average value of rest EMG after OFF
reststd2 = std(fwlo(x(3):x(4))); %std. dev. of rest EMG after OFF
%% window size (in samples) = ws*fs e.g. 50ms*2400Hz = 120 samples
sws2 = fs*(0.001*ws);
sws = 0.5*(sws2);
sws = round(sws);
%% find "ON" index: % for xi, change from x(1) to x(2) if you want to ignore any "blips" % within the resting range.
%xi = x(1);
xi = x(2);
xi = round(xi);
for n = 2:length(mvgav);
mvgav(n,1) = mean(fwlo((xi-sws):(xi+sws)));
if mvgav(n) > restav+sd*reststd;
i = i+1;
onoff(i,1) = xi;
break end
xi = xi+1;
end
%% find "OFF" index: clear n xi i
mvgav2=zeros(x(4)-x(1),1);
i=0;
xi=onoff(1,1)+(1/2)*(x(3)-onoff(1,1)); %start OFF search approx. 1/2 way through ON burst.
%% OFF loop:
xi=round(xi);
for n=2:length(mvgav2);
mvgav2(n,1)=mean(fwlo((xi-sws):(xi+sws)));
if mvgav2(n)<restav2+sd*reststd2;
i=i+1;
onoff(i,2)=xi;
break end
xi=xi+1;
end
Betrachte ich dann nur die aktive Phase, aber im Prinzip nur für eine Kontraktion --> ein rot eingekreister Bereich
Bei meiner Messung habe ich ein Signal über 20 Minuten lang, mit wechselndem On/Offset. Da ich jetzt über die gesamte Zeitdauer die neuromuskuläre Ermüdung (FFT/medianfrequenz) betrachten will, möchte ich die Medianfrequenz NUR in der aktiven Kontraktionsphase des Muskels betrachten!
WAS ICH BRAUCHE:
Eine Funktion, die mir automatisch die jeweiligen Muskelkontraktionen erkennt, und in diesem ON/OFFSET-Intervall (rot eingekreister Bereich) die Medianfrequenz berechnet und als Datenpunkt einzeichnet und am Besten in eine Array Dataset ('Filename'<(n) x 1> double) einträgt! und das Punkt für Punkt, Kontraktion für Kontraktion bis das Signal vorbei ist:
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
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.