mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-trx.git
synced 2025-11-02 21:23:16 +00:00
Two buffers, inner and outer, are used in the transceiver implementation. The outer buffer interfaces with the device receive interface to guarantee timestamp aligned and contiguously allocated sample buffers. The inner buffer absorbs vector size differences between GSM bursts (156 or 157 samples) and the resampler interface (typically fixed multiples of 65). Reimplement the inner buffer with a ring buffer that allows fixed size segments on the outer (resampler) portion and variable lengths (GSM side) on the inner side. Compared to the previous stack-like version, this implementation removes unnecessary copying of buffer contents. Signed-off-by: Tom Tsou <tom.tsou@ettus.com>
91 lines
1.8 KiB
C++
91 lines
1.8 KiB
C++
#include "signalVector.h"
|
|
|
|
signalVector::signalVector(size_t size)
|
|
: Vector<complex>(size),
|
|
real(false), aligned(false), symmetry(NONE)
|
|
{
|
|
}
|
|
|
|
signalVector::signalVector(size_t size, size_t start)
|
|
: Vector<complex>(size + start),
|
|
real(false), aligned(false), symmetry(NONE)
|
|
{
|
|
mStart = mData + start;
|
|
}
|
|
|
|
signalVector::signalVector(complex *data, size_t start, size_t span)
|
|
: Vector<complex>(NULL, data + start, data + start + span),
|
|
real(false), aligned(false), symmetry(NONE)
|
|
{
|
|
}
|
|
|
|
signalVector::signalVector(const signalVector &vector)
|
|
: Vector<complex>(vector.size() + vector.getStart()), aligned(false)
|
|
{
|
|
mStart = mData + vector.getStart();
|
|
vector.copyTo(*this);
|
|
symmetry = vector.getSymmetry();
|
|
real = vector.isReal();
|
|
};
|
|
|
|
signalVector::signalVector(const signalVector &vector,
|
|
size_t start, size_t tail)
|
|
: Vector<complex>(start + vector.size() + tail), aligned(false)
|
|
{
|
|
mStart = mData + start;
|
|
vector.copyTo(*this);
|
|
symmetry = vector.getSymmetry();
|
|
real = vector.isReal();
|
|
};
|
|
|
|
void signalVector::operator=(const signalVector& vector)
|
|
{
|
|
resize(vector.size() + vector.getStart());
|
|
memcpy(mData, vector.mData, bytes());
|
|
mStart = mData + vector.getStart();
|
|
}
|
|
|
|
size_t signalVector::getStart() const
|
|
{
|
|
return mStart - mData;
|
|
}
|
|
|
|
size_t signalVector::updateHistory()
|
|
{
|
|
size_t num = getStart();
|
|
|
|
memmove(mData, mStart + this->size() - num, num * sizeof(complex));
|
|
|
|
return num;
|
|
}
|
|
|
|
Symmetry signalVector::getSymmetry() const
|
|
{
|
|
return symmetry;
|
|
}
|
|
|
|
void signalVector::setSymmetry(Symmetry symmetry)
|
|
{
|
|
this->symmetry = symmetry;
|
|
}
|
|
|
|
bool signalVector::isReal() const
|
|
{
|
|
return real;
|
|
}
|
|
|
|
void signalVector::isReal(bool wOnly)
|
|
{
|
|
real = wOnly;
|
|
}
|
|
|
|
bool signalVector::isAligned() const
|
|
{
|
|
return aligned;
|
|
}
|
|
|
|
void signalVector::setAligned(bool aligned)
|
|
{
|
|
this->aligned = aligned;
|
|
}
|