Forum: Digitale Signalverarbeitung / DSP / Machine Learning Methode kleinster Fehlerquadrate einer komplexen Funktion


von branadic (Gast)


Lesenswert?

Hallo,

ich beschäftige mich derzeit mit der Bestimmung der Parameter 
äquivalenter Ersatzschaltbilder aus einer Impedanzmessung heraus (in 
Octave). Ich habe da, dank dem Agilent Impedance Measurement Handbook, 
auch schon Erfolge erzielt und kann die ersten 
3-Elemente-Ersatzschaltbilder extrahieren.
Hat aber schon mal jemand versucht mit der Methode kleinster 
Fehlerquadrate die "Equivalent Circuit Parameter" eines DUT einer 
Impedanzmessung mit Octave bzw. Matlab zu bestimmen?

Die Messung besteht aus drei Vektoren:

1. Vektor: Frequenz
2. Vektor: Betrag der Impedanz
3. Vektor: Phasenwinkel

Alternativ dazu kann die Messung auch durch S11-Parameter beschrieben 
sein, in dem Fall bestehen die Vektoren aus:

1. Vektor: Frequenz
2. Vektor: Realteil S11
3. Vektor: Imaginärteil S11

Die Umrechnung von S11 in Z und umgekehrt stellt kein Problem dar. 
Wichtig ist, Vektor 2 und 3 bilden das komplexe Ergebnis der Form Z=R+jX 
und können nicht losgelöst voneinander betrachten werden.
Nun würde ich gerne die Parameter des äquivalenten Ersatzschaltbildes 
mit der Methode kleinster Fehlerquadrate berechnen wollen, bspw. eine 
einfache Schaltung bestehend aus R || L || C. Wie stelle ich das an?
Das Ersatzschaltbild lässt sich über seine Gesamtimpedanz beschreiben. 
Wie führe ich den Fit aber auf Grundlage des komplexen Ergebnisses 
(Vektor 2 und 3) durch?
Wie errechne ich später aus den Parametern des Polynoms die Werte meiner 
Bauteile im äquivalenten Ersatzschaltbild?

Hat jemand diesbezüglich einen Ansatz für mich? Ich danke euch.

branadic

von Savoo (Gast)


Lesenswert?

Hi

Sehr interessant Frage. Das Problem ist, dass das RLC Filter ein IIR 
Filter ist. Die Wiener-Hof Formel könnte man anwenden um die Parameter 
für ein FIR Filter zu erhalten.
Hoffe jemand kann da weiterhelfen.

von Detlef _. (detlef_a)


Lesenswert?

Hi,

ja, die Berechnung der Bauelementewerte mit der Methode der kleinsten 
Fehlerquadrate funktioniert. Das hätte ich nicht erwartet. Anbei ein 
Matlab Code, der auch in Octave gehen müßte.

Ich gebe mir einen w-Vector vor und berechne die komplexe Impedanz der 
RLC Parallelschaltung.

Dan bastele ich mir die Matrix des linearen Gleichungssystems M und löse 
das mit gausscher Fehlerminimierung. In coff erhalte ich dann die 
Lösung, die Kehr-/werte der Bauelementewerte. Bei realen Messwerten 
werden die vermutlich komplex werden, vielleicht haut das dann nicht 
hin.

