aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/radioInterfaceResamp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Transceiver52M/radioInterfaceResamp.cpp')
-rw-r--r--Transceiver52M/radioInterfaceResamp.cpp54
1 files changed, 33 insertions, 21 deletions
diff --git a/Transceiver52M/radioInterfaceResamp.cpp b/Transceiver52M/radioInterfaceResamp.cpp
index f857df9..c3b4396 100644
--- a/Transceiver52M/radioInterfaceResamp.cpp
+++ b/Transceiver52M/radioInterfaceResamp.cpp
@@ -36,6 +36,9 @@ extern "C" {
#define RESAMP_100M_INRATE 52
#define RESAMP_100M_OUTRATE 75
+/* Universal resampling parameters */
+#define NUMCHUNKS 24
+
/*
* Resampling filter bandwidth scaling factor
* This narrows the filter cutoff relative to the output bandwidth
@@ -116,6 +119,11 @@ bool RadioInterfaceResamp::init(int type)
resamp_inchunk = resamp_inrate * 4;
resamp_outchunk = resamp_outrate * 4;
+ if (resamp_inchunk * NUMCHUNKS < 157 * mSPSTx * 2) {
+ LOG(ALERT) << "Invalid inner chunk size " << resamp_inchunk;
+ return false;
+ }
+
if (mSPSTx == 4)
cutoff = RESAMP_TX4_FILTER;
@@ -137,16 +145,17 @@ bool RadioInterfaceResamp::init(int type)
* and requires headroom equivalent to the filter length. Low
* rate buffers are allocated in the main radio interface code.
*/
- innerSendBuffer = new signalVector(resamp_inchunk * 20,
- upsampler->len());
- outerSendBuffer = new signalVector(resamp_outchunk * 20);
-
- outerRecvBuffer = new signalVector(resamp_outchunk * 2,
- dnsampler->len());
- innerRecvBuffer = new signalVector(resamp_inchunk * 20);
-
- convertSendBuffer = new short[resamp_outchunk * 2 * 20];
- convertRecvBuffer = new short[resamp_outchunk * 2 * 2];
+ innerSendBuffer =
+ new signalVector(NUMCHUNKS * resamp_inchunk, upsampler->len());
+ outerSendBuffer =
+ new signalVector(NUMCHUNKS * resamp_outchunk);
+ outerRecvBuffer =
+ new signalVector(resamp_outchunk, dnsampler->len());
+ innerRecvBuffer =
+ new signalVector(NUMCHUNKS * resamp_inchunk / mSPSTx);
+
+ convertSendBuffer = new short[outerSendBuffer->size() * 2];
+ convertRecvBuffer = new short[outerRecvBuffer->size() * 2];
sendBuffer = innerSendBuffer;
recvBuffer = innerRecvBuffer;
@@ -159,35 +168,37 @@ void RadioInterfaceResamp::pullBuffer()
{
bool local_underrun;
int rc, num_recv;
- int inner_len = resamp_inchunk;
- int outer_len = resamp_outchunk;
+
+ if (recvCursor > innerRecvBuffer->size() - resamp_inchunk)
+ return;
/* Outer buffer access size is fixed */
num_recv = mRadio->readSamples(convertRecvBuffer,
- outer_len,
+ resamp_outchunk,
&overrun,
readTimestamp,
&local_underrun);
- if (num_recv != outer_len) {
+ if (num_recv != resamp_outchunk) {
LOG(ALERT) << "Receive error " << num_recv;
return;
}
convert_short_float((float *) outerRecvBuffer->begin(),
- convertRecvBuffer, 2 * outer_len);
+ convertRecvBuffer, 2 * resamp_outchunk);
underrun |= local_underrun;
- readTimestamp += (TIMESTAMP) num_recv;
+ readTimestamp += (TIMESTAMP) resamp_outchunk;
/* Write to the end of the inner receive buffer */
- rc = dnsampler->rotate((float *) outerRecvBuffer->begin(), outer_len,
+ rc = dnsampler->rotate((float *) outerRecvBuffer->begin(),
+ resamp_outchunk,
(float *) (innerRecvBuffer->begin() + recvCursor),
- inner_len);
+ resamp_inchunk);
if (rc < 0) {
LOG(ALERT) << "Sample rate upsampling error";
}
- recvCursor += inner_len;
+ recvCursor += resamp_inchunk;
}
/* Send a timestamped chunk to the device */
@@ -199,9 +210,10 @@ void RadioInterfaceResamp::pushBuffer()
if (sendCursor < resamp_inchunk)
return;
+ if (sendCursor > innerSendBuffer->size())
+ LOG(ALERT) << "Send buffer overflow";
+
chunks = sendCursor / resamp_inchunk;
- if (chunks > 8)
- chunks = 8;
inner_len = chunks * resamp_inchunk;
outer_len = chunks * resamp_outchunk;