VF_deconvolveVD_deconvolveVE_deconvolve
VF_deconvolvewEditVD_deconvolvewEditVE_deconvolvewEdit
VFb_deconvolveVDb_deconvolveVEb_deconvolve
VFb_deconvolvewEditVDb_deconvolvewEditVEb_deconvolvewEdit
FunktionEntfaltung (Dekonvolution)
Syntax C/C++#include <VFstd.h>
void VF_deconvolve( fVector Y, fVector Flt, fVector X, fVector Rsp, ui size );
void VF_deconvolvewEdit( fVector Y, fVector Flt, fVector X, fVector Rsp, ui size; fComplex thresh );
void VFb_deconvolve( fVector Y, fVector Flt, fVector X, fVector Rsp, ui size, fVector Buf );
void VFb_deconvolvewEdit( fVector Y, fVector Flt, fVector X, fVector Rsp, ui size; fComplex thresh, fVector Buf );
C++ VecObj#include <OptiVec.h>
void vector<T>::deconvolve( vector<T> Flt, const vector<T>& X, const vector<T>& Rsp );
void vector<T>::deconvolvewEdit( vector<T> Flt, const vector<T>& X, const vector<T>& Rsp, complex<T> thresh );
void vector<T>::b_deconvolve( vector<T> Flt, const vector<T>& X, const vector<T>& Rsp, vector<T> Buf );
void vector<T>::b_deconvolvewEdit( vector<T> Flt, const vector<T>& X, const vector<T>& Rsp, complex<T> thresh, vector<T> Buf );
Pascal/Delphiuses VFstd;
procedure VF_deconvolve( Y, Flt, X, Rsp:fVector; size:UIntSize );
procedure VF_deconvolvewEdit( Y, Flt, X, Rsp:fVector; size:UIntSize; thresh:fComplex );
procedure VFb_deconvolve( Y, Flt, X, Rsp:fVector; size:UIntSize; Buf:fVector );
procedure VFb_deconvolvewEdit( Y, Flt, X, Rsp:fVector; size:UIntSize; thresh:fComplex; Buf:fVector );
CUDA-Funktion C/C++#include <cudaVFstd.h>
int cudaVF_deconvolve( fVector d_Y, fVector d_Flt, fVector d_X, fVector d_Rsp, ui size );
void VFcu_deconvolve( fVector h_Y, fVector h_Flt, fVector h_X, fVector h_Rsp, ui size );
int cudaVF_deconvolvewEdit( fVector d_Y, fVector d_Flt, fVector d_X, fVector d_Rsp, ui size, fComplex thresh );
void VFcu_deconvolvewEdit( fVector h_Y, fVector h_Flt, fVector h_X, fVector h_Rsp, ui size, fComplex thresh );
CUDA-Funktion Pascal/Delphiuses VFstd;
function cudaVF_deconvolve( d_Y, d_Flt, d_X, d_Rsp:fVector; size:UIntSize ): IntBool;
procedure VFcu_deconvolve( h_Y, h_Flt, h_X, h_Rsp:fVector; size:UIntSize );
function cudaVF_deconvolvewEdit( d_Y, d_Flt, d_X, d_Rsp:fVector; size:UIntSize; thresh:fComplex ): IntBool;
procedure VFcu_deconvolvewEdit( h_Y, h_Flt, h_X, h_Rsp:fVector; size:UIntSize; thresh:fComplex );
BeschreibungX wird als das Resultat der Faltung eines "echten" Profils mit der Impulsantwort-Funktion (Response-Funktion) Rsp angenommen. Eine Dekonvolution wird versucht und in Y gespeichert. Ein Filter Flt wird ebenfalls berechnet. Soll die Entfaltung nicht nur für einen einzigen Vektor durchgeführt werden, so sollte für weitere Vektoren nicht wieder VF_deconvolve aufgerufen werden, sondern VF_filter mit Flt als Filter.

Die Response-Funktion Rsp muss mit dem Nullpunkt beim nullten Element vorliegen. Elemente für positive Zeiten (oder was immer die unabhängige Variable ist) folgen in Rsp1 bis Rspsize/2 und die Elemente für negative Zeiten, beginnend mit der am stärksten negativen Zeit, in Rspsize/2+1 bis Rspsize−1. Um diese Ordnung herzustellen, bediene man sich gegebenenfalls der Funktionen VF_rotate oder VF_reflect.

X, Y, Rsp und Flt müssen alle dieselbe Größe size besitzen; diese muss eine ganzzahlige Potenz von 2 sein. X darf durch Y überschrieben werden und Rsp durch Flt, aber X und Flt sowie Y und Rsp müssen voneinander verschieden sein.

