- refactored

- added AWGN

git-svn-id: http://moon:8086/svn/software/trunk/projects/mpsk_rx_gui@1099 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
2022-06-27 19:21:32 +00:00
parent 0de38254ce
commit 7f29cc1ccb
2 changed files with 39 additions and 21 deletions
+29 -14
View File
@@ -1,12 +1,15 @@
#include <cmath>
#include <cstdint>
#include "Receiver.hpp"
#include "MinMaxLemire.h"
#if 0
#include <radio/ComplexVector.hpp>
#include <radio/RealVector.hpp>
#endif
using namespace std;
/***************************************************************/
const uint32_t LPF_OVERSAMPLING = 16; // Arm-Filter: oversampling
const radio_float_t LPF_OMEGA = (radio_float_t)0.48; // Arm-Filter: RC Roll-off
@@ -16,7 +19,7 @@ const uint32_t RCF_NUM_PHASES = 256; // RCF_TYPE_POLYPHASE_DISCRETE:
const radio_float_t CPR_GAIN_LEAD_AQU = (radio_float_t)5.00E-5; // 3E-5
const radio_float_t CPR_GAIN_LAG_AQU = (radio_float_t)0.40E-6; // 1E-6
const radio_float_t CPR_GAIN_LEAD_TRK = (radio_float_t)5.00E-6; // 1E-5
const radio_float_t CPR_GAIN_LEAD_TRK = (radio_float_t)2.00E-6; // 1E-5
const radio_float_t CPR_GAIN_LAG_TRK = (radio_float_t)1.00E-9; // 5E-7
const radio_float_t STR_GAIN_LEAD_AQU = (radio_float_t)4.00E-4; // 2E-3
@@ -53,9 +56,9 @@ Receiver::Receiver(LogHandler *pLogHandler)
m_params.samplerate = 48000;
m_params.symbolrate = m_params.samplerate/4;
m_params.ddc_freq = m_params.samplerate/4;
m_params.CPR_phase = 0;
startTimer (1000 / 10);
Noise_Init(&m_noise, 0x12345678);
}
@@ -75,7 +78,7 @@ void Receiver::addDataListener(ReceiverDataListener *pListener)
m_pDataListener = pListener;
}
void Receiver::setBufSize(uint32 size)
void Receiver::setBufSize(size_t size)
{
const ScopedLock sl (m_lock);
@@ -117,7 +120,7 @@ void Receiver::initDefaultParams()
{
m_params.CPR_phase = 0;
m_params.awgn_dB = -60;
m_params.agc_state = agc_state_acquisition;
m_params.agc_mode = agc_mode_disabled;
m_params.agcMu[0] = AGC_ADAPTION_RATE_ACQ;
@@ -350,11 +353,11 @@ void Receiver::timerCallback()
}
}
void Receiver::processPassband(RVec const &rf, uint32_t len)
void Receiver::processPassband(RVec const &rf, size_t len)
{
const ScopedLock sl (m_lock);
uint32_t len_down;
size_t len_down;
radio_float_t test4normal;
if (!m_ReceiverEnable)
@@ -363,7 +366,7 @@ void Receiver::processPassband(RVec const &rf, uint32_t len)
}
test4normal = 0;
for (uint32_t i=0; i < len; i++)
for (size_t i=0; i < len; i++)
{
test4normal += rf[i];
}
@@ -376,13 +379,25 @@ void Receiver::processPassband(RVec const &rf, uint32_t len)
return;
}
RVec rf_noise(rf);
radio_float_t k_awgn = 0;
if (m_params.awgn_dB > -1000)
{
k_awgn = pow(10.0, m_params.awgn_dB/20.0);
}
for (size_t i=0; i < len; i++)
{
radio_float_t n = Noise_Gaussian(&m_noise, 0, k_awgn);
rf_noise[i] += n;
}
#ifndef DISABLE_UNUSED_STATISTICS
SlidingVarProcessV(&m_statistics.RF, rf.data(), len);
SlidingVarProcessV(&m_statistics.RF, rf_noise.data(), len);
#endif
// Digital Down Converter
// @samplerate
m_nco_ddc.mixRealComplexV(m_passbandBuffer, rf, RealScalar(2)/*m_params.agcGain[0]*/, len);
m_nco_ddc.mixRealComplexV(m_passbandBuffer, rf_noise, RealScalar(2)/*m_params.agcGain[0]*/, len);
// Arm Filtering and downsampling
len_down = m_firArmDown.process(m_basebandBuffer, m_passbandBuffer, len);
@@ -391,9 +406,9 @@ void Receiver::processPassband(RVec const &rf, uint32_t len)
}
void Receiver::processBaseband(radio_float_t *pI, radio_float_t *pQ, uint32_t len)
void Receiver::processBaseband(radio_float_t *pI, radio_float_t *pQ, size_t len)
{
for (uint32_t i=0; i < len/2; i++)
for (size_t i=0; i < len/2; i++)
{
m_basebandBuffer[i] = ComplexScalar(pI[2*i], pQ[2*i]);
}
@@ -401,13 +416,13 @@ void Receiver::processBaseband(radio_float_t *pI, radio_float_t *pQ, uint32_t le
}
// Baseband processing
void Receiver::processBaseband(CVec const &iq, uint32_t len)
void Receiver::processBaseband(CVec const &iq, size_t len)
{
const ScopedLock sl (m_lock);
static cpx_t IQ_hard_last;
uint32_t n;
size_t n;
static cpx_t IQ_mf = {0,0};
cpx_t IQ_agc = {0,0};
cpx_t IQ_cpr = {0,0};
+10 -7
View File
@@ -21,6 +21,7 @@
#include <cpp/radio/metrics/Tracker.hpp>
#include <cpp/radio/Nco.hpp>
#include <noise/noise.h>
#ifdef _WINDOWS
#include <float.h>
@@ -165,6 +166,7 @@ typedef struct _params_t
radio_float_t samplerate;
radio_float_t ddc_freq;
radio_float_t CPR_phase;
radio_float_t awgn_dB;
bool dfeAutoUpdateEnable;
bool strAutoControlEnable;
bool cprAutoControlEnable;
@@ -332,9 +334,9 @@ public:
~Receiver(void);
void init();
void free();
void processBaseband(radio_float_t *pI, radio_float_t *pQ, uint32_t len);
void processPassband(RVec const &rf, uint32_t len);
void setBufSize(uint32 size);
void processBaseband(radio_float_t *pI, radio_float_t *pQ, size_t len);
void processPassband(RVec const &rf, size_t len);
void setBufSize(size_t size);
Processor::Buffer<sym_err_t>& getSoftSyms();
void initDefaultParams();
void addStatusListener(ReceiverStatusListener *pListener);
@@ -405,9 +407,12 @@ private:
Processor::Buffer<ComplexScalar> m_buffer_agc;
Processor::Buffer<ComplexScalar> m_buffer_ip;
// Noise
noise_gen_t m_noise;
trace_t m_trace;
void timerCallback();
void processBaseband(CVec const &iq, uint32_t len);
void processBaseband(CVec const &iq, size_t len);
void minMaxInit(minmax_t *pObj, radio_float_t min_initial, radio_float_t max_initial)
{
pObj->min = min_initial;
@@ -478,8 +483,6 @@ private:
{
return m_dfe_off2.getWeights();
}
trace_t m_trace;
};
#endif // _RECEIVER_H_