Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
Praktikant Toolentwicklung Matlab (m/w)
Branche: Beratung, Expertise, Fahrzeugtechnik, Fahrzeugteile, Technische Dienstleistungen
MBtech Group GmbH & Co. KGaA - Fellbach

Abschlussarbeit / Praktikum: Entwicklung Matlab (m/w)
Branche: Informationstechnologie, Elektrotechnik, Elektronik
GIGATRONIK Technologies GmbH - Ulm

Studentischer Mitarbeiter (m/w) - DevOps / Toolentwicklung
Branche: mehrere
IAV GmbH - Ingenieurgesellschaft Auto und Verkehr - Berlin

Praktikant (m/w) Bereich Konzernvorausentwicklung - Aktoren sicherheitsrelevanter Anwendungen
Branche: Fahrzeugtechnik, Fahrzeugteile, Maschinentechnik, Industrietechnik
MAHLE International GmbH - Stuttgart

Praktikum - Softwareentwicklung Java
Branche: mehrere
IAV GmbH - Ingenieurgesellschaft Auto und Verkehr - Dresden, Gifhorn

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Feature Analyse

 

funky_Phil
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 05.01.17
Wohnort: Ulm
Version: ---
     Beitrag Verfasst am: 12.03.2017, 03:03     Titel: Feature Analyse
  Antworten mit Zitat      
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:



Code:


Fs=1; %Abtastfrequnz
y=AtemungsSignal
t = (0:length(y))/Fs;

%t-Korrdinaten der NST
n=t(diff(sign(y)) ~= 0);

% Y Koordinaten der Nulstellen
 o=zeros([1,length(n)]);
 



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.

Artefakte.jpg
 Beschreibung:

Download
 Dateiname:  Artefakte.jpg
 Dateigröße:  304.82 KB
 Heruntergeladen:  39 mal
proband_mit_Artefekaten.mat
 Beschreibung:

Download
 Dateiname:  proband_mit_Artefekaten.mat
 Dateigröße:  549.24 KB
 Heruntergeladen:  33 mal
Private Nachricht senden Benutzer-Profile anzeigen


Friidayy
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 12.03.2017, 08:59     Titel:
  Antworten mit Zitat      
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ß
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.03.2017, 09:28     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
funky_Phil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 05.01.17
Wohnort: Ulm
Version: ---
     Beitrag Verfasst am: 13.03.2017, 01:16     Titel:
  Antworten mit Zitat      
Meine Abtastfrequenz ist 256 Hz.
Das passt schon Wink 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.




Code:


% x Zeitvektor;
% y Datenvektor;

% falls differenz des signums ungleich null ist, dann gib mir einen Beitrag
n=x(diff(sign(y)) ~= 0);

 o=zeros([1,length(n)]);

%% Zeitdifferenzen berechnen.

Ende=length(n);
for k=1:1:Ende-1
   
Abstand(k)=n(k+1)-n(k);
 
end

 Ende2=length(Abstand);
 Nullvektor=zeros(1,Ende2)

for j=1:Ende2
   
    if Abstand(j)<0.1  
        Nullvektor(j)=Abstand(j)- median(Abstand);
       
end
   end
     
   
korrigierter_Abstand=Abstand-Nullvektor;

 
for i=1:1:Ende2
    Frequenz(i)=1./korrigierter_Abstand(i);
 end
 
 Durchschnittliche_Atemfrequenz=mean(Frequenz)
 Standartabweichung_Atemfrequenz=std(Frequenz)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.481
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.03.2017, 17:43     Titel:
  Antworten mit Zitat      
Hallo funky_Phil,

Nur ein paar Anmerkungen zum Code:
Code:
% falls differenz des signums ungleich null ist, dann gib mir einen Beitrag
n=x(diff(sign(y)) ~= 0);
% o=zeros([1,length(n)]);  % Wird das noch benötigt? "o" ist fast "O" oder "0"

%% Zeitdifferenzen berechnen.
% Ende=length(n);
% for k=1:1:Ende-1
%   Abstand(k)=n(k+1)-n(k);
% end
% Einfacher:
Abstand = diff(n);

% Ende2=length(Abstand);
% Nullvektor=zeros(1,Ende2)
% for j=1:Ende2    
%   if Abstand(j)<0.1  
%        Nullvektor(j)=Abstand(j)- median(Abstand);
%    end
% end
% Einfacher:    
Nullvektor = zeros(1, length(Abstand));
Index = (Abstand < 0.1);
Nullvektor(Index) = Nullvektor(Index) - median(Abstand);
 
korrigierter_Abstand=Abstand-Nullvektor;
 
% for i=1:1:Ende2
%    Frequenz(i)=1./korrigierter_Abstand(i);
% end
% Einfacher:
Frequenz = 1 ./ korrigierter_Abstand;

Ich liebe Matlab's Möglichkeiten den Code zu entschlacken.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2017 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.