Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Matlab » Frequenz und Dämpfung ermitteln
Autor
Universität/Hochschule J Frequenz und Dämpfung ermitteln
Conrad_22
Junior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 22.01.2016
Mitteilungen: 9
  Themenstart: 2016-05-02

Hallo Forumgemeinde, kurz zum Hintergrund: Habe eine Messung mit einer Aufnahmefrequenz von 10000 Hz durchgeführt. Der Matlab-Plot der Rohdaten zeigt eine gedämpfte Schwingung (im Bsp.bild der rote Graph). Ziel ist es, Frequenz und Dämpfung aus den vorhandenen Messwerten zu ermitteln. Nach der Recherche im Forum bin ich auf den Einsatz eines Butterworth - Tiefpassfilter gestoßen um die Rohdaten zu glätten (im Bsp.bild der blaue Graph). Nun wäre mein Plan beispielsweise die Frequenz über die Zeitsprünge zwischen den Maximas auf manuellem Wege zu ermitteln. Aber das scheint mir sehr umständlich. Zur Frage: Wie könnte ich die Frequenz und Dämpfung mit Matlab ermitteln? Hatte im Forum auch noch die Methode der Fourier-Transformation gesehen. Da ich jedoch kein Spezialist bin, hab ich leider großes Bedenken diese Methode zeitnah umsetzen zu können. Vielen Dank für eure Antworten. ### Graph: http://matheplanet.com/matheplanet/nuke/html/uploads/a/44933_Messauswertung.jpg ###MatlabCode: clear; clc; close all; %Kanal 1 A = xlsread('Kanal_1_Test.xlsx'); %Einlesen von Zeit und Amplitude t1 = A(:,1); Amp1 = A(:,2); plot(t1,Amp1,'red'); grid on hold on xlim([3.9 4.6]); %% T I E F P A S S F I L T E R [b,a] = butter(2,0.02,'low'); B = filtfilt(b,a,Amp1); plot(t1,B,'blue','LineWidth',1.5);


   Profil
emmi82
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 06.05.2013
Mitteilungen: 459
  Beitrag No.1, eingetragen 2016-05-02

Hi, Matlab hat eine FFT-Funktion eingebaut, siehe hier. Der erste Peak vom Betrag der FFT sollte bei der Anzahl Schwingungen liegen, die du in dem Plot zählen kannst. Die Peakbreite hängt bei einer rauscharmen gedämpften Schwingung direkt mit der Dämpfung zusammen; mir kommt es aber hier so vor, als dass die Dämpfung bei der blauen Kurve aber verändert ist gegenüber der roten. Da bin ich nun allerdings kein Experte. emmi


   Profil
Krugman
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 23.05.2006
Mitteilungen: 355
Wohnort: Weil am Rhein
  Beitrag No.2, eingetragen 2016-05-04

Hallo, ich würde dir empfehlen erstmal ohne FFT zu probieren. Man könnte die lokalen Maxima und Minima berechnen und dann eine Polynomfunktion verwenden, um die "Einhüllende" zu berechnen und dadurch auch die Dämpfung herauszubekommen. Hinweis: Mittels FFT wirst du einen Zusammenhang feststellen zwischen Spektrumbreite vs. Dämpfung. Um das genauer zu betrachten, empfehle ich dringend eine vertiefte Aufarbeitung zum Thema FFT. Das wird dir in der Zukunft oft Zeit ersparen, wenn du in dem Thema fit bist. Viele Probleme (Signalverarbeitung) sind einfacher zu lösen, wenn sie Frequenzbereich betrachtet werden. Grüße, Krugman


   Profil
majoka
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 25.02.2014
Mitteilungen: 814
  Beitrag No.3, eingetragen 2016-05-04

