VF_coherence | VD_coherence | VE_coherence |
|
Funktion | Kohärenzfunktion zweier Signale |
|
Syntax C/C++ | #include <VFstd.h>
float VF_coherence( fVector Coher, ui specsiz, fVector X, fVector Y, ui xsiz, fVector Win );
float VFb_coherence( fVector Coher, ui specsiz, fVector X, fVector Y, ui xsiz, fVector Win, fVector Buf ); |
C++ VecObj | #include <OptiVec.h>
T vector<T>::coherence( const vector<T>& X, const vector<T>& Y, const vector<T>& Win );
T vector<T>::b_coherence( const vector<T>& X, const vector<T>& Y, const vector<T>& Win, vector<T>& Buf ); |
Pascal/Delphi | uses VFstd;
function VF_coherence( Coher:fVector; specsiz:UIntSize; X,Y:fVector; xsiz:UIntSize; Win:fVector ): Single;
function VFb_coherence( Coher:fVector; specsiz:UIntSize; X,Y:fVector; xsiz:UIntSize; Win, Buf:fVector ): Single; |
|
CUDA-Funktion C/C++ | #include <cudaVFstd.h>
int cudaVF_coherence( float *h_coherfNyq, fVector d_Coher, ui specsiz, fVector d_X, fVector d_Y, ui xsiz, fVector d_Win );
int cusdVF_coherence( float *d_coherfNyq, fVector d_Coher, ui specsiz, fVector d_X, fVector d_Y, ui xsiz, fVector d_Win );
float VFcu_coherence( fVector h_Coher, ui specsiz, fVector h_X, fVector h_Y, ui xsiz, fVector h_Win );
|
CUDA-Funktion Pascal/Delphi | uses VFstd;
function cudaVF_coherence( var h_coherfNyq:Single; d_Coher:fVector; specsiz:UIntSize; d_X, d_Y:fVector; xsiz:UIntSize; d_Win:fVector ): IntBool;
function cusdVF_coherence( d_coherfNyq:PSingle; d_Coher:fVector; specsiz:UIntSize; d_X, d_Y:fVector; xsiz:UIntSize; d_Win:fVector ): IntBool;
function VFcu_coherence( h_Coher:fVector; specsiz:UIntSize; h_X, h_Y:fVector; xsiz:UIntSize; h_Win:fVector ): Single;
|
|
Beschreibung | Die Kohärenzfunktion der beiden Datensätze X und Y wird ermittelt. Sie ist definiert als das Betragsquadrat des Kreuzleistungsspektrums von X und Y dividiert durch das Produkt der beiden Autoleistungsspektren von X und Y:
CXY = SXY2 / (SXX * SYY).
Da das Ergebnis für negative und positive Frequenzen identisch ist, wird hier das Ergebnis nur für f=0 und positive Frequenzen gespeichert.
Um specsiz als ganzzahlige Potenz von 2 definieren zu können, werden hier jedoch nur specsiz Punkte in Spc zurückgegeben. Der letzte Wert, d.h. die Kohärenzfunktion für die Nyquist-Frequenz, wird als Rückgabewert der Funktion behandelt und kann entweder vernachlässigt (durch Aufruf der Funktion wie eine void-Funktion bzw. eine procedure) oder als letztes Element in Spc gespeichert werden durch Aufruf in der Form
Coher[specsiz] = VF_coherence( Coher, specsiz, X, X, xsiz, Win );
In diesem Fall muss Coher eine Länge von specsiz+1 haben.
xsiz muss mindestens 2*specsiz betragen und specsiz eine ganzzahlige Potenz von 2 sein. Intern wird X in xsiz / specsiz - 1 Segmente unterteilt und über die für die einzelnen Segmente berechneten Kreuz- sowie Autoleistungsspektren gemittelt, bevor aus den Mittelwerten die Kohärenzfunktion bestimmt wird.
Win ist ein Fenster, das auf die Datensegmente angewendet wird. Seine Größe ist immer 2*specsiz. Innerhalb der VectorLib-Bibliotheken sind drei Funktionen vorhanden, die passende Fenster erzeugen: VF_Welch, VF_Parzen und VF_Hann. Ein Rechteck-Fenster wird über VF_equ1 erhalten. Von seinem Gebrauch wird hier aber abgeraten.
Intern benötigt VF_coherence 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_coherence zu verwenden. Die Größe von Buf muss dabei ≥ 4*xsiz + 8*specsiz 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. |
|
Fehlerbehandlung | Wenn size nicht eine Potenz von 2 ist, meldet sich VF_FFT (worauf VF_coherence basiert) mit der Fehlermeldung "Size must be integer power of 2." und bricht das Programm ab. |
|
Rückgabewert | Kohärenzfunktion bei der Nyquist-Frequenz |
|
|