WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

[Schwingung] Maxima einer Schwingung zählen mit MATLAB

 

SR66
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 07.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2012, 11:08     Titel: [Schwingung] Maxima einer Schwingung zählen mit MATLAB
  Antworten mit Zitat      
Hallo Leute,

ich bin dabei, diverse, gedämpfte Schwingungen, die mir in einem .txt-File mit den Werten Geschwindigkeit über Zeit vorliegen, auszuwerten. Bisher hab ich jeden Maximalausschlag in einem bestimmten Zeitfenster per Hand gezählt und somit die Dämpfung sowie das log. Dekrement bestimmt.

Da ich nun aber sehr viele Daten zum auswerten habe, würde ich gerne folgendes machen, und dafür brauche ich unbedingt eure kompetente Hilfe, da ich in MATLAB nach wie vor ein totaler Anfänger bin:

Die Auswertung soll nun nicht nach einem Zeitfenster erfolgen, sondern nach einem bestimmten Maximal- und Minimalwert der Schwingung, z. B. von 100mm/s - 10mm/s. In diesem Bereich möchte ich die Anzahl der Maximalausschläge der Schwingung mit MATLAB zählen, da der Aufwand per Hand exorbitant hoch wäre.

Prinzipiell: Wie würde euer Vorgehen aussehen bzw. wie würde ein entsprechendes Programm aussehen? Mein Betreuer hat auch keine Ahnung von MATLAB (weniger als ich). Meine Idee wäre es eine Einhüllende zu bilden und Schnittpunkte zählen zu lassen.

Ich freue mcih über jede Hilfe und ewiger Dank soll euch nacheilen! Wink

Grüße
Hannes
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 19.07.2012, 11:41     Titel:
  Antworten mit Zitat      
ich versteh das problem nicht ganz. was meinst du mit maximal ausschlag. is das ein bestimmter wert oder was?
vieleicht kannst du ja mal ein beispiel skizzieren oder so.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.07.2012, 12:01     Titel: Re: [Schwingung] Maxima einer Schwingung zählen mit MATLAB
  Antworten mit Zitat      
Hallo SR66,

Rauschen die Daten? Das verhindert nämlich eine triviale Suche nach den Maxima:
Code:
strfind([1, -1], diff(signal))


Wenn Du nach den Parametern einer gedämpften Schwingung suchst, wäre natürlich ein Parameter-Schätzer die wissenschaftlich richtige Lösung. Dabei würde man zunächst Startwerte schätzen und dann so lange variieren, bis der Fehler "norm(signal - simulated_signal)" minimal wird. Zu "Parameter esitimation" findest Du viele Hinweise im Netz. Es ist die beste Lösung, aber nicht trivial. Immerhin bietet auch Matlab dafür Toolbox-Funktionen an.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
SR66
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 07.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2012, 13:39     Titel:
  Antworten mit Zitat      
Ich hab anbei mal ne Grafik von ner beliebigen Schwingung angehängt. Rauschen ist vorhanden, jedoch sehr gering.

@ Winkow:
Mit Maximalausschlag meine ich jeweils den Maximalwert einer Schwingung. Dieser Wert nimmt durch die Dämpfung mit jeder Schwingung ab. (siehe Anhang)

@ Jan S:
Parameterschätzer? Ist das wirklich wissenschaftlich? Der angegebene Code von dir - sucht der mir die Maxima "von bis" raus oder wie?

Grüße
Hannes

uni0_15Nm_2_2.png
 Beschreibung:
Ziel ist es, die Maximalauschläge in Abhängigkeit vom Ausschlagswert (z.B. 100mm/s bis 10mm/s) zu zählen und die verstrichene Zeit herauszulesen.

Download
 Dateiname:  uni0_15Nm_2_2.png
 Dateigröße:  7.95 KB
 Heruntergeladen:  1027 mal
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: 19.07.2012, 14:40     Titel:
  Antworten mit Zitat      
Handelt es sich hier lediglich um Systeme 2. Ordnung, wo also nur eine Eigenfreq. vorhanden ist?