clear
r=1;
c=0.5;
L=0.25;
w=logspace(-3,3,1000).';
Hmess=1/r+j*w*c-j./(w*L);
M=[ones(1000,1) j*w -j./w];
coff=inv(M'*M)*M'*Hmess;
return

math rulez!
Cheers
Detlef

von branadic (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Detlef,

danke für deine Antwort. Zunächst einmal, müsste der Ausdruck für die 
Impedanz nicht folgendermaßen lauten:

Hmess=1/r-j*w*C+1./(j*w*L);

denn es gilt:

Xc=-1/(j*w*C) und Xl=j*w*L

entsprechend ist 1/Xc=-j*w*C und 1/Xl=1/(j*w*L).

Ich habe nun also einen komplexen Vektor Z (1x401) der Form R+j*X aus 
einer Messung und den dazugehörigen Vektor omega (1x401) und mein 
Ausdruck schaut dann wie folgt aus:

M=[ones(1,length(omega)) 1./(j*omega) -j*omega];
coff=inv(M'*M)*M'*Z;
return

allerdings mag das so nicht laufen.
Anbei hänge ich mal die beiden mat-Files für Z und omega an.
Das Programm sieht der Vollständigkeit halber dann wie folgt aus:

clear;
load('Z.mat');
load('omega.mat');
M=[ones(1,length(omega)) 1./(j*omega) -j*omega];
coff=inv(M'*M)*M'*Z;
return

Eine Ahnung wo was falsch läuft?

branadic

von Detlef _. (detlef_a)


Lesenswert?

branadic schrieb:
>
> Xc=-1/(j*w*C) und Xl=j*w*L
> entsprechend ist 1/Xc=-j*w*C und 1/Xl=1/(j*w*L).

Hi branadic,

die Impedanz eines Kondensators ist 1/(j*w*C) ohne das '-' Zeichen,
http://de.wikipedia.org/wiki/Kondensator_%28Elektrotechnik%29#Impedanz

entsprechend lautet die Admittanz als Kehrwert der Impedanz j*w*C. 
Impedanz des L : j*w*L, Admittanz 1/(j*w*L), mit j/j erweitert um das j 
aus dem Nenner rauszukriegen macht -j/(w*L).

Ich kann bei mir keinen Fehler entdecken.
Für Deine Daten muß ich bißchen frischer sein, das muß noch warten.

Gute Nacht
Detlef

von Detlef _. (detlef_a)


Lesenswert?

Hi branadic,

Deine Daten zeigen die Impedanz des parallelen RLC, das ist betragsmäßig 
ein 'Hut', wahrend mein script die Admittanz berechnet, das ist nen 
Loch. Du muss zum matchen den Kehrwert Deiner gemessenen Impedanz 
nehmen. Das komplexe matchen funktioniert ganz wunderbar (im angehängten 
script die rote Kurve, Originaldaten in blau), nur leider kommen 
komplexe R,C und L Werte raus, wie erwartet, geht nich.

Man kann das Ding aber gut 'per Hand' matchen. Das Maximum des Batrags 
ist 14000, das ist das r1. c1 fummelt man mit rum, L1 ergibt sich damit 
aus dem omega an der resonanz von 2.02e8 aus w^2=1/(L1*c1). c1 ändert 
man jetzt so, bis die Güte stimmt, also der 'Hut' so breit ist wie in 
der Messung. Das haut gut hin, gruene Kurve: r1=14k, c1 ~ 15pF, L1 ~ 
1.6uH

Cheers
Detlef

ps.: Danke an den Moderator, der den nächtlichen Pöbler abgeschaltet 
hat.

clear;
load z.mat -ascii
load omega.mat -ascii
z=z(1:2:end)+j*z(2:2:end);
w=omega.';
z=z.';

M=[ones(length(w),1) j*w -j./w];
coff=inv(M'*M)*M'*(1./z);

r=1./coff(1);
c=coff(2);
L=1./coff(3);

r1=14000;
c1=0.015*1e-9;
L1=1/(2.02e8.^2*c1)
ch=[1./r1 ; c1 ; 1./L1 ];
plot(w,abs(z),'b.-',w,abs(1./(M*coff)),'r.-',w,abs(1./(M*ch)),'g.-')

return

von branadic (Gast)


Lesenswert?

Hallo Detlef,

sorry das ich mich jetzt erst melde, bin noch nicht früher zu gekommen. 
Das Ganze sieht insgesamt gar nicht mal so schlecht aus. Gute Arbeit, 
danke.
Ich versuche jetzt nur noch die Vergehensweise und Syntax zu verstehen, 
damit ich es auf andere Ersatzschaltbilder anwenden kann.

branadic

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.