laforge
/
openbts-osmo
Archived
1
0
Fork 0

transceiver: simplify transmit power control

UHD will internally accept floats with a range of +/-1.0,
which corresponds to a 16-bit signed integer range of
apporximately +/- 32000. Set the default amplitude to .3,
which is a safe value agaist saturation elsewhere in the
transmit chain.

The non-UHD maximum amplitude is unchanged at 13500.

Remove digital gain control because it's unnecessary and
causes extra load on enbedded systems.

Signed-off-by: Thomas Tsou <ttsou@vt.edu>
This commit is contained in:
Thomas Tsou 2011-05-25 17:18:10 -07:00
parent acdb4969d5
commit e161523c8b
8 changed files with 19 additions and 39 deletions

View File

@ -397,8 +397,7 @@ SoftVector *Transceiver::pullRadioVector(GSM::Time &wTime,
*DFEFeedback[timeslot]);
}
wTime = rxBurst->time();
// FIXME: what is full scale for the USRP? we get more that 12 bits of resolution...
RSSI = (int) floor(20.0*log10(9450.0/amplitude.abs()));
RSSI = (int) floor(20.0*log10(rxFullScale/amplitude.abs()));
LOG(DEBUG) << "RSSI: " << RSSI;
timingOffset = (int) round(TOA*256.0/mSamplesPerSymbol);
}

View File

@ -39,11 +39,14 @@
This value is generally empirically measured.
smpl_buf_sz - The receive sample buffer size in bytes.
tx_ampl - Transmit amplitude must be between 0 and 1.0
*/
const bool use_ext_ref = false;
const double master_clk_rt = 100e6;
const double rx_smpl_offset = .00005;
const size_t smpl_buf_sz = (1 << 20);
const float tx_ampl = .3;
/** Timestamp conversion
@param timestamp a UHD or OpenBTS timestamp
@ -158,8 +161,8 @@ public:
inline TIMESTAMP initialWriteTimestamp() { return 0; }
inline TIMESTAMP initialReadTimestamp() { return 0; }
inline double fullScaleInputValue() { return 13500.0; }
inline double fullScaleOutputValue() { return 9450.0; }
inline double fullScaleInputValue() { return 32000 * tx_ampl; }
inline double fullScaleOutputValue() { return 32000; }
double setRxGain(double db);
double getRxGain(void) { return rx_gain; }

View File

@ -58,7 +58,6 @@ RadioInterface::RadioInterface(RadioDevice *wUsrp,
receiveOffset = wReceiveOffset;
samplesPerSymbol = wSamplesPerSymbol;
mClock.set(wStartTime);
powerScaling = 1.0;
}
RadioInterface::~RadioInterface(void) {
@ -82,12 +81,7 @@ double RadioInterface::fullScaleOutputValue(void) {
void RadioInterface::setPowerAttenuation(double atten)
{
double HWatten = usrp->setTxGain(usrp->maxTxGain() - atten);
atten -= HWatten;
if (atten < 1.0)
powerScaling = 1.0;
else
powerScaling = 1.0 / sqrt(pow(10, (atten / 10.0)));
usrp->setTxGain(usrp->maxTxGain() - atten);
}
short *RadioInterface::USRPifyVector(signalVector &wVector)
@ -155,7 +149,7 @@ void RadioInterface::pushBuffer(void) {
delete inputVector;
// Set transmit gain and power here.
scaleVector(*resampledVector, powerScaling * usrp->fullScaleInputValue());
scaleVector(*resampledVector, usrp->fullScaleInputValue());
short *resampledVectorShort = USRPifyVector(*resampledVector);

View File

@ -142,8 +142,6 @@ private:
bool mOn; ///< indicates radio is on
double powerScaling;
/** format samples to USRP */
short *USRPifyVector(signalVector &wVector);

View File

