Verfasst am: 26.05.2011, 07:40
Titel: Peaks aus Vektor ausschneiden und formatieren
Moin zusammen,
nicht das man mich falsch versteht, wie ich einen Peak aus einem Vektor ausschneide ist mir mitlerweile bekannt allerdings habe ich jetzt eine kleine Weiterentwicklung vor.
Ich habe einen Vektor mit Beschleunigungswerten, eher gesagt so an die 150.
In diesem Signal stecken 16 Peaks, jeweils 8 im positiven und negativen.
Diese sind weiterhin unterteilt in 4 hohe und je davor 4 niedrigere Peaks.
Wer es kennt, es ist eine Kantenanregung vom Pkw.
Besteht irgendwie die Möglichkeit, die hohen Peaks auszuschneiden in einen seoeraten Vektor zu packen, mit der Bedingung, dass jeweils 0,75s vor und 0,25s nach dem Signal die Werte mit ausgeschnitten werden und in den Vektor gepackt werden?
Hallo,
ist bekannt, um welchen Faktor die hohen und/oder die mittleren Peaks über dem normalen Level liegen (eine Art SNR), also zumindest grob? Dann wäre es doch relativ einfach das Signal auf den Maximalwert zu normieren, mit find() heraus zu finden welche Peaks über dieser Schwelle liegen und dann so in der Art (i-3:i+1) (i ist die Stelle mit dem Peak, Zeitauflösung jetzt mit 0.25s angenommen) aus dem Vektor zu kopieren. Falls du das ganze mit abs() machst, dann erwischst du sowohl die positiven als auch die negativen.
Oder habe ich etwas falsch verstanden?
mfg
Ich weiss nicht ob ich dein Problem richtig verstanden habe, aber hier mein Vorschlag
sofern du findpeaks hast:
einfach nach den lokalen Maximas suchen,
Zusatzoption minpeakhight vorgeben damit MATLAB nur Peaks oberhalb der vorgegebenen Grenze findet ,
dabei die Stellen der Maximas mitfesthalten
und dann in einer Schleife vorgeben dass MATLAB für jeden Eintrag der Peaksvektor ein Segment aus deinem Zeitsignal ausschneiden soll.
Je nach dem ob es wichtig ist ob die lokale Maximas negativ oder positiv sortiert sein müssen, kannst du den Betrag des Vektors nehmen oder den Vorgang 2 mal durchführen (negative Werte und positive Werte)
so könnte es aussehen
entschuldigt, dass ich mich so spät melde.
Ich werde mal alles Chronologisch abarbeiten:
ist bekannt, um welchen Faktor die hohen und/oder die mittleren Peaks über dem normalen Level liegen (eine Art SNR), also zumindest grob?
Nein, das ist leider nicht bekannt!
Nun zum Vorschlag von Kia:
Ich habe findpeaks und die Idee ist genau der richtige Ansatz.
Allerdings bin ich anscheinend zu doof um das fertig zu stellen.
Das Momentane Problem liegt darin, dass ich kein Signal habe mit nur 4 sauberen Peaks. Ich habe eine Frequenz von 4096 bei der Messung und somit bei einem MPH=10 schon 81 Peaks die aufgenommen werden!
Das sind leider 77 zu viel.
Ich versuche mein Problem noch mal zu konkretisieren!
Bei meiner Messung haben wir Schwingungen aufgenommen, es gibt 4 Anregungen, 2 große und 2 kleine. Das System schwingt stark nach und somit gibt es viele Peaks. Es handelt sich nicht um eine schöne Sinusschwingung.
Ich denke hier steckt die Schwierigkeit, da diese Ausschläge einen deutlichen Größenunterschied haben und die größeren Ausschläge viele Nachschwingungen haben mit dem selben Größenausschlag wie bei den kleinen Anregungen.
Das heißt, ich benötige klar differenzierte Ausschnitte aus meinen Messungen.
Meine Idee geht in die Richtung, dass man irgendwie sagen muss, es werden 4 Maximas gesucht, suche nach dem 1., schneide jeweils 1 Sekunde vorher und 1 Sekunde nachher ab und stecke diese in einen neuen Vektor. Dann such weiter nach dem nächsten Maximum und mach das Selbe, etc. Ich weiß, dass das mit Matlab lösbar ist, denn Matlab kann alles, allerdings bin ich wirklich ein Einsteiger und auf Hilfe angewiesen.
vielleicht auch wichtig, ich benötige als neuen Wert meine Zeit und Beschleunigungswerte als Ausgabe in einen neuen Vektor (Matrix).
Kam vielleicht bisher nicht so rüber!
Hi,
naja so 100% kann ich mir deine Schwingungen leider nicht bildlich vorstellen?
kannst du vielleicht ein Plot von deinen SChwingungen hier hochladen oder ggf. den Messvektor?
Kann dir die Messmatrix geben. Spalte 1 ist die Zeit, Spalte 2 die Beschleunigung. 1=x, 2=y
Bin allerdings dann doch schon etwas weitergekommen. Ich bekomme jetzt die 4 Maximas indem ich noch den Vergleich mit den nebenstehenden Daten mit einbezogen habe , minpeakdistance , allerdings fehlt mir jetzt noch die Zuordnung zu meinem Zeitvektor und das Ausschneiden und einbinden der Maximas in einen neuen Vektor{neue Matrix}!
also wenn du deine Peaks hast dann kannst du doch die zuordnen. ich habe ja da oben geschrieben wie man Stellen, an denen diese Peaks sind bestimmen kann (locs) und diese Stellen sind diesselbe in deinem Zeitvektor
Du definierst dann eine untere und eine obere Grenze, d.h. viele Messwerte vor dem Peak und nach dem Peak zu deinen einzelnen Ausschnitten gehören und erstellst dann anhand einfacher Schleife für jeden Ausschnitt einen Vektor. Entsprechend kann geht man auch für Zeit vor!
Das zusammenführen der Vektoren kriegst du wahrschleich auch allein hin oder?
absolut recht haste, habe das aber jetzt etwas anders gelöst, da ich diesen ganzen Schleifenkram nicht so gut leiden kann.
Wenn du eine Vereinfachung siehst bin ich für jeden Tipp dankbar und auch gerne mit Dokumentation.
Habe noch ein weiteres Problem jetzt bekommen, beim laden der rohdaten 2 und rohdaten 3 bekomme ich die ehlermeldung Internal size mismatch. Weißt du worauf sich das bezieht?
Also die 3 Datensätze liegen nicht im selben Ordner und ich arbeite im Ordner der Datei zu rohdaten1!
Greetz
Code:
% .txt-Datei in Matlab einlesen ( Matrixform )
rohdaten1=dlmread('C:\Users\Norman\Desktop\LMS txt von KW15\01_white_20kmh_1\a3.txt', '\t', [230685631]); % Einlesen von Zeile 23 Spalte 1 bis Zeile 68563 Spalte 2; C:\Users\Norman\Desktop\LMS txt von KW15\01_white_20kmh_1; vorne weg die Angabe der aufzurufenden Datei, im Arbeitsordner liegen haben, ansonsten muss der komplette Pfad angegeben werden.
rohdaten2=dlmread('C:\Users\Norman\Desktop\LMS txt von KW15\01_white_20kmh_2\aa3.txt', '\t', [230685631]);
rohdaten3=dlmread('C:\Users\Norman\Desktop\LMS txt von KW15\01_white_20kmh_3\aaa3.txt', '\t', [230685631]);
% Aufteilen in Zeit- u. Wertevektor
time1=rohdaten1(:,1); % (:,1) Alle Zeilen, nur 1. Spalte
acceleration1=rohdaten1(:,2); % (:,2) Alle Zeilen, nur 2. Spalte
% FFT für first1 ( nach Skript_Matlab_Simulink mit Hanning )
t1=first(:,1)'; % Zuweisung der Vektoren für die erleichte-
x1=first(:,2)'; % rung der FFT-Formel
T1=diff(t1(1:2)); % Hier wird die Abtastzeit berechnet (aus dem Zeitvektor die Differenz von Zeile 1 zu Zeile 2)
N1=length(x1); % Bestimmung der Länge des Datenvektors
f1=(0:(N1-1)/2)/(N1*T1); % Frequenzvektor für den Plot
% FFT für second1 ( nach Skript_Matlab_Simulink mit Hanning )
t2=second1(:,1)'; % Zuweisung der Vektoren für die erleichte-
x2=second1(:,2)'; % rung der FFT-Formel
T2=diff(t2(1:2)); % Hier wird die Abtastzeit berechnet (aus dem Zeitvektor die Differenz von Zeile 1 zu Zeile 2)
N2=length(x2); % Bestimmung der Länge des Datenvektors
f2=(0:(N2-1)/2)/(N2*T2); % Frequenzvektor für den Plot
% FFT für third1 ( nach Skript_Matlab_Simulink mit Hanning)
t3=third1(:,1)'; % Zuweisung der Vektoren für die erleichte-
x3=third1(:,2)'; % rung der FFT-Formel
T3=diff(t3(1:2)); % Hier wird die Abtastzeit berechnet (aus dem Zeitvektor die Differenz von Zeile 1 zu Zeile 2)
N3=length(x3); % Bestimmung der Länge des Datenvektors
f3=(0:(N3-1)/2)/(N3*T3); % Frequenzvektor für den Plot
% FFT für fourth1 ( nach Skript_Matlab_Simulink mit Hanning)
t4=fourth1(:,1)'; % Zuweisung der Vektoren für die erleichte-
x4=fourth1(:,2)'; % rung der FFT-Formel
T4=diff(t4(1:2)); % Hier wird die Abtastzeit berechnet (aus dem Zeitvektor die Differenz von Zeile 1 zu Zeile 2)
N4=length(x4); % Bestimmung der Länge des Datenvektors
f4=(0:(N4-1)/2)/(N4*T4); % Frequenzvektor für den Plot
soweit hab ich alle Probleme gelöst aber falls jemand Zeit und Lust hat das alles etwas zu vereinfachen und schöner zu gestalten, einfach machen.
Also jetzt ohne Spass, ich bin froh, dass es so erstmal funktioniert aber wer es besser kann oder andere Tipps hat immer her damit. Ich will halt dazulernen.
Greetz
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.