Mathematisch ist Flt der Kehrwert der Fourier-Transformierten von Rsp. Falls die Fourier-Transformierte von Rsp Nullen enthält, bedeutet dies jedoch, dass für die jeweilige Frequenz jegliche Information verloren gegangen ist bei der angenommenen Faltung. Sie kann also nicht durch Entfaltung rekonstruiert werden. Man sollte nur für diejenigen Frequenzen eine Rekonstruktion der ursprünglichen Information versuchen, wo auch noch etwas von ihr übrig ist. Hier ist also einer der seltenen Fälle gegeben, wo an die Stelle einer Division durch 0 sinnvoll eine Multiplikation mit 0 tritt! Um Missverständnisse zu vermeiden: Ob besagte Information noch vorhanden ist, lässt sich nicht aus dem Eingangsvektor X entnehmen, sondern liegt allein in der angenommenen Response-Funktion begründet.

Man sollte Entfaltung jedenfalls nicht blind anwenden, sondern am besten die Fourier-Transformierte von Rsp inspizieren und danach für die jeweilige Anwendung entscheiden, was zu tun ist. Wen diese Bemerkungen noch nicht von der Verwendung dieser Entfaltungs-Funktion abgeschreckt haben, für den führt VF_deconvolve standardmäßig eine Editierung des Filters durch. Hierbei werden alle Frequenzen mit einem Filterwert unterhalb der durch Rundungsfehler gegebenen Schwelle "verloren gegeben". Anstelle des Inversen von sehr kleinen Werten (was zu OVERFLOW- oder SING-Fehlern führen könnte) wird wie oben beschrieben Null im Filter gespeichert.
Der standardmäßig verwendete Schwellenwert hierfür kann durch VF_setRspEdit ausgelesen werden. Um für sämtliche Aufrufe von VF_deconvolve und VF_convolve einen anderen Schwellenwert einzustellen, kann die Funktion VF_setRspEdit aufgerufen werden. Diese Methode ist aber nicht fiber-sicher und daher nicht geeignet, um den Schwellenwert bei verschiedenen Aufrufen von VF_deconvolve bzw. VF_convolve unterschiedlich einzustellen. Hier muss die Variante VF_deconvolvewEdit verwendet werden, die den gewünschten Schwellenwert als Argument thresh übernimmt (und die standardmäßig eingestellte Schwelle ignoriert). Da Flt aus komplexen Zahlen besteht und es gelegentlich wünschenswert ist, Real- und Imaginärteile unterschiedlich zu behandeln, ist thresh ebenfalls komplex.

Diese Entfaltung basiert auf der Annahme, X sei periodisch oder konvergiere zumindest an beiden Enden zu demselben Wert (nulltes und letztes Element identisch). Ist dies nicht der Fall, so sollten Randeffekte mit den bei VF_convolve beschriebenen Methoden vermieden werden.

Intern benötigt VF_deconvolve / VF_deconvolvewEdit zusätzlichen Pufferspeicher, der automatisch reserviert und wieder freigegeben wird. Bei wiederholten Aufrufen wäre dies ineffizient. Es wird empfohlen, für solche Fälle stattdessen VFb_deconvolve / VFb_deconvolvewEdit zu verwenden. Die Größe von Buf muss dabei ≥ 2*size sein. Außerdem muss Buf 128-bit (P8) bzw. 256-bit( P9) ausgerichtet sein. Um dies zu garantieren, sollte man nur Vektoren als Buf verwenden, die mit der VF_vector-Familie alloziert wurden.
 

FehlerbehandlungWenn size nicht eine Potenz von 2 ist, meldet sich VF_FFT (worauf VF_deconvolve basiert) mit der Fehlermeldung "Size must be integer power of 2." und bricht das Programm ab.
Wenn über VF_setRspEdit Trunc.Re = Trunc.Im = 0 eingestellt wurde, oder wenn VF_deconvolvewEdit mit fcplx(0,0) als Argument thresh aufgerufen wird, können SING-Fehler entstehen, die zu ±HUGE_VAL als Ergebnisvorschlag führen. In diesem Fall droht allerdings bei der anschließenden Multiplikation von Flt mit der Transformierten von X unbehandelter Fließkomma-Überlauf (dann nämlich, wenn an den fraglichen Frequenzen doch noch Information vorhanden ist, obwohl gemäß der angenommenen Rsp-Funktion gar keine mehr zu erwarten war).
Rückgabewertkeiner
QuerverweisVF_filter,   VF_convolve,   VF_FFT,   VF_xcorr,   VF_spectrum

VectorLib Inhaltsverzeichnis  OptiVec Home