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]); *DFEFeedback[timeslot]);
} }
wTime = rxBurst->time(); 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()));
RSSI = (int) floor(20.0*log10(9450.0/amplitude.abs()));
LOG(DEBUG) << "RSSI: " << RSSI; LOG(DEBUG) << "RSSI: " << RSSI;
timingOffset = (int) round(TOA*256.0/mSamplesPerSymbol); timingOffset = (int) round(TOA*256.0/mSamplesPerSymbol);
} }

View File

@ -38,12 +38,15 @@
on the RF side of the timestamping point of the device. on the RF side of the timestamping point of the device.
This value is generally empirically measured. This value is generally empirically measured.
smpl_buf_sz - The receive sample buffer size in bytes. 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 bool use_ext_ref = false;
const double master_clk_rt = 100e6; const double master_clk_rt = 100e6;
const double rx_smpl_offset = .00005; const double rx_smpl_offset = .00005;
const size_t smpl_buf_sz = (1 << 20); const size_t smpl_buf_sz = (1 << 20);
const float tx_ampl = .3;
/** Timestamp conversion /** Timestamp conversion
@param timestamp a UHD or OpenBTS timestamp @param timestamp a UHD or OpenBTS timestamp
@ -158,8 +161,8 @@ public:
inline TIMESTAMP initialWriteTimestamp() { return 0; } inline TIMESTAMP initialWriteTimestamp() { return 0; }
inline TIMESTAMP initialReadTimestamp() { return 0; } inline TIMESTAMP initialReadTimestamp() { return 0; }
inline double fullScaleInputValue() { return 13500.0; } inline double fullScaleInputValue() { return 32000 * tx_ampl; }
inline double fullScaleOutputValue() { return 9450.0; } inline double fullScaleOutputValue() { return 32000; }
double setRxGain(double db); double setRxGain(double db);
double getRxGain(void) { return rx_gain; } double getRxGain(void) { return rx_gain; }

View File

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

View File

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

View File

@ -401,7 +401,6 @@ SoftVector *Transceiver::pullRadioVector(GSM::Time &wTime,
*DFEFeedback[timeslot]); *DFEFeedback[timeslot]);
} }
wTime = rxBurst->time(); 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())); RSSI = (int) floor(20.0*log10(rxFullScale/amplitude.abs()));
LOG(DEBUG) << "RSSI: " << RSSI; LOG(DEBUG) << "RSSI: " << RSSI;
timingOffset = (int) round(TOA*256.0/mSamplesPerSymbol); timingOffset = (int) round(TOA*256.0/mSamplesPerSymbol);

View File

@ -38,12 +38,15 @@
on the RF side of the timestamping point of the device. on the RF side of the timestamping point of the device.
This value is generally empirically measured. This value is generally empirically measured.
smpl_buf_sz - The receive sample buffer size in bytes. 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 bool use_ext_ref = false;
const double master_clk_rt = 52e6; const double master_clk_rt = 52e6;
const double rx_smpl_offset = .0000869; const double rx_smpl_offset = .0000869;
const size_t smpl_buf_sz = (1 << 20); const size_t smpl_buf_sz = (1 << 20);
const float tx_ampl = .3;
/** Timestamp conversion /** Timestamp conversion
@param timestamp a UHD or OpenBTS timestamp @param timestamp a UHD or OpenBTS timestamp
@ -158,8 +161,8 @@ public:
inline TIMESTAMP initialWriteTimestamp() { return 0; } inline TIMESTAMP initialWriteTimestamp() { return 0; }
inline TIMESTAMP initialReadTimestamp() { return 0; } inline TIMESTAMP initialReadTimestamp() { return 0; }
inline double fullScaleInputValue() { return 13500.0; } inline double fullScaleInputValue() { return 32000 * tx_ampl; }
inline double fullScaleOutputValue() { return 9450.0; } inline double fullScaleOutputValue() { return 32000; }
double setRxGain(double db); double setRxGain(double db);
double getRxGain(void) { return rx_gain; } double getRxGain(void) { return rx_gain; }

View File

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

View File

@ -161,7 +161,7 @@ private:
double powerScaling; double powerScaling;
/** format samples to USRP */ /** 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 */ /** format samples from USRP */
void unRadioifyVector(short *shortVector, signalVector &wVector); void unRadioifyVector(short *shortVector, signalVector &wVector);