Verfasst am: 16.03.2012, 18:29
Titel: Überlagerung von gedämpften Schwingungen
Hallo, geehrte Matlab-Profis!
Ich stehe vor einem etwas kleinem Problem und hoffe hier eine Antwort darauf zu finden.
Ich habe Messdaten über der Zeit aufgenommen und möchte diese auswerten. Es ist bekannt, dass die Messdaten eine Überlagerung von gedämpften Schwingungen beschreiben.
Meine Aufgabe ist es, die Koeffizienten (Frequenz , Dämpfung , Amplitude ) der überlagerten Schwingungen herauszufinden:
Ich weiß, dass ich die Frequenzen mittels einer Fouriertransformation FFT bestimmen kann. Theoretisch ist auch das Ablesen der Dämpfung möglich, aber das ist mit den Daten, die ich habe nur sehr schwierig.
Meine Frage ist es, ob es schon eine Toolbox gibt, die mir diese Aufgabe abnehmen kann. Ich habe auch cftool ausprobiert, aber diese schafft nicht immer die wahre Form der Messdaten anzunähern.
Auch wäre es mir lieb, wenn ich nur die ersten drei Schwingungen (mit den größten Amplituden) herauslesen könnte.
Wie gehe ich am besten vor? Sollte ich etwas schlecht beschrieben haben, kann ich es gerne noch näher erläutern.
Ich habe mich mal ein wenig eingelesen und gesehen, dass man die Messdaten als Summe von Übertragungsfunktionen darstellen könnte (mit pem und iddata). Daraus könnte ich die Konstanten ermitteln und einfach in meine Funktion einsetzen.
Es gilt:
für
mit und .
Ich hab es auch schon versucht in Matlab umzusetzen. Meine Messdaten sehen bspw. so aus (Messdaten befinden sich im Anhang):
% Berechnung der Übertragungsfunktion
Ts = 1/20000; % Abtastzeit
u = zeros(length(y), 1); % Speicher für u allokieren
u(1) = 1; % Impulsfunktion
idy = iddata(y, [u u u], Ts); % 3 Eingangsfunktion, um es als Überlagerung von 3 Funktionen darzustellen
m = pem(idy, 'P2DU'); % Berechne Übertragungsfunktion: % P2 = PT2-Glied, D = Totzeit, U = komplexe Polstellen disp('Fertig');
% Berechne y(t)
y_neu = zeros(length(t), 1); % Speicher für das berechnete y for i = 1:length(t) for k = 1:3
kp = m.kp.value(k); % Nehme die Koeffizienten aus der berechneten Übertragungsfunktionen
zeta = m.zeta.value(k);
w0 = 1/m.tw.value(k);
wd = sqrt(1-zeta^2)*w0;
td = m.td.value(k);
y_neu(i) = y_neu(i) + kp*exp(-zeta*w0*(t(i)-td))*sin(wd*(t(i)-td));
end end disp('Fertig');
Ich komme meinem Ziel näher! Anstatt die Parameter einzeln zu übertragen und y(t) über die for-Schleife zu bestimmen, habe ich mit c2d und sim das neue y(t) bestimmt:
Code:
md = c2d(m, Ts); % Vom kontinuierlichen zum diskreten Modell umwandeln
y_neu2 = sim(md, [u u u]); % Simulation für die Eingänge u
Leider stimmt es immer noch nicht wirklich mit den Messdaten überein. Der entscheidende Hinweis fehlt aber immer noch. Irgendwer hat sich doch bestimmt schon einmal mit dem Problem auseinander gesetzt. Ich mache das leider zum ersten Mal und im Forum finde ich nicht so viele Antworten auf meine Fragen.
(Entschuldigt den Doppelpost. Man kann die Beiträge nicht editieren.)
dein problem ist sehr speziell und es hat auch nicht jeder deine toolboxen. das könnte ein grund sein warum du noch keine antworten bekommen hast. zum thema fft giebts hir ein gutes beispiel in der script ecke soweit ich weis. sonst hoff ich mal für dich das das hir bald jemand liest der ahnung von signalverarbeitung hat
Ah, ok. Ich dachte das würde zu der Grundausbildung eines jeden Matlab-Benutzers gehören. Von der Theorie her ist das alles ganz einfach, aber in Matlab sieht das alles merkwürdig aus. Anschauliche Beispiele finde ich leider auch keine.
Ich werde es dann wohl noch etwas ausprobieren und hier im Forum noch einige Beiträge zu FFT anschauen.
also wenn ich das richtig verstanden habe was du vor hast, dann sollte das eigentlich nicht alzu schwierig sein. Die Koeffizienten der Übertragungsfunktion kannst du mit der Identification Toolbox identifizieren. Umrechnen must du diese dann selber.
Für diese vergleichsweise einfache Aufgabe würde ich dir das Gui der Toolbox empfehlen. Einfach mal "ident" eingeben.
Dann kannst du dir beispielsweise ein "Process Modell" oder ein "Polynom Modell" identifizieren lassen. Je nach Anforderung...
Ich glaube dein Modell sollte sogar so als Process Modell verfügbar sein, ist aber schon ne weile her, dass ich mich damit beschäftigt hatte. Schau dir mal hierzu die Hilfe an oder hier ein paar Videos: http://www.mathworks.de/products/sysid/demos.html
Hoffe geholfen zu haben, wenn nicht einfach nochmal nachfragen...
Mit der ident-Toolbox war alles viel einfacher, als sich durch die Befehle zu prügeln.
So konnte ich auch meinen Fehler finden! Bei pem fehlte ein PropertyValue. Da ich Störfrequenzen hatte, musste ein DisturbanceModel ausgewählt werden. Es hätte also lauten müssen:
Man erhält immer bessere Ergebnisse, wenn man bspw. die Frequenz der gedämpften Schwingung mit der größten Amplitude über FFT abliest und dem Modell vorgibt und so die Parameter stark eingrenzt.
Ich habe auch noch eine andere Möglichkeit gefunden. Und zwar mit dem Befehl prony. Es gibt auch eine Toolbox bei Matlab Central. Ich denke damit sollte es auch gut möglich sein, die Parameter zu finden. Leider fehlt mir die Zeit, um dies auszuprobieren.
_____
Hier noch der komplette Code auf einem Blick, falls jemals jemand das gleiche Problem haben sollte:
Code:
% Berechnung der Übertragungsfunktion
Ts = 1/20000; % Abtastzeit
u = zeros(length(y), 1); % Speicher für u allokieren
u(1) = 1; % Impulsfunktion
idy = iddata(y, u, Ts, 'Tstart', 0);
m = pem(idy, 'P2U', 'Dist', 'ARMA2'); % Berechne Übertragungsfunktion: P2 = PT2, D = Totzeit, U = komplexe Polstellen disp('Fertig');
% Simuliere die Daten
md = c2d(m, Ts); % Vom kontinuierlichen zum diskreten Modell umwandeln
y_neu2 = sim(md, u); % Simulation für den Eingang u disp('Fertig');
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.