Skip to content

File mpsk_receiver_core.h

File List > inc > mpsk_receiver > mpsk_receiver_core.h

Go to the documentation of this file

#ifndef MPSK_RECEIVER_CORE_H
#define MPSK_RECEIVER_CORE_H

#include "carrier_nda/carrier_nda_core.h"
#include "clib_common.h"
#include "dp_state.h"
#include "fir/fir_core.h"
#include "jm_perf.h"
#include "mpsk/mpsk_core.h"
#include "symsync/symsync_core.h"
#include <complex.h>
#include "lo/lo_core.h"
#include "loop_filter/loop_filter_core.h"
#include "farrow/farrow_core.h"
#ifdef __cplusplus
extern "C"
{
#endif

  enum
  {
    MPSK_RX_PULSE_IANDD = 0, 
    MPSK_RX_PULSE_RRC = 1    
  };

  typedef struct
  {
    carrier_nda_state_t car;  
    symsync_state_t     sync; 
    fir_state_t        *mf;   
    float              *mf_taps;      
    int                 m;           
    size_t              sps;         
    int                 n;           
    int                 pulse;       
    double              rrc_beta;    
    int                 rrc_span;    
    int                 auto_handover; 
    double              lock_thresh; 
    size_t              warmup_syms; 
    int                 tracking;    
    size_t              sym_count;   
    int                 differential;  
    int                 have_prev_idx; 
    unsigned            prev_idx;      
    float complex       sym_rot;       
  } mpsk_receiver_state_t;

  mpsk_receiver_state_t *mpsk_receiver_create (
      int m, size_t sps, int n, int pulse, double rrc_beta, int rrc_span,
      double bn_carrier, double zeta, double bn_timing, int auto_handover,
      double lock_thresh, double init_norm_freq, size_t warmup_syms,
      int differential);

  void mpsk_receiver_destroy (mpsk_receiver_state_t *state);

  void mpsk_receiver_reset (mpsk_receiver_state_t *state);

  size_t mpsk_receiver_steps_max_out (mpsk_receiver_state_t *state);
  size_t mpsk_receiver_steps (mpsk_receiver_state_t *state,
                              const float complex *x, size_t x_len,
                              float complex *out, size_t max_out);

  size_t mpsk_receiver_bits_max_out (mpsk_receiver_state_t *state);
  size_t mpsk_receiver_bits (mpsk_receiver_state_t *state,
                             const float complex *x, size_t x_len,
                             uint8_t *out, size_t max_out);

  double mpsk_receiver_get_norm_freq (const mpsk_receiver_state_t *state);
  void   mpsk_receiver_set_norm_freq (mpsk_receiver_state_t *state, double val);
  double mpsk_receiver_get_lock (const mpsk_receiver_state_t *state);
  double mpsk_receiver_get_timing_rate (const mpsk_receiver_state_t *state);
  int    mpsk_receiver_get_tracking (const mpsk_receiver_state_t *state);
  int    mpsk_receiver_get_m (const mpsk_receiver_state_t *state);
  size_t mpsk_receiver_get_sps (const mpsk_receiver_state_t *state);
  int    mpsk_receiver_get_n (const mpsk_receiver_state_t *state);
/* ── Serializable state (standard bytes interface; see dp_state.h) ──────────
 * composition: carrier_nda + symsync + matched-filter children +
 * running tracking/handover state; MF taps restored by create. */
#define MPSK_RECEIVER_STATE_MAGIC DP_FOURCC ('M','P','S','K')
#define MPSK_RECEIVER_STATE_VERSION 1u
size_t mpsk_receiver_state_bytes (const mpsk_receiver_state_t *state);
void mpsk_receiver_get_state (const mpsk_receiver_state_t *state, void *blob);
int mpsk_receiver_set_state (mpsk_receiver_state_t *state, const void *blob);

#ifdef __cplusplus
}
#endif

#endif /* MPSK_RECEIVER_CORE_H */