mirror of
https://github.com/RangeNetworks/openbts.git
synced 2025-10-23 16:13:52 +00:00
Previous removal of the energy detector requirement broke the noise level calculation loop. The previous adaptive approach was finicky - noticably at high gain levels. Since we no longer use the energy threshold for primary burst gating, we can return to a simpler world. In the new approach, we compute a running average of energy levels and track them with a noise vector. A timeslot that passes the correlator threshold is a valid burst. These are not used in the noise calculation. Everything else is considered noise and used to compute the noise level with respect to full scale input level, which for almost all supported devices is 2^15. Signed-off-by: Thomas Tsou <tom@tsou.cc> git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@6755 19bc5d8c-e614-43d4-8b26-e1612bc8e597
139 lines
2.5 KiB
C++
139 lines
2.5 KiB
C++
/*
|
|
* Written by Thomas Tsou <ttsou@vt.edu>
|
|
* Based on code by Harvind S Samra <hssamra@kestrelsp.com>
|
|
*
|
|
* Copyright 2011 Free Software Foundation, Inc.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
* See the COPYING file in the main directory for details.
|
|
*/
|
|
|
|
#include "radioVector.h"
|
|
|
|
radioVector::radioVector(const signalVector& wVector, GSM::Time& wTime)
|
|
: signalVector(wVector), mTime(wTime)
|
|
{
|
|
}
|
|
|
|
GSM::Time radioVector::getTime() const
|
|
{
|
|
return mTime;
|
|
}
|
|
|
|
void radioVector::setTime(const GSM::Time& wTime)
|
|
{
|
|
mTime = wTime;
|
|
}
|
|
|
|
bool radioVector::operator>(const radioVector& other) const
|
|
{
|
|
return mTime > other.mTime;
|
|
}
|
|
|
|
noiseVector::noiseVector(size_t n)
|
|
{
|
|
this->resize(n);
|
|
it = this->begin();
|
|
}
|
|
|
|
float noiseVector::avg()
|
|
{
|
|
float val = 0.0;
|
|
|
|
for (int i = 0; i < size(); i++)
|
|
val += (*this)[i];
|
|
|
|
return val / (float) size();
|
|
}
|
|
|
|
bool noiseVector::insert(float val)
|
|
{
|
|
if (!size())
|
|
return false;
|
|
|
|
if (it == this->end())
|
|
it = this->begin();
|
|
|
|
*it++ = val;
|
|
|
|
return true;
|
|
}
|
|
|
|
unsigned VectorFIFO::size()
|
|
{
|
|
return mQ.size();
|
|
}
|
|
|
|
void VectorFIFO::put(radioVector *ptr)
|
|
{
|
|
mQ.put((void*) ptr);
|
|
}
|
|
|
|
radioVector *VectorFIFO::get()
|
|
{
|
|
return (radioVector*) mQ.get();
|
|
}
|
|
|
|
GSM::Time VectorQueue::nextTime() const
|
|
{
|
|
GSM::Time retVal;
|
|
mLock.lock();
|
|
|
|
while (mQ.size()==0)
|
|
mWriteSignal.wait(mLock);
|
|
|
|
retVal = mQ.top()->getTime();
|
|
mLock.unlock();
|
|
|
|
return retVal;
|
|
}
|
|
|
|
radioVector* VectorQueue::getStaleBurst(const GSM::Time& targTime)
|
|
{
|
|
mLock.lock();
|
|
if ((mQ.size()==0)) {
|
|
mLock.unlock();
|
|
return NULL;
|
|
}
|
|
|
|
if (mQ.top()->getTime() < targTime) {
|
|
radioVector* retVal = mQ.top();
|
|
mQ.pop();
|
|
mLock.unlock();
|
|
return retVal;
|
|
}
|
|
mLock.unlock();
|
|
|
|
return NULL;
|
|
}
|
|
|
|
radioVector* VectorQueue::getCurrentBurst(const GSM::Time& targTime)
|
|
{
|
|
mLock.lock();
|
|
if ((mQ.size()==0)) {
|
|
mLock.unlock();
|
|
return NULL;
|
|
}
|
|
|
|
if (mQ.top()->getTime() == targTime) {
|
|
radioVector* retVal = mQ.top();
|
|
mQ.pop();
|
|
mLock.unlock();
|
|
return retVal;
|
|
}
|
|
mLock.unlock();
|
|
|
|
return NULL;
|
|
}
|