Verfasst am: 29.05.2012, 19:52
Titel: Frequenz an bestimmter Stelle des Signals rausfinden
Hallo Zusammen,
ich habe ein Problem mit meinem Signal im Anhang.
Und zwar möchte ich Grundsätzlich das Oberste Signal unterteilen mithilfe meines mittleren Signals.
Zeitpunkt der Unterteilung ist kurz vor den größeren Peaks.
Das unterste Signal zeigt das Spektrum.
Ich habe schon weitere Sachen für das mittlere Signal versucht um es zu verbesseren unteranderem differentiell gefiltert, verschiedene Hz bereiche gefiltert , Moving average, Moving variance, abs .. aber eindeutiger als jetzt habe ich es nicht hinbekommen.
Ansatz für mich wären jetzt Min Max suche im Mittleren Signal und zu vergleichen ob ich im oberen Signal in einem längeren Bereich kleiner als meine means bin ( das sind die Striche durch das obere Signal).
Ein weitere Ansatz wäre, hier bin ich mir jetzt nicht sicher ob das Spektogramm dafür überhaupt geeignet ist, welche Frequenz ich bei den Peaks im mittleren Signal finde.
das obere Signal ist ein Emg Signal mit 4000 Hz Abtastrate
das mittlere Signal ist ein Accelerometer Signal mit ursprünglich 293 Hz Abtastrate allerdings habe ich das Signal auf entsprechende Länge interpoliert, weshalb ich mir nicht sicher bin ob ich 293Hz oder 4000 Hz für fs angeben soll.
unabhängig davon ist aber egal welche Eingstellung ich verwende für mich nichts auf dem Spektogramm zu erkennen.
Weshalb ich hier mal nachfragen wollte ob man
a) das was ich möchte überhaupt machen kann = frequenz beim Peak rausfinden, wenn nicht wie wäre das dann möglich?
b) ob der Aufruf richtig ist oder ich da irgendwas falsch mache z.b. wie komme ich auf die Windowlänge?
c) ob ihr eine bessere Idee für die Unterteilung der Signale habt
Code:
X =interp.u4(1:79170,10);
ha(1)=subplot(3,1,1); plot(abs(interp.u4(1:79170,2:2:6)));
hold on
plot([1,79170],[meanTa,meanTa],'-m') plot([1,79170],[meanGM,meanGM],'-g') plot([1,79170],[meanGL,meanGL],'-y') hold off
ha(2)=subplot(3,1,2); plot(interp.u4(1:79170,10));
ha(3)=subplot(3,1,3); spectrogram(X,2048,512,1024,4000); view(90,90);
So ganz habe ich noch nicht verstanden, was du genau willst. Kannst du das mit der Unterteilung evtl. noch mal präzisieren? Aber hier mal ein paar Anmerkungen.
Du führst mit der Interpolation ein Upsampling durch. Hierbei entstehen immer Aliasfrequenzen, weshalb man dann ein Aliasingfilter verwendet. Die Funktion resample hat das schon integriert. Die Abtastfreq. musst du natürlich schon richtig angeben, je nach dem wie du sie erhöhst.
nfft und window haben die gleiche Länge...je kleiner du das Fenster machst (Anzahl Messwerte) desto feiner wird deine Freq.-auflösung, aber die Zeitauflösung wird schlechter. Umgekehrt bei größerem Messfenster. Dies hängt zusammen und man kann nicht beides beliebig verändern. noverlap bestimmt, wie viele Messwerte zweier benachbarter Fenster identisch sind...sich also überlappen. In dem Fall noverlap = 0 bzw. nfft/2 ist bei 0 die Auflösung im Zeitbereich ebenfalls niedriger.
Erstmal vorweg das mit dem Spektogramm hab ich nochmal verworfen.
Um die Unterteilung nochmal genauer zu beschreiben habe ich mal ein weiteres Bild angefügt.
Oben das rectifizierte Signal von 3 Muskeln
In der Mitte das Moving average davon mit 100 Samples fenstergröße
Unten die Accelerometer signale in gruen=x blau=y und rot= z Richtung
Was man oben und in der Mitte sieht ist die Muskelaktivität der einzelnen Muskeln während einer Laufübung
Unten sind die dazu korrespondierenden Accelerometersignale dargestellt.
Ein schritt geht von einer schwarzen Linie bis zur nächsten. Und eben genau dies muss ich irgendwie sinvoll finden.
Die kleinen Maxima des Accelerometers in Y richtung (blau) passen relativ gut mit dem Ende eines Schrittes zusammen. Leider eben nicht immer weshalb ich das Ende eines Schrittes gerne mit der Muskelaktivität (oben)
vergleichen möchte. Allerdings fällt mir hierzu kein Kriterium ein im Sinne eines Schwellwertes.
Die ACC signale die man sieht wurden ursprüngl mit 293 Hz aufgezeichnet
Die Muskeln mit 4000 weshalb das ACC interpoliert ist und zudem gefiltert mit 4Hz und 2 Hz LP
Wie könnte ich einen Sinnvollen Schwellwert für die Aktivität oben definieren? bzw wie könnte ich das Signal so glätten dass ich den Zeitpunkt mit wenig / keiner Aktivität finde = Zeitpunkt zw 2 Schritten.
Bist du dir sicher, dass du nicht mit anderen Tiefpassfilter besser fährst, als mit deinem Mittelwertfilter? Das Mittelwertfilter erreicht zwar hohe Dämpfungen...aber die Nebenmaxima klingen nur sehr langsam ab. Wenn nun eine Signalfreq. genau in der Mitte dieses Nebenmaxima liegt, ist das sozusagen der Worst-case, da dort die Dämpfung am niedrigsten ist. Umgekehrt wäre es das Optimum, wenn eine Signalfreq. genau auf eine Nullstelle des MWF fällt, da dort die Dämpfung theoretisch unendlich hoch ist.
Es gibt aber eben auch Filter, deren Nebenmaxima deutlich schneller abklingen und somit in diesem Bereich besser sperren. Kannst du nicht mal einen Plot machen, wo für alle 3 Muskeln das Freq. spektrum dargestellt wird. Nicht mit der Fkt. spectrogram sondern mit fft(). Es gibt hier auch ein Skript "umfassendes FFT Bsp." in der Skriptecke, wo du dir einfach einen Teil (Darstellung 0...fn [Hz]) rauskopierst. Über des Freq. spektrum der Rohdaten, legst du dann mal das Freq.spektrum der gefilterten. Falls du hiermit Probleme hast, kannst du auch allternativ mal die Daten hier anhängen, wenn du sie veröffentliche darfst.
Ansonsten fällt mit da jetzt auch erstmal kein anderer Lösungsvorschlag ein, als es über Schwellenwerte zu realisieren.
Einstellungen und Berechtigungen
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.