MF_convolve
| MD_convolve |
ME_convolve |
MF_convolvewEdit
| MD_convolvewEdit |
ME_convolvewEdit |
MFb_convolve
| MDb_convolve |
MEb_convolve |
MFb_convolvewEdit
| MDb_convolvewEdit |
MEb_convolvewEdit |
|
Funktion | Faltung (Konvolution) mit einer räumlichen Response-Funktion |
|
Syntax C/C++ | #include <MFstd.h>
void MF_convolve( fMatrix Y, fMatrix Flt, fMatrix X, fMatrix Rsp, ui ht, ui len );
void MF_convolvewEdit( fMatrix Y, fMatrix Flt, fMatrix X, fMatrix Rsp, ui ht, ui len, fComplex thresh );
void MFb_convolve( fMatrix Y, fMatrix Flt, fMatrix X, fMatrix Rsp, ui ht, ui len, fVector Buf );
void MFb_convolvewEdit( fMatrix Y, fMatrix Flt, fMatrix X, fMatrix Rsp, ui ht, ui len, fComplex thresh, fVector Buf ); |
C++ MatObj | #include <OptiVec.h>
void matrix<T>::convolve( matrix<T> Flt, const matrix<T>& MX, const matrix<T> Rsp);
void matrix<T>::convolve( matrix<T>* Flt, const matrix<T>& MX, const matrix<T> Rsp);
void matrix<T>::convolvewEdit( matrix<T> Flt, const matrix<T>& MX, const matrix<T> Rsp, complex<T> thresh);
void matrix<T>::convolvewEdit( matrix<T>* Flt, const matrix<T>& MX, const matrix<T> Rsp, complex<T> thresh);
void matrix<T>::b_convolve( matrix<T> Flt, const matrix<T>& MX, const matrix<T> Rsp, vector<T> Buf);
void matrix<T>::b_convolve( matrix<T>* Flt, const matrix<T>& MX, const matrix<T> Rsp, vector<T> Buf);
void matrix<T>::b_convolvewEdit( matrix<T> Flt, const matrix<T>& MX, const matrix<T> Rsp, complex<T> thresh, vector<T> Buf);
void matrix<T>::b_convolvewEdit( matrix<T>* Flt, const matrix<T>& MX, const matrix<T> Rsp, complex<T> thresh, vector<T> Buf); |
Pascal/Delphi | uses MFstd;
procedure MF_convolve( MY, MFlt, MX, MRsp:fMatrix; ht, len:UIntSize );
procedure MF_convolvewEdit( MY, MFlt, MX, MRsp:fMatrix; ht, len:UIntSize; thresh:fComplex );
procedure MFb_convolve( MY, MFlt, MX, MRsp:fMatrix; ht, len:UIntSize; Buf:fVector );
procedure MFb_convolvewEdit( MY, MFlt, MX, MRsp:fMatrix; ht, len:UIntSize; thresh:fComplex; Buf:fVector ); |
|
CUDA-Funktion C/C++ | #include <cudaMFstd.h>
int cudaMF_convolve( fMatrix d_MY, fMatrix d_MFlt, fMatrix d_MX, fMatrix d_MRsp, ui ht, ui len );
void MFcu_convolve( fMatrix h_MY, fMatrix h_MFlt, fMatrix h_MX, fMatrix h_MRsp, ui ht, ui len );
int cudaMF_convolvewEdit( fMatrix d_MY, fMatrix d_MFlt, fMatrix d_MX, fMatrix d_MRsp, ui ht, ui len, fComplex thresh );
void MFcu_convolvewEdit( fMatrix h_MY, fMatrix h_MFlt, fMatrix h_MX, fMatrix h_MRsp, ui ht, ui len, fComplex thresh );
|
CUDA-Funktion Pascal/Delphi | uses MFstd;
function cudaMF_convolve( d_MY, d_MFlt, d_MX, d_MRsp:fMatrix; ht, len:UIntSize ): IntBool;
procedure MFcu_convolve( h_MY, h_MFlt, h_MX, h_MRsp:fMatrix; ht, len:UIntSize );
function cudaMF_convolvewEdit( d_MY, d_MFlt, d_MX, d_MRsp:fMatrix; ht, len:UIntSize; thresh:fComplex ): IntBool;
procedure MFcu_convolvewEdit( h_MY, h_MFlt, h_MX, h_MRsp:fMatrix; ht, len:UIntSize; thresh:fComplex );
|
|
Beschreibung | Die Faltung von MX mit der räumlichen Antwort- (engl. response) Funktion MRsp wird in MY zurückgegeben. Ein Raum-Filter MFlt wird ebenfalls berechnet. Falls mehr als eine Matrix mit derselben MRsp gefaltet werden soll, benutze man MF_convolve nur einmal und verwende anschließend MF_filter für die übrigen Matrizen.
Die Response-Funktion muss so in MRsp übergeben werden, dass jede Zeile i von MRsp die Antwortfunktion für 0 und positive x-Werte als Elemente MRspi,0 bis MRspi,len/2 enthält sowie die Antwortfunktion für negative x-Werte (beginnend mit dem betragsmäßig größten negativen x) in MRspi,len/2+1 bis MRspi,len-1.
Analog muss jede Spalte von MRsp die Übertragunsfunktion für 0 und positive y-Werte als Elemente MRsp0,j bis MRsplen/2,j enthalten sowie die Übertragungsfunktion für negative y-Werte (beginnend mit dem betragsmäßig größten negativen y) in MRsplen/2+1,j bis MRsplen-1,j.
Am besten benutzte man MF_Rows_rotate und MF_Cols_rotate oder MF_Rows_reflect und MF_Cols_reflect, um diese Anordnung zu erhalten und die Matrix der Übertragungsfunktion zu konstruieren.
Das Ergebnis der Faltung erscheint mit der Summe aller Elemente von MRsp skaliert. Im Normalfall sollte MRsp daher auf 1.0 normalisiert werden.
MX, MY, MRsp und MFlt müssen alle dieselben Dimensionen besitzen. Sowohl len als auch ht müssen ganzzahlige Potenzen von 2 sein. MX darf durch MY überschrieben werden und MRsp durch MFlt, aber MX und MFlt sowie MY und MRsp müssen jeweils voneinander verschieden sein.
Eine Response-Funktion, bei der manche Raumfrequenzen so stark gedämpft werden, dass für sie jegliche Information verlorengeht (also z.B. die hohen Frequenzen bei einem Tiefpass-Filter), erkennt man an sehr kleinen Werten von MFlt für die betreffenden Frequenzen. Sehr klein" bedeutet dabei, dass sie relativ zu dem Spitzenwert im Bereich der Genauigkeit des jeweiligen Datentypes liegen. Zur Minimierung von Rundungsfehlern bei der Faltung ersetzt MF_convolve solche sehr kleinen Werte in MFlt durch 0.
Alle ein- und zweidimensionalen Faltungen und Entfaltungen verwenden denselben standardmäßig eingestellten Schwellenwert für diese implizite Filter-Editierung. Er kann durch VF_setRspEdit ausgelesen werden. Um für sämtliche Aufrufe von VF / MF_convolve und VF / MF_deconvolve 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 / MF_convolve bzw. VF / MF_deconvolve unterschiedlich einzustellen. Hier muss die Variante MF_convolvewEdit verwendet werden, die den gewünschten Schwellenwert als Argument thresh übernimmt. Da MFlt aus komplexen Zahlen besteht und es gelegentlich wünschenswert ist, Real- und Imaginärteile unterschiedlich zu behandeln, ist thresh ebenfalls komplex.
Die Eingabe-Matrix wird als in beiden Dimensionen periodisch angenommen. Man vergleiche die Beschreibung von VF_convolve bezüglich der Vermeidung von Randeffekten bei nicht-periodischen Matrizen.
Intern benötigt MF_convolve / MF_convolvewEdit 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 MFb_convolve / MFb_convolvewEdit zu verwenden. Für die Größe von Buf gilt dabei:
C/C++: | sizeof(Buf) >= ht*(len+4) |
Pascal/Delphi: | sizeof(Buf) >= ht*len |
|
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. |
Fehlerbehandlung | Falls entweder len oder ht nicht eine Potenz von 2 ist, meldet sich VF_FFT (worauf MF_convolve basiert) mit der Fehlermeldung "Size must be an integer power of 2" und bricht das Programm ab. |
|
|