VF_xspectrum | VD_xspectrum | VE_xspectrum |
VF_xspectrumAbs | VD_xspectrumAbs | VE_xspectrumAbs |
VFb_xspectrum | VDb_xspectrum | VEb_xspectrum |
VFb_xspectrumAbs | VDb_xspectrumAbs | VEb_xspectrumAbs |
|
Funktion | Kreuz-Leistungs-Spektrum zweier Signale |
|
Syntax C/C++ | #include <VFstd.h>
void VF_xspectrum( cfVector Spc, ui specsiz, fVector X, fVector Y, ui xsiz, fVector Win );
float VF_xspectrumAbs( fVector Spc, ui specsiz, fVector X, fVector Y, ui xsiz, fVector Win );
void VFb_xspectrum( cfVector Spc, ui specsiz, fVector X, fVector Y, ui xsiz, fVector Win, fVector Buf );
float VFb_xspectrumAbs( fVector Spc, ui specsiz, fVector X, fVector Y, ui xsiz, fVector Win, fVector Buf ); |
C++ VecObj | #include <OptiVec.h>
void vector<complex<T>>::xspectrum( const vector<T>& X, const vector<T>& Y, const vector<T>& Win );
T vector<T>::xspectrumAbs( const vector<T>& X, const vector<T>& Y, const vector<T>& Win );
void vector<complex<T>>::b_xspectrum( const vector<T>& X, const vector<T>& Y, const vector<T>& Win, vector<T>& Buf );
T vector<T>::b_xspectrumAbs( const vector<T>& X, const vector<T>& Y, const vector<T>& Win, vector<T>& Buf );
|
Pascal/Delphi | uses VFstd;
procedure VF_xspectrum( Spc:cfVector; specsiz:UIntSize; X,Y:fVector; xsiz:UIntSize; Win:fVector );
function VF_xspectrumAbs( Spc:fVector; specsiz:UIntSize; X,Y:fVector; xsiz:UIntSize; Win:fVector ): Single;
procedure VFb_xspectrum( Spc:cfVector; specsiz:UIntSize; X,Y:fVector; xsiz:UIntSize; Win, Buf:fVector );
function VFb_xspectrumAbs( Spc:fVector; specsiz:UIntSize; X,Y:fVector; xsiz:UIntSize; Win, Buf:fVector ): Single; |
|
CUDA-Funktion C/C++ | #include <cudaVFstd.h>
int cudaVF_xspectrum( cfVector d_Spc, ui specsiz, fVector d_X, fVector d_Y, ui xsiz, fVector d_Win );
void VFcu_xspectrum( cfVector h_Spc, ui specsiz, fVector h_X, fVector h_Y, ui xsiz, fVector h_Win );
int cudaVF_xspectrumAbs( float *h_csdfNyq, fVector d_Spc, ui specsiz, fVector d_X, fVector d_Y, ui xsiz, fVector d_Win );
int cusdVF_xspectrumAbs( float *d_csdfNyq, fVector d_Spc, ui specsiz, fVector d_X, fVector d_Y, ui xsiz, fVector d_Win );
float VFcu_xspectrumAbs( fVector h_Spc, ui specsiz, fVector h_X, fVector h_Y, ui xsiz, fVector h_Win );
|
CUDA-Funktion Pascal/Delphi | uses VFstd;
function cudaVF_xspectrum( d_Spc:cfVector; specsiz:UIntSize; d_X, d_Y:fVector; xsiz:UIntSize; d_Win:fVector ): IntBool;
procedure VFcu_xspectrum( h_Spc:fVector; specsiz:UIntSize; h_X, h_Y:fVector; xsiz:UIntSize; h_Win:fVector );
function cudaVF_xspectrumAbs( var h_csdfNyq:Single; d_Spc:fVector; specsiz:UIntSize; d_X, d_Y:fVector; xsiz:UIntSize; d_Win:fVector ): IntBool;
function cusdVF_xspectrumAbs( d_csdfNyq:PSingle; d_Spc:fVector; specsiz:UIntSize; d_X, d_Y:fVector; xsiz:UIntSize; d_Win:fVector ): IntBool;
function VFcu_xspectrumAbs( h_Spc:fVector; specsiz:UIntSize; h_X, h_Y:fVector; xsiz:UIntSize; h_Win:fVector ): Single;
|
|
Beschreibung | Das Kreuzleistungsspektrum der beiden Datensätze X und Y wird ermittelt. Es ist definiert als das Produkt der Fourier-Transformierten von X mit der Komplex-Konjugierten der Fourier-Transformierten von Y:
SXY = F(X) * F*(Y).
Da das Ergebnis für negative und positive Frequenzen identisch ist, wird hier das sog. Einseitige Kreuzleistungsspektrum gespeichert:
GXY = SXY für f=0, GXY = 2*SXY für f>0.
Das Ergebnis ist komplex außer für die Frequenz 0 und für die Nyquist-Frequenz.
Dementsprechend kann VF_xspectrum das Ergebnis komprimiert in einem komplexen Vektor der Länge specsiz speichern, wobei Spc[0].Re = GXY[0] und Spc[0].Im = GXY[fNyquist] enthalten.
Da das Kreuzleistungsspektrum häufig nicht in komplexer Form benötigt wird, sondern nur als Absolutwert, ist hier eine zweite Form der Funktion implementiert, VF_xspectrumAbs, die diesen Absolutwert als (reellen) Vektor Spc speichert. Um specsiz als ganzzahlige Potenz von 2 definieren zu können, werden hier jedoch nur specsiz Punkte in Spc gespeichert. Der letzte Wert, d.h. die absolute Kreuzleistungsdichte für die Nyquist-Frequenz fc, 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
Spc[specsiz] = VF_xspectrumAbs( Spc, specsiz, X, Y, xsiz, Win );
In diesem Fall muss Spc 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 Kreuzleistungsspektren gemittelt. Jedes Segment der Länge 2*specsiz ergibt die Kreuzleistungsdichte für specsiz+1 Frequenzen (siehe VF_FFT).
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_xspectrum / VF_xspectrumAbs 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_xspectrum / VFb_xspectrumAbs zu verwenden. Die Größe von Buf muss dabei ≥ 4*xsiz + 4*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_xspectrum basiert) mit der Fehlermeldung "Size must be integer power of 2." und bricht das Programm ab. |
|
Rückgabewert | VF_xspectrum: keiner.
VF_xspectrumAbs: spektrale Kreuz-Leistungsdichte bei der Nyquist-Frequenz |
|
|