Man kann auch versuchen es als Optimierungsproblem aufzufassen, d.h. $\displaystyle \min \sum \left(x(t,p)-xt\right)^2 $ wobei $x(t,p)$ die Modellfunktion mit dem Parametervektor $p$ und $xt$ die Messwerte sind. Im dem Code unten habe ich es zunächst die Verschiebung des Signals als bekannt angenommen. $p$ ist dann zusammengesetzt aus der Amplitude, Dämpfung und Frequenz der gedämpften Schwingung. Es ergeben sich zumindest für das erzeugte Testsignal xt ganz brauchbare Schätzwerte für p. Beim zweiten Durchlauf habe ich zusätzlich die Verschiebung T0 des Signals mit in die Schätzung einbezogen. Hier wird allerdings nur sehr selten ein brauchbares Ergebnis berechnet. \sourceon Matlab T=0.02; tau=5; t=3.9:0.001:5; nt = length(t); % Sprungfkt. sigma = @(t) 1.*(t>=0); T0 = 3.94; % Verschiebung % gedaempfte Schwingung x=@(t,p) p(3)*exp(-p(1)*(t-T0)).*cos(2*pi*p(2)*(t-T0)).*sigma((t-T0)); p = zeros(3,1); p(1) = tau; p(2) = 1/T; p(3) = 80; % verrauschtes Testsignal sigma_n = 4.25; xt = x(t,p)+ sigma_n * randn(1,nt); % Optimierung sigma_init = 4.2; p_init = [3;40;60];%p + sigma_init*randn(3,1); % Initialisierungswert für Optimierung x_f = @(p) sum((x(t,p)-xt).^2); p_est = fminsearch(x_f,p_init) p-p_est figure(1) plot(t,xt,t,x(t,p_est)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% mit Schaetzung der Verschiebung %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % gedaempfte Schwingung x=@(t,p) p(4)*exp(-p(1)*(t-p(3))).*cos(2*pi*p(2)*(t-p(3))).*sigma((t-p(3))); T0 = 3.94; % Verschiebung p = zeros(4,1); p(1) = tau; p(2) = 1/T; p(3) = T0; p(4) = 80; % verrauschtes Testsignal sigma_n = 0.25; xt = x(t,p)+ sigma_n * randn(1,nt); % Optimierung sigma_init = 0.2; p_init = p + sigma_init*randn(4,1); x_f = @(p) sum((x(t,p)-xt).^2); p_est = fminsearch(x_f,p_init) p-p_est figure(2) plot(t,xt,t,x(t,p_est)) \sourceoff


   Profil
Conrad_22
Junior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 22.01.2016
Mitteilungen: 9
  Beitrag No.4, vom Themenstarter, eingetragen 2016-05-11

Vielen Dank für Eure Antworten. Leider hat mir etwas die Zeit gefehlt, mich aktuell tiefer in die FFT-Methode einzuarbeiten. Ich habe es nun nach der vorgeschlagenen Methode von User 'Krugman' gelöst. Noch eine abschließende, allgemeine Frage: Am Ende meiner Analyse nehme ich anhand der lokalen Maximas (Siehe Bild: blaue Punkte) ein Curvefitting (exp1) vor. http://matheplanet.com/matheplanet/nuke/html/uploads/a/44933_Fitting.jpg Hierzu nutze ich die createFit-Function von Matlab welche ich folgendermaßen in meinem Skript aufrufe: [fitresult, gof] = createFit(t_plot, Amp_plot); Aus dem Fitting kann ich die Funktion meiner Hüllkurve auslesen lassen, hier ein Auszug aus dem Command Window: >> fitresult fitresult = General model Exp1: fitresult(x) = a*exp(b*x) Coefficients (with 95% confidence bounds): a = 5.413e+11 (-6.308e+11, 1.713e+12) b = -6.17 (-6.753, -5.588) Nun würde ich gerne den Koeffizienten "b" meiner Exponentialfunktion in eine Matrix schreiben lassen. Gibt es dazu eine Möglichkeit? Vielen Dank für jede Hilfe.


   Profil
Conrad_22
Junior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 22.01.2016
Mitteilungen: 9
  Beitrag No.5, vom Themenstarter, eingetragen 2016-05-11

Funktioniert mit folgendem Befehl: vals = coeffvalues(fitresult)


   Profil
Conrad_22 hat die Antworten auf ihre/seine Frage gesehen.
Conrad_22 hat selbst das Ok-Häkchen gesetzt.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]