From 7f29cc1ccb238b288d319bc63a0e95fb28cd41fb Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Mon, 27 Jun 2022 19:21:32 +0000 Subject: [PATCH] - refactored - added AWGN git-svn-id: http://moon:8086/svn/software/trunk/projects/mpsk_rx_gui@1099 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- Source/Receiver.cpp | 43 +++++++++++++++++++++++++++++-------------- Source/Receiver.hpp | 17 ++++++++++------- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/Source/Receiver.cpp b/Source/Receiver.cpp index d1c99e9..db75ece 100644 --- a/Source/Receiver.cpp +++ b/Source/Receiver.cpp @@ -1,12 +1,15 @@ #include +#include + #include "Receiver.hpp" -#include "MinMaxLemire.h" #if 0 #include #include #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}; diff --git a/Source/Receiver.hpp b/Source/Receiver.hpp index 2a9382a..f808a3d 100644 --- a/Source/Receiver.hpp +++ b/Source/Receiver.hpp @@ -21,6 +21,7 @@ #include #include +#include #ifdef _WINDOWS #include @@ -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& getSoftSyms(); void initDefaultParams(); void addStatusListener(ReceiverStatusListener *pListener); @@ -405,9 +407,12 @@ private: Processor::Buffer m_buffer_agc; Processor::Buffer 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_