VF_spectrumVD_spectrumVE_spectrum
Funktionspektrale Leistungsdichte
Syntax C/C++#include <VFstd.h>
float VF_spectrum( fVector Spc, ui specsiz, fVector X, ui xsiz, fVector Win );
C++ VecObj#include <OptiVec.h>
T vector<T>::spectrum( const vector<T>& X, const vector<T>& Win );
Pascal/Delphiuses VFstd;
function VF_spectrum( Spc:fVector; specsiz:UIntSize; X:fVector; xsiz:UIntSize; Win:fVector ): Single;
CUDA-Funktion C/C++#include <cudaVFstd.h>
int cudaVF_spectrum( float *h_psdfNyq, fVector d_Spc, ui specsiz, fVector d_X, ui xsiz, fVector d_Win );
int cusdVF_spectrum( float *d_psdfNyq, fVector d_Spc, ui specsiz, fVector d_X, ui xsiz, fVector d_Win );
float VFcu_spectrum( fVector h_Spc, ui specsiz, fVector h_X, ui xsiz, fVector h_Win );
CUDA-Funktion Pascal/Delphiuses VFstd;
function cudaVF_spectrum( var h_psdfNyq:Single; d_Spc:fVector; specsiz:UIntSize; d_X:fVector; xsiz:UIntSize; d_Win:fVector ): IntBool;
function cusdVF_spectrum( d_psdfNyq:PSingle; d_Spc:fVector; specsiz:UIntSize; d_X:fVector; xsiz:UIntSize; d_Win:fVector ): IntBool;
function VFcu_spectrum( h_Spc:fVector; specsiz:UIntSize; h_X:fVector; xsiz:UIntSize; h_Win:fVector );
BeschreibungDer Datensatz X wird spektral analysiert und die spektrale Leistungsdichte (engl.: power spectral density, PSD, das ist das mittlere Amplituden-Quadrat) in Spc gespeichert. xsiz muss mindestens 2*specsiz betragen und specsiz eine ganzzahlige Potenz von 2 sein. Intern wird X in xsiz*specsiz / 2 Segmente unterteilt und über die für die einzelnen Segmente berechneten Spektren gemittelt. Jedes Segment der Länge 2*specsiz ergibt die PSD für specsiz+1 Frequenzen (siehe VF_FFT). Um specsiz als ganzzahlige Potenz von 2 definieren zu können, werden jedoch nur specsiz Punkte in Spc gespeichert. Der letzte Wert, d.h. die Leistungsdichte 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_spectrum( Spc, specsiz, X, xsiz, Win );
In diesem Fall muss Spc eine Länge von specsiz+1 haben.

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.

Die Qualität des erhaltenen Spektrums kann auf einfache Weise über das Parseval'sche-Theorem getestet werden (wenn Sie durch Aufruf in der eben skizzierten Form auch den Wert an der Nyquist-Frequenz mit gespeichert haben): 1.0/xsize * VF_ssq( X, xsize ) muss ungefähr gleich VF_sum( Spc, specsiz+1 ) sein. Eine große Abweichung zwischen beiden Ausdrücken deutet auf ein zu großes Abtast-Intervall in X.

Ein Beispiel für die Verwendung dieser Funktion ist im Demo-Programm VDEMO gegeben.

FehlerbehandlungWenn size nicht eine Potenz von 2 ist, meldet sich VF_FFT (worauf VF_spectrum basiert) mit der Fehlermeldung "Size must be integer power of 2." und bricht das Programm ab.
Rückgabewertspektrale Leistungsdichte bei der Nyquist-Frequenz
QuerverweisVF_FFT,   VF_convolve,   VF_autocorr,   VF_xcorr,   VF_filter

VectorLib Inhaltsverzeichnis  OptiVec Home