// in-place addition!! bool addVector(signalVector &x, signalVector &y) { signalVector::iterator xP = x.begin(); signalVector::iterator yP = y.begin(); signalVector::iterator xPEnd = x.end(); signalVector::iterator yPEnd = y.end(); while ((xP < xPEnd) && (yP < yPEnd)) { *xP = *xP + *yP; xP++; yP++; } return true; }
void GMSKReverseRotate(signalVector &x) { signalVector::iterator xPtr= x.begin(); signalVector::iterator rotPtr = GMSKReverseRotation->begin(); if (x.isRealOnly()) { while (xPtr < x.end()) { *xPtr = *rotPtr++ * (xPtr->real()); xPtr++; } } else { while (xPtr < x.end()) { *xPtr = *rotPtr++ * (*xPtr); xPtr++; } } }
float vectorNorm2(const signalVector &x) { signalVector::const_iterator xPtr = x.begin(); float Energy = 0.0; for (;xPtr != x.end();xPtr++) { Energy += xPtr->norm2(); } return Energy; }
/** in-place conjugation */ void conjugateVector(signalVector &x) { if (x.isRealOnly()) return; signalVector::iterator xP = x.begin(); signalVector::iterator xPEnd = x.end(); while (xP < xPEnd) { *xP = xP->conj(); xP++; } }
void delayVector(signalVector &wBurst, float delay) { int intOffset = (int) floor(delay); float fracOffset = delay - intOffset; // do fractional shift first, only do it for reasonable offsets if (fabs(fracOffset) > 1e-2) { // create sinc function static complex staticData[21]; signalVector sincVector(staticData,0,21); sincVector.isRealOnly(true); signalVector::iterator sincBurstItr = sincVector.begin(); for (int i = 0; i < 21; i++) *sincBurstItr++ = (complex) sinc(M_PI_F*(i-10-fracOffset)); static complex shiftedData[300]; signalVector shiftedBurst(shiftedData,0,wBurst.size()); convolve(&wBurst,&sincVector,&shiftedBurst,NO_DELAY); wBurst.clone(shiftedBurst); } if (intOffset < 0) { intOffset = -intOffset; signalVector::iterator wBurstItr = wBurst.begin(); signalVector::iterator shiftedItr = wBurst.begin()+intOffset; while (shiftedItr < wBurst.end()) *wBurstItr++ = *shiftedItr++; while (wBurstItr < wBurst.end()) *wBurstItr++ = 0.0; } else { signalVector::iterator wBurstItr = wBurst.end()-1; signalVector::iterator shiftedItr = wBurst.end()-1-intOffset; while (shiftedItr >= wBurst.begin()) *wBurstItr-- = *shiftedItr--; while (wBurstItr >= wBurst.begin()) *wBurstItr-- = 0.0; } }
void RadioInterface::unRadioifyVector(short *shortVector, signalVector& newVector) { signalVector::iterator itr = newVector.begin(); short *shortItr = shortVector; while (itr < newVector.end()) { *itr++ = Complex<float>(*(shortItr),*(shortItr+1)); //LOG(DEEPDEBUG) << (*(itr-1)); shortItr += 2; } }
void offsetVector(signalVector &x, complex offset) { signalVector::iterator xP = x.begin(); signalVector::iterator xPEnd = x.end(); if (!x.isRealOnly()) { while (xP < xPEnd) { *xP += offset; xP++; } } else { while (xP < xPEnd) { *xP = xP->real() + offset; xP++; } } }
void scaleVector(signalVector &x, complex scale) { signalVector::iterator xP = x.begin(); signalVector::iterator xPEnd = x.end(); if (!x.isRealOnly()) { while (xP < xPEnd) { *xP = *xP * scale; xP++; } } else { while (xP < xPEnd) { *xP = xP->real() * scale; xP++; } } }
void RadioInterface::unUSRPifyVector(short *shortVector, signalVector& newVector) { signalVector::iterator itr = newVector.begin(); short *shortItr = shortVector; // need to flip I and Q from USRP #ifndef SWLOOPBACK #define FLIP_IQ 1 #else #define FLIP_IQ 0 #endif while (itr < newVector.end()) { *itr++ = Complex<float>(usrp_to_host_short(*(shortItr+FLIP_IQ)), usrp_to_host_short(*(shortItr+1-FLIP_IQ))); //LOG(DEEPDEBUG) << (*(itr-1)); shortItr += 2; } }