- use Tracker
git-svn-id: http://moon:8086/svn/software/trunk/projects/mpsk_rx_gui@1037 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
+9
-23
@@ -51,6 +51,8 @@ Receiver::Receiver(LogHandler *pLogHandler)
|
|||||||
, m_farrow(m_timingGenerator)
|
, m_farrow(m_timingGenerator)
|
||||||
, m_frameReceiver(this)
|
, m_frameReceiver(this)
|
||||||
, m_pSymMapper(0)
|
, m_pSymMapper(0)
|
||||||
|
, m_statisticsProvider(EQ_UPD_INTERVAL)
|
||||||
|
, m_tracker(m_statisticsProvider.minMax())
|
||||||
{
|
{
|
||||||
m_params.numBitsPerSymbol = 2;
|
m_params.numBitsPerSymbol = 2;
|
||||||
m_params.samplerate = 48000;
|
m_params.samplerate = 48000;
|
||||||
@@ -122,9 +124,9 @@ sym_err_t* Receiver::getSoftSyms()
|
|||||||
return m_pSymbolBuffer;
|
return m_pSymbolBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpx_t& Receiver::getTracker(uint32 index)
|
cpx_t Receiver::getTracker(uint32 index)
|
||||||
{
|
{
|
||||||
return m_trackers[index];
|
return toCpx(m_tracker.trackers()[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Receiver::initDefaultParams()
|
void Receiver::initDefaultParams()
|
||||||
@@ -182,15 +184,6 @@ void Receiver::init()
|
|||||||
{
|
{
|
||||||
const ScopedLock sl (m_lock);
|
const ScopedLock sl (m_lock);
|
||||||
|
|
||||||
m_trackers[0] = Cpx(1,1);
|
|
||||||
m_trackers[1] = Cpx(-1,1);
|
|
||||||
m_trackers[2] = Cpx(-1,-1);
|
|
||||||
m_trackers[3] = Cpx(1,-1);
|
|
||||||
m_trackers_[0] = Cpx(1,1);
|
|
||||||
m_trackers_[1] = Cpx(-1,1);
|
|
||||||
m_trackers_[2] = Cpx(-1,-1);
|
|
||||||
m_trackers_[3] = Cpx(1,-1);
|
|
||||||
|
|
||||||
initDefaultParams();
|
initDefaultParams();
|
||||||
m_ReceiverEnable = false;
|
m_ReceiverEnable = false;
|
||||||
|
|
||||||
@@ -509,8 +502,9 @@ void Receiver::processBaseband(CVec const &iq, uint32_t len)
|
|||||||
if (ClockIsTick(&m_symClock, 1))
|
if (ClockIsTick(&m_symClock, 1))
|
||||||
{
|
{
|
||||||
#ifndef DISABLE_UNUSED_STATISTICS
|
#ifndef DISABLE_UNUSED_STATISTICS
|
||||||
#endif
|
|
||||||
minMaxProcess(&m_statistics.ddcMinMax, IQ_eq_in);
|
minMaxProcess(&m_statistics.ddcMinMax, IQ_eq_in);
|
||||||
|
#endif
|
||||||
|
m_statisticsProvider.process(toComplexScalar(IQ_eq_in));
|
||||||
// -----------------------------------------------------
|
// -----------------------------------------------------
|
||||||
// AGC Blind process samples
|
// AGC Blind process samples
|
||||||
// @1 x symbolrate
|
// @1 x symbolrate
|
||||||
@@ -519,12 +513,12 @@ void Receiver::processBaseband(CVec const &iq, uint32_t len)
|
|||||||
{
|
{
|
||||||
if (m_params.agcMu_index == agc_state_acquisition)
|
if (m_params.agcMu_index == agc_state_acquisition)
|
||||||
{
|
{
|
||||||
e_agc = 1.0 - CpxMagS(m_trackers[0]);
|
e_agc = 1.0 - CpxMagS(getTracker(0));
|
||||||
AGC_Train(&agcBlind, e_agc, m_params.agcMu[m_params.agcMu_index]);
|
AGC_Train(&agcBlind, e_agc, m_params.agcMu[m_params.agcMu_index]);
|
||||||
}
|
}
|
||||||
if (m_params.agcMu_index == agc_state_track)
|
if (m_params.agcMu_index == agc_state_track)
|
||||||
{
|
{
|
||||||
e_agc = 1.0 - CpxMagS(m_trackers[0]);
|
e_agc = 1.0 - CpxMagS(getTracker(0));
|
||||||
AGC_Train(&agcBlind, e_agc, m_params.agcMu[m_params.agcMu_index]);
|
AGC_Train(&agcBlind, e_agc, m_params.agcMu[m_params.agcMu_index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -629,15 +623,7 @@ void Receiver::processBaseband(CVec const &iq, uint32_t len)
|
|||||||
// Lock-detector development
|
// Lock-detector development
|
||||||
// @1 x symbolrate
|
// @1 x symbolrate
|
||||||
// -----------------------------------------------------
|
// -----------------------------------------------------
|
||||||
radio_float_t alpha = 0.002;
|
m_tracker.process(toComplexScalar(IQ_soft));
|
||||||
radio_float_t beta = 1.0 - alpha;
|
|
||||||
cpx_t s_min = m_statistics.ddcMinMax.min;
|
|
||||||
cpx_t s_max = m_statistics.ddcMinMax.max;
|
|
||||||
m_trackers[0] = CpxAddS(CpxScaleRealS(m_trackers[0], beta), CpxScaleRealS(Cpx(s_max.real, s_min.imag), alpha));
|
|
||||||
m_trackers[1] = CpxAddS(CpxScaleRealS(m_trackers[1], beta), CpxScaleRealS(Cpx(s_max.real, s_max.imag), alpha));
|
|
||||||
m_trackers[2] = CpxAddS(CpxScaleRealS(m_trackers[2], beta), CpxScaleRealS(Cpx(s_min.real, s_max.imag), alpha));
|
|
||||||
m_trackers[3] = CpxAddS(CpxScaleRealS(m_trackers[3], beta), CpxScaleRealS(Cpx(s_min.real, s_min.imag), alpha));
|
|
||||||
|
|
||||||
|
|
||||||
// Statistics
|
// Statistics
|
||||||
#ifndef DISABLE_UNUSED_STATISTICS
|
#ifndef DISABLE_UNUSED_STATISTICS
|
||||||
|
|||||||
+9
-4
@@ -18,6 +18,8 @@
|
|||||||
#include <cpp/radio/interpolation/Farrow.hpp>
|
#include <cpp/radio/interpolation/Farrow.hpp>
|
||||||
#include <cpp/radio/interpolation/DownSampler.hpp>
|
#include <cpp/radio/interpolation/DownSampler.hpp>
|
||||||
#include <cpp/radio/interpolation/PolyPhase.hpp>
|
#include <cpp/radio/interpolation/PolyPhase.hpp>
|
||||||
|
#include <cpp/radio/metrics/Statistics.hpp>
|
||||||
|
#include <cpp/radio/metrics/Tracker.hpp>
|
||||||
|
|
||||||
#include <cpp/radio/Nco.hpp>
|
#include <cpp/radio/Nco.hpp>
|
||||||
|
|
||||||
@@ -240,7 +242,7 @@ public:
|
|||||||
virtual void setParams(const params_t ¶ms) = 0;
|
virtual void setParams(const params_t ¶ms) = 0;
|
||||||
virtual const params_t& getParams() = 0;
|
virtual const params_t& getParams() = 0;
|
||||||
virtual const status_t& getStatus() = 0;
|
virtual const status_t& getStatus() = 0;
|
||||||
virtual const cpx_t& getTracker(uint32 index) = 0;
|
virtual cpx_t getTracker(uint32 index) = 0;
|
||||||
virtual void reset() = 0;
|
virtual void reset() = 0;
|
||||||
virtual void statisticsReset() = 0;
|
virtual void statisticsReset() = 0;
|
||||||
virtual void strReset() = 0;
|
virtual void strReset() = 0;
|
||||||
@@ -354,8 +356,6 @@ private:
|
|||||||
bool m_ReceiverEnable;
|
bool m_ReceiverEnable;
|
||||||
sample_clock_t m_symClock;
|
sample_clock_t m_symClock;
|
||||||
pfd_t m_pfdCpr;
|
pfd_t m_pfdCpr;
|
||||||
cpx_t m_trackers_[4];
|
|
||||||
cpx_t m_trackers[4];
|
|
||||||
|
|
||||||
// Filter
|
// Filter
|
||||||
Interpolation::DownSampler m_firArmDown;
|
Interpolation::DownSampler m_firArmDown;
|
||||||
@@ -396,6 +396,10 @@ private:
|
|||||||
sym_stat_t m_sym_stat;
|
sym_stat_t m_sym_stat;
|
||||||
statistics_t m_statistics;
|
statistics_t m_statistics;
|
||||||
|
|
||||||
|
// Metrics
|
||||||
|
Metrics::Statistics m_statisticsProvider;
|
||||||
|
Metrics::Tracker m_tracker;
|
||||||
|
|
||||||
FrameReceiver m_frameReceiver;
|
FrameReceiver m_frameReceiver;
|
||||||
params_t m_params;
|
params_t m_params;
|
||||||
|
|
||||||
@@ -403,6 +407,7 @@ private:
|
|||||||
Processor::Buffer<ComplexScalar> m_buffer_agc;
|
Processor::Buffer<ComplexScalar> m_buffer_agc;
|
||||||
Processor::Buffer<ComplexScalar> m_buffer_ip;
|
Processor::Buffer<ComplexScalar> m_buffer_ip;
|
||||||
|
|
||||||
|
|
||||||
void timerCallback();
|
void timerCallback();
|
||||||
void processBaseband(CVec const &iq, uint32_t len);
|
void processBaseband(CVec const &iq, uint32_t len);
|
||||||
void minMaxInit(minmax_t *pObj, radio_float_t min_initial, radio_float_t max_initial)
|
void minMaxInit(minmax_t *pObj, radio_float_t min_initial, radio_float_t max_initial)
|
||||||
@@ -464,7 +469,7 @@ private:
|
|||||||
void statisticsReset() override;
|
void statisticsReset() override;
|
||||||
void dfeOffUpdateFromCma() override;
|
void dfeOffUpdateFromCma() override;
|
||||||
void dfeOnUpdateFromDfeOff() override;
|
void dfeOnUpdateFromDfeOff() override;
|
||||||
cpx_t& getTracker(uint32 index) override;
|
cpx_t getTracker(uint32 index) override;
|
||||||
|
|
||||||
void onData(void *pData, uint32_t size) override
|
void onData(void *pData, uint32_t size) override
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user