Forum: Digitale Signalverarbeitung / DSP / Machine Learning Dekonvulotionsfilter aus Sprungantwort berechnen


von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Hier -> (Beitrag "Zeitverhalten von Stromverstärker optimieren") hatte ich nach 
Möglichkeiten zur Optimierung des Zeitverhaltens einer 
spannungsgesteuerten Stromquelle gefragt. Die Antworten und Hinweise 
haben mir geholfen und der Verstärker ist in Betrieb. Ich hatte nun noch 
eine weitere Idee das Zeitverhalten zu verbessern, die technisch von 
einer ganz anderen Seite kommt und insofern vielleicht einen neuen 
Thread rechtfertig.

Die anhängende Abbildung zeigt, wie für einen Spannungssprung am Eingang 
des Verstärkers (unteres Diagramm) der ausgegebene Strom folgt (oberes 
Diagramm). Mit geht es nun darum, einen möglichst schnellen Sprung ohne 
großes Überschwingen am Ausgang zu bekommen. Ich glaube, dass ich die 
analogen Möglichkeiten der Frequenzkompensation in der Rückkopplung 
erstmal praktisch ausgeschöpft habe (gehen wir hier zumindest mal davon 
aus, darum ging es in o.g. Thread).

Mein Gedanke war nun: die Steuerspannung für die Stromquelle (unteres 
Diagramm) wird von einem halbwegs schnellen (100 ks/sec) und 
hochauflösenden (16 bit) DA-Interface per PC erzeugt. Da das System 
insgesamt open-loop läuft, könnte ich das Steuersignal im Vorhinein 
digital filtern, bevor es analog auf den Treiber geht. Es müsste ja 
möglich sein, aus der vorliegenden Sprungantwort eine Art 
Dekonvulotionsfilter zu berechnen, das den Overshot noch etwas 
minimiert. Mal ganz naiv für ein Rechteck gedacht: im Moment des 
Overshots müsste das Steuersignal ein entsprechendes Tal haben (in der 
Zeit), das den Overshot abfängt. Das Ganze müsste man doch eigentlich in 
einem Filter abbilden können, der dann natürlich auch für andere 
Signalformen funktioniert.

Was ich mir dazu bisher angelesen habe (bin Laie!), funktioniert leider 
in der Praxis nicht. Wenn ich es richtig verstanden habe, überträgt man 
den gewünschten und tatsächlichen Signalverlauf in die Frequenzdomäne 
(per FFT), teilt die beiden Spektren durcheinander und transformiert 
dann zurück in die Zeit (inverse FFT), wodurch man den erforderliche 
Filterkern erhalten sollte. Ich habe ganz naiv mal folgendes in Matlab 
gemacht, mein Filterkern besteht dann aber nur aus Rauschen.
1
% actual respone a
2
A = fft(a);
3
4
% desired response d
5
D = fft(d);
6
7
C = D ./ A;
8
9
c = ifft(C);

Falls die Grundidee überhaupt richtig ist (ist sie?), ist meine 
Implementierung vermutlich falsch ... Kann mir da jemand etwas unter die 
Arme greifen?

Vielen Dank!

von Dergute W. (derguteweka)


Lesenswert?

Moin,
1
help deconv

Gruss
WK

von Rolf S. (audiorolf)


Lesenswert?

Ich habe das jetzt sicher 3x durchgelesen. Aber ich verstehe nicht, was 
das Ziel der Anstrengung ist. Für die Rückberechnung braucht es 
eigentlich eine inverse Transformation.

von A. S. (rava)


Lesenswert?

Ganz den Grundlagen folgend könnte man so vorgehen:


Deine (wohl lineare Strecke) hat eine (unbekannte) Impulsantwort g, die 
per Faltung aus u(t) das Signal y1(t) macht.

> y1(t) = u(t) * g(t)

Du suchst jetzt ein Filter r, in das du dein jetziges Rechteck-u 
reinfüttern kannst, sodass sich ein neues Ausgangssignal ergibt

> u'(t) = u(t) * r(t)
> y2(t) = u'(t) * g(t)

Dann möchtest du r so wählen, dass du mit y2(t) möglichst genau w(t) 
triffst. Ein Regelkreis gibt es dazu aber nicht, also tun 
Modellierungsfehler und Rauschen natürlich ziemlich weh.

Das klingt jetzt alles schwierig, aber vielleicht ist es ja einfacher 
für dich, alles zeitdiskret aufzuschreiben. Deine hardware scheint ja 
ohnehin zeitdiskret zu arbeiten.

Im Zeitdiskreten wird aus deiner Faltung (*) eine einfache gewichtete 
Summe. Schreib das ruhig mal ausführlich auf Papier. Da die Beziehungen 
oben zu jedem Zeitpunkt t gelten soll, wird aus jeder Zeile eine 
Matrixmultiplikation.

Es sollte möglich sein, die Unbekannten g herauszukürzen und nur noch r 
als Unbekannte zu haben. Die Signale werden an der Stelle natürlich über 
Einzelwerte dargestellt.

Irgendwann wirst du mathematisch einige Dinge definieren müssen:
* wie ist die Impulsantwort deines Filters r(t) parameterisiert, z.B. 
Länge bei FIR?
* wie definierst du ein Gütemaß um den Fehler zwischen y2 und u mit 
einer Zahl zu bewerten?

Dann kann man alles als Optimierungsfproblem formulieren und dieses 
lösen. Mit anderen Worten: deine Gleichungssysteme sollten überbestimmt 
sein (also: wenige Parameter in r), sonst siehst du im Ergebnis nur 
Rauschen.

von Fabian S. (fab_s)


Lesenswert?

Die Grundidee ist richtig und die Implementierung auch, allerdings gilt 
das nur für LTI Systeme. Dein System wird aber nichtlinear (z.B. 
Sättigungseffekte) und nicht zeitinvariant sein (z.B. 
Temperaturabhängigkeit).
Selbst wenn gibt es immer noch Probleme in der Praxis, weil du 
Nullstellen in deinem Nenner haben könntest und weil Rauschen 
überproportional verstärkt wird (wie wahrscheinlich bei dir). Es gibt 
hierfür besondere Dekonvolutionstechniken (z.B. Wiener Dekonvolution), 
die aber nicht mehr so einfach umzusetzen sind.
Lade doch mal A, D, C und c hoch.
Bei der FFT muss man noch beachten dass die Signallänge eine 
Zweierpotenz sein muss, ansonsten füllt der Algorithmus es mit Nullen 
auf, in deinem Fall entsteht so ein Sprung, der gar nicht da ist, weil 
du einen Offset hast.

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.