Ich weiß nun nicht, auf welche Parameterschätzverfahren sich Jan S. bezieht...aber bei einfachen Systemen geht z.B. ein AR oder ARMA Modell.
Wenn du dann noch das Anregungssignal auf das System hast, wird das ganze noch genauer mit einem ARX oder ARMAX Modell.

Für Systeme 2. Ordnung ohne Rauschen (was man evtl. noch vorher wegfiltern kann), erhält man eine Abweichung von deutlich unter 1% bei der Parameterschätzung (Übertragungsfunktion im z-Bereich).
Private Nachricht senden Benutzer-Profile anzeigen
 
SR66
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 07.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2012, 14:59     Titel:
  Antworten mit Zitat      
Das Anregungssignal hab ich leider nicht, denn es handelt sich um Vorversuche, bei dem die Anregung erst einmal noch nicht berücksichtigt wurde...

Wie genau sähe denn so ein ARMA Modell aus?

Grüße
Hannes
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: 19.07.2012, 15:33     Titel:
  Antworten mit Zitat      
Ein System 2. Ordnung (PT2) ist ein AR Modell

G(s) = 1/ 1 + 2DT s + T² s²

oder allgemein..

G(s) = 1 / a0 + a1*s + a2*s² + a3*s³ + ...

Beim ARMA Modell hat man zusätzlich noch ein Zählerpolynom

G(s) = b0 + b1*s + b2*s² + ... / a0 + a1*s + a2*s² + a3*s³ + ...

Da es sich ja aber hier um ein abgetastetes System handelt, wird in den z-Bereich transformiert und es muss das Abtasthalteglied (AH) bei dem Modell mitberücksichtigt werden.

AH = z - 1 / z

Somit sollte eigentlich bei einem AR Prozess eines diskreten Systems ein ARMA Modell für die Parameterschätzung festgelegt werden. Abschließend kann dann wieder in den s-Bereich transformiert werden.


Code:

% Abtastrate
Ts = 1/600;
% Abtastfrequenz
fs = 1/Ts;
% Nyquistfreqenz
fn = 0.5*fs;
% Anzahl Messwerte
N = 4096;%length(signal);  
% Auflösung des Spektrums
df_t = fs/N;
% Frequenzvektor
fy = (0:df_t:fn);
% Zeitvektor
T = 0:Ts:(N-1)*Ts;

% Testsignal - gedämpfte Schwingung
tau = 0.5;
f = df_t*50;
signal = exp(-tau.*T) .* sin(2*pi*f*T);
signal = signal(:);

% Systemidentifikation
dataset=iddata(signal);
% AR Modell
na=2;  % Ordnung des Nennerpolynoms
sysid = ar(dataset,[na]);
fpe1=fpe(sysid) % Fehler der Schätzung
 


Ein ARMA Modell, also ohne Eingangssignal gibt es allerdings in Matlab nicht. Es gibt hier aber auch noch weitere Modelle...Box-Jenkins (BJ), Output-Error (oe) oder idpoly u.a.

Edit: Sollte es sich hier tatsächlich nur um ein System 2. Ordnung handeln und zu dem das Rauschen so hochfrequent oder minimalst sein, dass es sehr gut von der gedämpften Schwingung getrennt werden kann, kann man sicherlich auch recht gut durch einfache Suche der Maxima in einem Zeitinterval, wie du es selbst schon gemacht hast, zum Ziel kommen.

Du könntest ja zunächst das 1. Maximum suchen und das 1 Minimum. Nun läßt du diesen Teil weg und suchst nur nach dem 1. Minimum wieder das Maximum (in diesem Fall dann das 2. Maximum) usw. Das läßt sich ja sehr leicht umsetzen. Wenn du die Indices der Maxima kennst, ist ja simpel, die Zeiten aus dem Zeitvektro zu holen.
Private Nachricht senden Benutzer-Profile anzeigen
 
SR66
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 07.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2012, 11:40     Titel:
  Antworten mit Zitat      
