#include <FK.h>
Public Member Functions | |
| double | absolutePower (int iComp) const |
| FK (QList< FKStationSignals * > array) | |
| virtual void | initGrid (int n) |
| virtual void | initGrid (double kx, double ky, int index) |
| double | maximumSlowness () const |
| void | setFrequencyBand (const FrequencyBand &f, double windowLength) |
| void | setMaximumSlowness (double slow) |
| void | setMaximumWavenumber (double k) |
| virtual double | value (double kx, double ky) const |
| virtual double | value (double kx, double ky, int index) const |
| ~FK () | |
Protected Member Functions | |
| double | maximumK2 () const |
Protected Attributes | |
| QList< FKStationSignals * > | _array |
| double | _frequency |
| double * | _gaussian |
| double * | _gaussianPtr |
| int | _iFreqMax |
| int | _iFreqMin |
| ArrayCore::FK::FK | ( | QList< FKStationSignals * > | array | ) |
| ArrayCore::FK::~FK | ( | ) | [inline] |
{delete [] _gaussian;}
| double ArrayCore::FK::absolutePower | ( | int | iComp | ) | const |
References _array, _gaussianPtr, _iFreqMax, _iFreqMin, ArrayCore::FKStationSignals::absolutePower(), and ArrayCore::FKStationSignals::isSelected().
Referenced by FKLoopTask::getPower().
{
QList<FKStationSignals *>::const_iterator it=_array.begin();
double absPower=0;
for( ; it!=_array.end(); ++it) {
FKStationSignals * s=static_cast<FKStationSignals *>( *it);
if(s->isSelected()) absPower += s->absolutePower(iComp, _iFreqMin, _iFreqMax, _gaussianPtr);
}
return absPower;
}
| void ArrayCore::FK::initGrid | ( | int | n | ) | [virtual] |
Automatically called by GridSearch upon initialization
Reimplemented from QGpCoreTools::AbstractFunction2.
Reimplemented in ArrayCore::FKHorizontal.
References _array, ArrayCore::FKStationSignals::initPhaseShifts(), and ArrayCore::FKStationSignals::isSelected().
| void ArrayCore::FK::initGrid | ( | double | x, |
| double | y, | ||
| int | index | ||
| ) | [virtual] |
Re-implemement if the computation of value(double x, double y) requires caching for gridded couples (x,y). This fonction initialize the cached values for x and y aligned to a grid and corresponding to index.
Reimplemented from QGpCoreTools::AbstractFunction2.
Reimplemented in ArrayCore::FKHorizontal.
References _array, ArrayCore::FKStationSignals::isSelected(), and ArrayCore::FKStationSignals::setPhaseShift().
{
// Init shift table
for(QList<FKStationSignals *>::iterator it=_array.begin() ; it!=_array.end(); ++it) {
FKStationSignals * s=static_cast<FKStationSignals *>( *it);
if(s->isSelected()) s->setPhaseShift(index, kx , ky);
}
double squaredK=fabs(kx)>fabs(ky) ? kx*kx : ky*ky;
if(squaredK > _squaredKmaxGrid) {
_squaredKmaxGrid=squaredK;
}
}
| double ArrayCore::FK::maximumK2 | ( | ) | const [inline, protected] |
Referenced by ArrayCore::FKHorizontal::value(), ArrayCore::HRFK::value(), and value().
{return _squaredKmaxTotal;}
| double ArrayCore::FK::maximumSlowness | ( | ) | const [inline] |
References QGpCoreTools::sqrt().
{return sqrt(_squaredSlowMax);}
| void ArrayCore::FK::setFrequencyBand | ( | const FrequencyBand & | f, |
| double | windowLength | ||
| ) |
References _frequency, _gaussian, _gaussianPtr, _iFreqMax, _iFreqMin, ArrayCore::FrequencyBand::center(), QGpCoreTools::exp(), ArrayCore::FrequencyBand::halfWidth(), ArrayCore::FrequencyBand::highLimit(), ArrayCore::FrequencyBand::lowLimit(), ArrayCore::FrequencyBand::omega(), and ArrayCore::FrequencyBand::relativeWidth().
Referenced by FKLoopTask::exportMax(), HRFKTimeWindows::setComponent(), and FKTimeWindows::setComponent().
{
_squaredKmaxTotal=f.omega() * f.omega() * _squaredSlowMax;
if(_squaredKmaxTotal > _squaredKmaxGrid) _squaredKmaxTotal=_squaredKmaxGrid;
#define GAUSS_WEIGHTING
// Calculate frequency indexes of the bandwidth limits
_frequency=f.center();
_iFreqMin=(int)round(windowLength*f.lowLimit());
_iFreqMax=(int)round(windowLength*f.highLimit());
delete [] _gaussian;
int iSub=_iFreqMax - _iFreqMin;
_gaussian=new double [iSub+1];
_gaussianPtr=_gaussian-_iFreqMin;
#ifdef GAUSS_WEIGHTING
if(_iFreqMin==_iFreqMax) { // Frequency range reduced to one sample
_gaussianPtr[_iFreqMin]=1.0;
} else {
/*
Multiplication of spectrum by a Gaussian window function:
G(f)=exp(-((2/(b*fc)*(f-fc))^2, hence sigma=b*Fc/sqrt(8), sqrt(8)=2.83
which imply that G(fc-b*fc)=0.01378
*/
double b=2.0/f.relativeWidth();
double a=2.0/(windowLength*f.halfWidth());
for (int i=_iFreqMin; i<=_iFreqMax; i++) {
double v=a*i-b;
_gaussianPtr[i]=exp(-v*v);
}
}
#else
for(int i=_iFreqMin;i<=_iFreqMax;i++ ) {
_gaussianPtr[i]=1.0;
}
#endif
/*for(int i=_iFreqMin;i<=_iFreqMax;i++ ) {
printf("Weighting function %i %lf %lf\n",i,i/windowLength,_gaussianPtr[i]);
}*/
}
| void ArrayCore::FK::setMaximumSlowness | ( | double | slow | ) | [inline] |
Referenced by HRFKTimeWindows::setComponent(), FKTimeWindows::setComponent(), LinearFKPassiveLoopTask::setGrid(), HRFKLoopTask::setGrid(), and FKLoopTask::setGrid().
{_squaredSlowMax=slow*slow;}
| void ArrayCore::FK::setMaximumWavenumber | ( | double | k | ) | [inline] |
Referenced by HRFKTimeWindows::setComponent(), and FKTimeWindows::setComponent().
{_squaredKmaxGrid=k*k;}
| double ArrayCore::FK::value | ( | double | x, |
| double | y | ||
| ) | const [virtual] |
Implemement this function to calculate the 2D function at x and y.
Implements QGpCoreTools::AbstractFunction2.
Reimplemented in ArrayCore::HRFK, and ArrayCore::FKHorizontal.
References _array, _gaussianPtr, _iFreqMax, _iFreqMin, QGpCoreTools::Complex::abs2(), ArrayCore::FKStationSignals::getShiftedSignal(), ArrayCore::FKStationSignals::isSelected(), maximumK2(), and ArrayCore::FKStationSignals::setCurrentShift().
Referenced by HRFKLoopTask::getPower(), and FKLoopTask::getPower().
{
double k2=kx * kx + ky * ky;
if(k2 > maximumK2()) return -1;
QList<FKStationSignals *>::const_iterator it;
for(it=_array.begin(); it!=_array.end(); ++it) {
FKStationSignals * s=static_cast<FKStationSignals *>( *it);
if(s->isSelected()) s->setCurrentShift(kx, ky);
}
double val=0;
for(int i=_iFreqMin;i <= _iFreqMax;i++ ) {
Complex sum;
for(it=_array.begin(); it!=_array.end(); ++it) {
FKStationSignals * s=static_cast<FKStationSignals *>( *it);
if(s->isSelected()) sum += s->getShiftedSignal(0, i);
}
val += sum.abs2() * _gaussianPtr[i];
}
return val;
}
| double ArrayCore::FK::value | ( | double | x, |
| double | y, | ||
| int | index | ||
| ) | const [virtual] |
Re-mplemement this function to calculate the 2D function for x and y aligned to a grid. x and y correspond to index in the grid: index=iy * nx + ix
If nothing is cached re-implementation of this function is useless.
Reimplemented from QGpCoreTools::AbstractFunction2.
Reimplemented in ArrayCore::HRFK, and ArrayCore::FKHorizontal.
References _array, _gaussianPtr, _iFreqMax, _iFreqMin, QGpCoreTools::Complex::abs2(), ArrayCore::FKStationSignals::getShiftedSignal(), ArrayCore::FKStationSignals::isSelected(), and maximumK2().
{
double k2=kx * kx + ky * ky;
if(k2 > maximumK2()) return -1;
QList<FKStationSignals *>::const_iterator it;
double val=0;
for(int i=_iFreqMin;i <= _iFreqMax;i++ ) {
Complex sum;
for(it=_array.begin(); it!=_array.end(); ++it) {
FKStationSignals * s=static_cast<FKStationSignals *>( *it);
if(s->isSelected()) sum += s->getShiftedSignal(0, i, index);
}
val += sum.abs2() * _gaussianPtr[i];
}
//printf("%lg\n",val);
return val;
}
QList<FKStationSignals *> ArrayCore::FK::_array [protected] |
double ArrayCore::FK::_frequency [protected] |
Referenced by ArrayCore::HRFK::initOperator(), and setFrequencyBand().
double* ArrayCore::FK::_gaussian [protected] |
Referenced by FK(), and setFrequencyBand().
double * ArrayCore::FK::_gaussianPtr [protected] |
int ArrayCore::FK::_iFreqMax [protected] |
int ArrayCore::FK::_iFreqMin [protected] |