aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/radioInterface.cpp
diff options
context:
space:
mode:
authorThomas Tsou <tom@tsou.cc>2013-08-20 21:24:24 -0400
committerThomas Tsou <tom@tsou.cc>2013-10-18 13:10:17 -0400
commit9471d7635abeb9b5c87227d64e452890da0e65bd (patch)
tree28c28e373f42da81dac7363f89d6d0356ed8e72a /Transceiver52M/radioInterface.cpp
parent03e6ecf9771ea029e69fd4cdc2f2e289e93d3978 (diff)
Transceiver52M: Add SSE floating point / integer conversion
Convertions are performed in multiples of 4 or 8. All loads are considered unaligned. Signed-off-by: Thomas Tsou <tom@tsou.cc>
Diffstat (limited to 'Transceiver52M/radioInterface.cpp')
-rw-r--r--Transceiver52M/radioInterface.cpp95
1 files changed, 43 insertions, 52 deletions
diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp
index 1e25b5d..f39a470 100644
--- a/Transceiver52M/radioInterface.cpp
+++ b/Transceiver52M/radioInterface.cpp
@@ -25,29 +25,11 @@
#include "radioInterface.h"
#include <Logger.h>
-bool started = false;
-
-/* Device side buffers */
-static short rx_buf[OUTCHUNK * 2 * 2];
-static short tx_buf[INCHUNK * 2 * 2];
-
-/* Complex float to short conversion */
-static void floatToShort(short *out, float *in, int num)
-{
- for (int i = 0; i < num; i++) {
- out[2 * i + 0] = (short) in[2 * i + 0];
- out[2 * i + 1] = (short) in[2 * i + 1];
- }
+extern "C" {
+#include "convert.h"
}
-/* Complex short to float conversion */
-static void shortToFloat(float *out, short *in, int num)
-{
- for (int i = 0; i < num; i++) {
- out[2 * i + 0] = (float) in[2 * i + 0];
- out[2 * i + 1] = (float) in[2 * i + 1];
- }
-}
+bool started = false;
RadioInterface::RadioInterface(RadioDevice *wRadio,
int wReceiveOffset,
@@ -96,6 +78,7 @@ void RadioInterface::close()
convertSendBuffer = NULL;
}
+
double RadioInterface::fullScaleInputValue(void) {
return mRadio->fullScaleInputValue();
}
@@ -120,22 +103,14 @@ void RadioInterface::setPowerAttenuation(double atten)
int RadioInterface::radioifyVector(signalVector &wVector,
float *retVector,
- float scale,
bool zero)
{
- int i;
- signalVector::iterator itr = wVector.begin();
-
if (zero) {
memset(retVector, 0, wVector.size() * 2 * sizeof(float));
return wVector.size();
}
- for (i = 0; i < wVector.size(); i++) {
- retVector[2 * i + 0] = itr->real() * scale;
- retVector[2 * i + 1] = itr->imag() * scale;
- itr++;
- }
+ memcpy(retVector, wVector.begin(), wVector.size() * 2 * sizeof(float));
return wVector.size();
}
@@ -143,10 +118,14 @@ int RadioInterface::radioifyVector(signalVector &wVector,
int RadioInterface::unRadioifyVector(float *floatVector,
signalVector& newVector)
{
- int i;
signalVector::iterator itr = newVector.begin();
- for (i = 0; i < newVector.size(); i++) {
+ if (newVector.size() > recvCursor) {
+ LOG(ALERT) << "Insufficient number of samples in receive buffer";
+ return -1;
+ }
+
+ for (int i = 0; i < newVector.size(); i++) {
*itr++ = Complex<float>(floatVector[2 * i + 0],
floatVector[2 * i + 1]);
}
@@ -205,8 +184,7 @@ void RadioInterface::driveTransmitRadio(signalVector &radioBurst, bool zeroBurst
return;
radioifyVector(radioBurst,
- (float *) (sendBuffer->begin() + sendCursor),
- powerScaling, zeroBurst);
+ (float *) (sendBuffer->begin() + sendCursor), zeroBurst);
sendCursor += radioBurst.size();
@@ -293,36 +271,49 @@ double RadioInterface::getRxGain()
void RadioInterface::pullBuffer()
{
bool local_underrun;
+ int num_recv;
+
+ /* Outer buffer access size is fixed */
+ num_recv = mRadio->readSamples(convertRecvBuffer,
+ OUTCHUNK,
+ &overrun,
+ readTimestamp,
+ &local_underrun);
+ if (num_recv != OUTCHUNK) {
+ LOG(ALERT) << "Receive error " << num_recv;
+ return;
+ }
- /* Read samples. Fail if we don't get what we want. */
- int num_rd = mRadio->readSamples(rx_buf, OUTCHUNK, &overrun,
- readTimestamp, &local_underrun);
-
- LOG(DEBUG) << "Rx read " << num_rd << " samples from device";
- assert(num_rd == OUTCHUNK);
+ convert_short_float((float *) (recvBuffer->begin() + recvCursor),
+ convertRecvBuffer, 2 * OUTCHUNK);
underrun |= local_underrun;
- readTimestamp += (TIMESTAMP) num_rd;
+ readTimestamp += num_recv;
- shortToFloat((float *) recvBuffer->begin() + recvCursor, rx_buf, num_rd);
- recvCursor += num_rd;
+ recvCursor += num_recv;
}
/* Send timestamped chunk to the device with arbitrary size */
void RadioInterface::pushBuffer()
{
+ int num_sent;
+
if (sendCursor < INCHUNK)
return;
- floatToShort(tx_buf, (float *) sendBuffer->begin(), sendCursor);
-
- /* Write samples. Fail if we don't get what we want. */
- int num_smpls = mRadio->writeSamples(tx_buf,
- sendCursor,
- &underrun,
- writeTimestamp);
- assert(num_smpls == sendCursor);
+ convert_float_short(convertSendBuffer,
+ (float *) sendBuffer->begin(),
+ powerScaling, 2 * sendCursor);
+
+ /* Send the all samples in the send buffer */
+ num_sent = mRadio->writeSamples(convertSendBuffer,
+ sendCursor,
+ &underrun,
+ writeTimestamp);
+ if (num_sent != sendCursor) {
+ LOG(ALERT) << "Transmit error " << num_sent;
+ }
- writeTimestamp += (TIMESTAMP) num_smpls;
+ writeTimestamp += num_sent;
sendCursor = 0;
}