|
Autor |
Frequenz und Dämpfung ermitteln |
|
Conrad_22
Junior  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  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  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  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  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  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. |
|
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]
|