Ich weiß nicht, inwiefern mit das jetz weiterhilft. Eigentlich würde ich nur gern die Maximalauschläge zwischen 2 Maximas und die dabei verstrichene Zeit wissen... So tief bin ich nicht in Matlab (leider), mit Proportionalgliedern bin ich allerdings schon vertraut... Gibts da keine einfachere Möglichkeit für mein Problem? Embarassed
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: 23.07.2012, 12:02     Titel:
  Antworten mit Zitat      
Aus der Übertragungsfunktion des Modells, die an Hand einer Parameterschätzung der realen Daten erfolgt ist, läßt sich relativ einfach die gesuchte Dämpfung bestimmen Wink

Aber sollten deine Daten der Schwingung wirklich deinem Bsp. entsprechen (keine Störungen und lediglich eine Schwingungsfreq.) wäre es etwas zu viel. Für diesen Fall habe ich dir aber in meinem letzten Post unter dem "Edit" schon einen Vorschlag gemacht.
Private Nachricht senden Benutzer-Profile anzeigen
 
SR66
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 07.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2012, 10:56     Titel:
  Antworten mit Zitat      
Ich wollte eigentlich das Zählen der Maximas von Hand umgehen. Drücke ich mich evtl zu ungenau aus?

Mein Ziel wäre es, wenn Matlab mir die Anzahl der Schwingungen ausspuckt, abhängig von der Amplitude und nicht - wie bisher - von der verstrichenen Zeit (ich gebe Maximal und Minimalwert an). Bestenfalls dann noch die verstrichene Zeit zwischen den Werten wobei ich die zur Not auch schnell per Hand rauslesen kann!

Deinen Vorschlag in Ehren, aber da müsste ich ja wieder per Hand zählen und das gestaltet sich bei x-Datensätzen sehr aufwändig....
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: 24.07.2012, 11:15     Titel:
  Antworten mit Zitat      
Wieso denn von Hand? Das packt man in eine Funktion und ruft diese Funktion dann seperat in einer Schleife für jeden Datensatz auf. Das läßt sich doch auf jeden Fall automatisieren. Das Zählen kann doch die Funktion übernehmen und bestimmt dann auch den Zeitabstand.
Private Nachricht senden Benutzer-Profile anzeigen
 
SR66
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 07.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2012, 17:14     Titel:
  Antworten mit Zitat      
Jau so hatt ich mir das gedacht. Bisher hab ich die Auswertung wie folgt vorgenommen. Mit dem Befehl

Code:
fid=fopen('datensatz.txt');
data=textscan(fid,'%f%f',51200,'headerlines',51207);
t = data{1};
v = data{2};
plot(t,v)


aufgerufen. 1 Sekunde entsprechen 51200 Wertepaare und nach dem Einschwingvorgang wurde mit 51207 Wertepaaren ab Sekunde 1 die Schwingung betrachtet. Daraus hab ich bisher die Anzahl der Schwinungen per Hand gezählt und dies dann mit den Maximal- und Minimalwerten in ein Excel-Sheet getippt und ausrechnen lassen.

Die FFT hab ich auch bei div. Schwingungen ausgewertet, nach dem Beispiel das es hier im Codearchiv gibt. Das hat auch sehr gut geklappt - Danke an den Verfasser hierfür!!

Jetzt ist es ja so, das ich nicht von der Zeit abhängig sein will, da dies meiner Meinung nach gescheiter ist, die Schwingung abhängig vom Ausschlag zu betrachten und die verstrichene Zeit abzulesen.

Wie könnte ich meinen Code entsprechend modifizieren, dass ich auf das gewünschte Ergebnis komme? Der Ansatz mit dem Parameterschätzen scheint mir nicht mal so schlecht, jedoch sehe ich darin eine nicht zu bewältigende Programmierung für mich, da ich in Matlab einfach nicht so fit bin wie ichs gerne wäre...

Ich bedanke mich schon mal jetzt für die kompetente Auskunft!

Grüße
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: 24.07.2012, 17:26     Titel:
  Antworten mit Zitat      
Teste das Bsp. mal...ist das nicht was du suchst? Im Titel des Plots wird dir jetzt die Zeit zwischen 2 aufeinanderfolgenden Maxima angezeigt. Bei diesem Testsignal ändert sich es aber nicht, da nur eine Schwingungsfreq.

