|
funky_Phil |
Forum-Anfänger
|
|
Beiträge: 23
|
|
|
|
Anmeldedatum: 05.01.17
|
|
|
|
Wohnort: Ulm
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 12.03.2017, 03:03
Titel: Feature Analyse
|
|
|
|
|
Also ich habe ein Atmungs-Signal mit Bewegungsartefakte.
-> Siehe Anhang (rot eingekringelt)
Bewegungsartefakte machen sich dadurch bemerkbar, dass
1.) Die Frequenz unmenschlich hoch ist
2.) Die Amplitude (Peak) unmenschlich hoch auschlägt.
Meine Aufgabe:
a)Bewegungsartefakte erkennen
b) ersetzen durch den Mittelwert des gesamten Vekotrs.
Damit das ganze nicht zu einfach wird, setze ich vorraus, dass das ganze Gebiet auch auf den Mittelwert gesetzt werden. -> dabei wäre es cool, wenns stetig bleiben könnte.
Ich hab mittlerweile auch schon eine Idee:
Ich würde als Kriterium für ein Bewegungsartefakt die Nullstellen hernehmen.
Nullstellen hab ich mir damals so programiert:
Als 2. würde ich überall die Abstände berechnen.
also differenz=k+1te-NST zur kten NST usw.
Falls jetzt die Abstände kleiner werden als eine Konstante a dann liegt ein Artefakt vor.
-> Dann speichere den ganzen bereich, wo überall Nst<a in einen seperaten Vektor ab.
Der Bereich des Vektors muss dann aus der ursptünglichen Funktion abgezogen werden und wäre dann zumindest auf Null. Besser wäre es auf den Mittelwert zu setzen.
Es gibt aber auch den Fall, dass die Amplitude höher ist als eine Konstante b.
Daher müsste der Pseudocode für das Gebiet so aussehen:
if Differenz-zwischen-Nullstellen<a ODER Amplitudenpeak>b
dann leg einen neuen Vektor A1 an indem du die folgenden Werte reinspeicherst bis die Differenz-zwischen-Nullstellen>a ist.
jetzt kommt wieder ein Artefakt,
dann mach das gleiche und leg entweder einen Vektor A2 an oder schreibs in A1 rein.
Beschreibung: |
|
Download |
Dateiname: |
Artefakte.jpg |
Dateigröße: |
304.82 KB |
Heruntergeladen: |
458 mal |
Beschreibung: |
|
Download |
Dateiname: |
proband_mit_Artefekaten.mat |
Dateigröße: |
549.24 KB |
Heruntergeladen: |
442 mal |
|
|
|
|
|
Friidayy |
Forum-Century
|
|
Beiträge: 225
|
|
|
|
Anmeldedatum: 17.12.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2012b
|
|
|
|
|
|
Verfasst am: 12.03.2017, 08:59
Titel:
|
|
Hallo,
ich würde hier mit der Funktion
peaks
arbeiten, um die Ausschläge zu erkennen. Alle Peaks, die über einem Schwellwert liegen, dann aus den Messdaten entfernen + weitere Punkte in der Umgebung der Peaks liegen. Ggf. kann es auch nützlich sein den Verlauf zu glätten über
fit
oder PTx-Filter. Gruß
|
|
|
DSP |
Forum-Meister
|
|
Beiträge: 2.117
|
|
|
|
Anmeldedatum: 28.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2014b
|
|
|
|
|
|
Verfasst am: 12.03.2017, 09:28
Titel:
|
|
Hallo,
um größere Frequenz- und Amplitudenbereiche darzustellen, hilft eine logarithmische Skalierung der y- und x-Achse. Ist deine Abtastfreq. Fs wirklich nur 1 Hz? Dann ist der Frequenzbereich des Amplitudenspektrums aber nur 0...0,5 Hz. Fs muss also als exakt angegeben werden.
Was mir noch nicht klar ist...
Zitat: |
b) ersetzen durch den Mittelwert des gesamten Vekotrs. |
Was sagt dieser Mittelwert aus? Im Frequenzbereich entspricht der Mittelwert dem Amplitudenwert bei f0 = 0 Hz. Ist also im Zeitbereich nichts anderes als ein Offset auf der y-Achse.
Um die Maxima zu erhalten hat Friiday schon die Funktion
peaks
genannt. Wenn du eine Frequenzanalyse machen möchtest, könnte sogar ein Spektrogramm die bessere Wahl sein. Hier würdest du neben Frequenz und Amplitude auch die Zeit als 3. Achse haben. Somit kannst du erkennen, wann das Artefakt vorliegt.
Gruß DSP
|
|
|
funky_Phil |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 23
|
|
|
|
Anmeldedatum: 05.01.17
|
|
|
|
Wohnort: Ulm
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 13.03.2017, 01:16
Titel:
|
|
|
|
|
Meine Abtastfrequenz ist 256 Hz.
Das passt schon Ich dachte nur,- damit gehts einfacher und ich wollte mein Problem so unkomliziert wie möglich stellen...
"peaks" ist ein gutes Stichwort! und das mit dem Specktrogamm muss ich mir auch mal überlegen. -> ist praktisch die andere Seite der Medalie
-> Danke schonmal!
Ich habe heute die eine Seite der Medalie programiert, da ja ein Artefakt entweder aus einer erhöhten Frequenz oder eines unmeschlich hohen Peaks ausgeht.
Damit habe ich mir gedacht: "liebes Matlab such mir doch mal die ganzen Nullstellen raus und speicher die in einem Vektor ab". Dann ziehe immer die k+1-te Nullstelle von der k-ten Nullstelle ab. --> Vektor: "Abstand"
Falls jetzt der Differenzwert kleiner als ein Grenzwert ist, dann speichere diesen Wert - Median(eines durchschnittlichen Differenzwertes) in einem Nullervektor ab.
Wenn ich jetzt die Differenzwerte vom vom Nullvekotr abgezogen werden bleiben nur noch mittlere Werte. --> "korrigierter Abstand"
Das löst mein Problem noch nicht wie ich das haben will. Aber ich kann zumindest auf eine durchschnittliche Atemfrequenz zurückschliessen.
Ich denke um das ursprüngichen Problem zuende zu denken, suche ich mir die werte aus meinem Nullvektor und greife an dieser Stelle auf meinen Datenvektor zu und änder diese.
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 13.03.2017, 17:43
Titel:
|
|
Hallo funky_Phil,
Nur ein paar Anmerkungen zum Code:
Ich liebe Matlab's Möglichkeiten den Code zu entschlacken.
Gruß, Jan
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
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.
|
|