https://github.com/ElsevierSoftwareX/SOFTX_2019_219
Tip revision: 8449484d61814fb6b89eccbdcc29c5d51481966e authored by Konrad Werys on 07 December 2018, 11:08:10 UTC
travis works again
travis works again
Tip revision: 8449484
OxSignCalculatorRealImag.h
/*!
* \file OxSignCalculatorRealImag.h
* \author Konrad Werys
* \date 2018/08/01
*/
#ifndef Tomato_OXSIGNCALCULATORRealImag_H
#define Tomato_OXSIGNCALCULATORRealImag_H
#include "OxSignCalculator.h"
#include "KWUtil.h"
namespace Ox {
/**
* \class SignCalculatorRealImag
* \brief
* \details
* @tparam MeasureType
*/
template< typename MeasureType >
class SignCalculatorRealImag : public SignCalculator<MeasureType> {
public:
virtual int calculateSign(){
return RealMagPhase2Signs(
this->getNSamples(),
this->getSigMag(),
this->getSigPha(),
this->getSignal(),
this->getSigns());
};
static int RealMagPhase2Signs(
int nSamples,
const MeasureType* sigMag,
const MeasureType* sigPha,
MeasureType* signal,
MeasureType* signs);
/**
* cloning
* @return
*/
virtual SignCalculator<MeasureType> *newByCloning() { return new SignCalculatorRealImag<MeasureType>(*this); }
};
template<typename MeasureType>
int
SignCalculatorRealImag<MeasureType>
::RealMagPhase2Signs(
int nSamples,
const MeasureType* sigMag,
const MeasureType* sigPha,
MeasureType* signal,
MeasureType* signs) {
// for (int i = 0; i < nSamples; ++i) {
// signal[i] = sigMag[i];
// signs[i] = 0;
// }
//TODO: introduce arbitrary scaling, not only /4096
if (sigPha) { // if phase available
double sigPhaRefPi = M_PI * sigPha[nSamples - 1] / 4096; //get REFERENCE phase
for (int i = 0; i < nSamples; ++i) {
double sigPhaPi = M_PI * sigPha[i] / 4096; //get phase
double pha = sigPhaPi - sigPhaRefPi;
double realSig = sigMag[i] * cos(pha); //get real
double imagSig = -sigMag[i] * sin(pha); //get imag
//signal[i] = realSig;
if (realSig < 0) {
signal[i] = -sigMag[i];
signs[i] = -1;
} else {
signal[i] = sigMag[i];
signs[i] = 1;
}
}
} else {
return 1; // failure
}
return 0; // success
}
} //namespace Ox
#endif //Tomato_OXSIGNCALCULATOR_H