Code:

clear;
% Testignal einer gedämpten Schwingung erstellen
% Abtastrate
Ts = 1/1000;
% Abtastfrequenz
fs = 1/Ts;
% Nyquistfreqenz
fn = 0.5*fs;
% Anzahl Messwerte
N = 256;  
% Zeitvektor
T = 0:Ts:(N-1)*Ts;

tau = 0.7; % Abklingkonstante
f = 40; % Schwingungsfreq. in Hz
signal = exp(-tau.*T) .* sin(2*pi*f*T);
%signal = signal(13:end);
%T = T(13:end);

% Amplituden-Bereich festlegen
% ...fehlt noch

i = 1;
[maxima(1),indx_max(i)] = max(signal); % 1. Maximum
[minima(i),indx_min(i)] = min(signal); % i. Minimum

mw_signal = mean(signal); % Mittelwert
% Suche nächsten Punkt der nach Max bzw. Min dem Mittelwert des Signals am
% nächsten liegt
% Unterscheidung ob das Signal zuerst mit einem Max. oder Minimum beginnt
if T(indx_max(i)) > T(indx_min(i))
    k = find( signal(indx_max(i):end) < mw_signal,1,'first' );
    k = k + indx_max(i) - 1;
else
    k = find( signal(indx_min(i):end) > mw_signal,1,'first' );
    k = k + indx_min(i) - 1;
end

figure(1);
plot(T,signal,'b.-');
hold on;
plot(T(indx_min),signal(indx_min),'r*',T(indx_max),signal(indx_max),'g+');
%hold on;
plot(T(k),signal(k),'m.')
line(T,mw_signal,'Color','r','LineWidth',8);
axis([0, T(end), -1.2, 1.2])
xlabel('Zeit [s]');
ylabel('Amplitude')
grid on;

% nächsten Maxs und Mins bestimmen
i = 2;
while k < N
    [minima(i),indx_max(i)] = max(signal(k:end)); % i. Minimum
    [maxima(i),indx_min(i)] = min(signal(k:end)); % i. Maximum
    % Offset von letztem max bzw. min dazu zählen
    indx_max(i) = indx_max(i) + k - 1;%indx_max(i-1);
    indx_min(i) = indx_min(i) + k - 1;%indx_min(i-1);
    % nächsten Wert nahe des Mittelwertes finden
    if (indx_max(i) < N) & (indx_min(i) < N)
        if T(indx_max(i)) > T(indx_min(i))
            k = find( signal(indx_max(i):end) < mw_signal,1,'first' );
            k = k + indx_max(i) - 1;
        else
            k = find( signal(indx_min(i):end) > mw_signal,1,'first' );
            k = k + indx_min(i) - 1;
        end
       
        % Darstellung für jedes i. Max und Min, weiter nach Tastdruck
        hold on;
        plot(T(indx_min),signal(indx_min),'r*',T(indx_max),signal(indx_max),'g+');
        plot(T(k),signal(k),'m.')
        delta_T = abs( T(indx_max(i)) - T(indx_max(i-1)) );
        title(['delta T zwischen Max(',num2str(i),') und Max(',num2str(i-1),')=', num2str(delta_T),' s'],'Fontsize',16);
        grid on;
        pause
       
    else
        k = N; % Suche beendet
        % letzten max und min löschen
        indx_max(end) = [];
        indx_min(end) = [];
    end  
   
    i = i + 1;
end
 



Es müssten ja nicht alle Maxima und Minima gesucht werden...auch deine Amplitudenbereich kann mit einer kleinen Ergänzung noch eingebaut werden.


Diesen Satz verstehe ich nicht...wie begründest du das?
Zitat:
Jetzt ist es ja so, das ich nicht von der Zeit abhängig sein will, da dies meiner Meinung nach gescheiter ist, die Schwingung abhängig vom Ausschlag zu betrachten und die verstrichene Zeit abzulesen.
Private Nachricht senden Benutzer-Profile anzeigen
 
SR66
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 07.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2012, 17:45     Titel:
  Antworten mit Zitat      