@ -401,7 +401,6 @@ SoftVector *Transceiver::pullRadioVector(GSM::Time &wTime,
*DFEFeedback[timeslot]);
}
wTime = rxBurst->time();
// FIXME: what is full scale for the USRP? we get more that 12 bits of resolution...
RSSI = (int) floor(20.0*log10(rxFullScale/amplitude.abs()));
LOG(DEBUG) << "RSSI: " << RSSI;
timingOffset = (int) round(TOA*256.0/mSamplesPerSymbol);

View File

@ -39,11 +39,14 @@
This value is generally empirically measured.
smpl_buf_sz - The receive sample buffer size in bytes.
tx_ampl - Transmit amplitude must be between 0 and 1.0
*/
const bool use_ext_ref = false;
const double master_clk_rt = 52e6;
const double rx_smpl_offset = .0000869;
const size_t smpl_buf_sz = (1 << 20);
const float tx_ampl = .3;
/** Timestamp conversion
@param timestamp a UHD or OpenBTS timestamp
@ -158,8 +161,8 @@ public:
inline TIMESTAMP initialWriteTimestamp() { return 0; }
inline TIMESTAMP initialReadTimestamp() { return 0; }
inline double fullScaleInputValue() { return 13500.0; }
inline double fullScaleOutputValue() { return 9450.0; }
inline double fullScaleInputValue() { return 32000 * tx_ampl; }
inline double fullScaleOutputValue() { return 32000; }
double setRxGain(double db);
double getRxGain(void) { return rx_gain; }

View File

@ -91,7 +91,6 @@ RadioInterface::RadioInterface(RadioDevice *wRadio,
receiveOffset = wReceiveOffset;
samplesPerSymbol = wRadioOversampling;
mClock.set(wStartTime);
powerScaling = 1.0;
}
RadioInterface::~RadioInterface(void) {
@ -109,18 +108,11 @@ double RadioInterface::fullScaleOutputValue(void) {
void RadioInterface::setPowerAttenuation(double atten)
{
double HWatten = mRadio->setTxGain(mRadio->maxTxGain() - atten);
atten -= HWatten;
if (atten < 1.0)
powerScaling = 1.0;
else
powerScaling = 1.0 / sqrt(pow(10, (atten / 10.0)));
mRadio->setTxGain(mRadio->maxTxGain() - atten);
}
short *RadioInterface::radioifyVector(signalVector &wVector, short *retVector, double scale, bool zeroOut)
short *RadioInterface::radioifyVector(signalVector &wVector, short *retVector, bool zeroOut)
{
signalVector::iterator itr = wVector.begin();
short *shortItr = retVector;
if (zeroOut) {
@ -130,13 +122,6 @@ short *RadioInterface::radioifyVector(signalVector &wVector, short *retVector, d
itr++;
}
}
else if (scale != 1.0) {
while (itr < wVector.end()) {
*shortItr++ = (short) (itr->real()*scale);
*shortItr++ = (short) (itr->imag()*scale);
itr++;
}
}
else {
while (itr < wVector.end()) {
*shortItr++ = (short) (itr->real());
@ -146,7 +131,6 @@ short *RadioInterface::radioifyVector(signalVector &wVector, short *retVector, d
}
return retVector;
}
void RadioInterface::unRadioifyVector(short *shortVector, signalVector& newVector)
@ -254,7 +238,7 @@ void RadioInterface::driveTransmitRadio(signalVector &radioBurst, bool zeroBurst
if (!mOn) return;
radioifyVector(radioBurst, sendBuffer+sendCursor, powerScaling, zeroBurst);
radioifyVector(radioBurst, sendBuffer+sendCursor, zeroBurst);
sendCursor += (radioBurst.size()*2);

View File

@ -161,7 +161,7 @@ private:
double powerScaling;
/** format samples to USRP */
short *radioifyVector(signalVector &wVector, short *shortVector, double scale, bool zeroOut);
short *radioifyVector(signalVector &wVector, short *shortVector, bool zeroOut);
/** format samples from USRP */
void unRadioifyVector(short *shortVector, signalVector &wVector);