WOW vielen vielen Dank DSP!!

Ich werd das ausprobieren und mich auf jeden Fall hier nochmal melden.

Durch den Code werden jetz aber nur 2 Schwingungen betrachtet oder? Da die Schwingung ja abklingt, gibt es immer ein nächstes Minimum. Ich probiers einfach mal aus.

Das Problem ist, das ich verschiedene Materialien vermesse. Dadurch hat natürlich jedes Material eine andere Dämpfung, Eigenfrequenz etc. Zudem hab ich kein konstante Anregung.

Um meiner Meinung nach ein besser reproduzierbares Ergebnis auch ohne definierte Anregung zu bekommen, will ich nun überprüfen, wieviel Zeit jeweils zwischen 2 konstant festgelegten Ausschlägen verstreicht.
Beispiel:
Material 1: Abklingen von 100mm/s auf 10mm/s in 20s.
Material 2: Abklingen von 100mm/s auf 10mm/s in 40s. usw.

Eigentlich müssten sich die selben Parameter wie auf Zeitbasis ergeben. Um sicher zu gehen möchte ich dieses überprüfen.

Eine definierte Anregung wird in den nächsten Wochen appliziert. Diese Anregung soll jedoch nur als Triggersignal, ähnlich DIRAC-Impuls, gelten um die Messung präziser zu gestalten. Also: Messgerägt empfängt elektrischen Impuls der Anregung und beginnt mit der Messung der Schwingung. Aber das ist ja erst mal noch unwichtig. Es ändert sich durch die Anregung eigentlich nicht viel. Ich hab dadurch halt eine definierte Kraftbeaufschlagung sowie eine exakte Messung der Schwingung über einen bestimmten Zeitbereich.

Ich weiß, ab und an drücke ich mich verwirrend aus. Ich gebe mein Bestes, bei Unklarheiten einfach nachfragen.

Ich bedanke mich nun noch einmal für den Code! Danke für deine Mühe!!

Beste Grüße
Hannes

EDIT:

Dein Code kommt schon nahe an das Gewünschte. Jetzt wird je eine Schwingung betrachtet und die verstrichene Zeit. Ich bräuchte jedoch die Anzahl Schwingungen in einem bestimmten Amplitudenbereich... Wie kann ich das noch einbinden? Bzw. wie vervollständige ich den Code, damit ich mein gewünsches Maxima/Minima eingeben kann?
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: 24.07.2012, 18:01     Titel:
  Antworten mit Zitat      
Das Signal schwingt mit der Frequenz f und klingt exponentiell mit der Konstante tau ab. Dies entspricht einem gedämpften System 2. Ordnung (PT2). Somit ist der Abstand zwischen den Maxima immer gleich, egal an welche Stelle man die Maxima herausnimmt.

Bei einem anderen Material ist dann eben wieder eine andere Freq. wie auch einen andere Abklingkonstante vorhanden. Das ist ja aber für den Algorithmus egal.

Deshalb packst du diesen Alg. in eine Funktion und rufst in einem anderen m-file immer ein Signal auf und übergibst es der Funktion. Diese ermittelt dir dann den Zeitabstand. Das laden des Signal und der Funktionsaufruf kommt in eine Schleife, bis alle Signale analysiert worden sind. Das ist doch wohl machbar...


Edit: Das ist doch aber wieder was anderes...

Zitat:

wieviel Zeit jeweils zwischen 2 konstant festgelegten Ausschlägen verstreicht.
Beispiel:
Material 1: Abklingen von 100mm/s auf 10mm/s in 20s.
Material 2: Abklingen von 100mm/s auf 10mm/s in 40s. usw.


Hierzu müsstest du doch einfach nur den 1. Wert <= 100 mm/s suchen und nun den ersten Wert <= 10 mm/s. Das macht die Funktion find doch mit links. Sie gibt dir die Indizes (Position) der jeweiligen Werte im Amplitudenvektor zurück. Nun musst du diese Indizes doch nur in deinen Zeitvektor einsetzen. Das hat ja hier aber nichts mit den Maxima der Schwingung zu tun.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 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.