Skip to content

File ber_meter_core.h

File List > ber_meter > ber_meter_core.h

Go to the documentation of this file

#ifndef BER_METER_CORE_H
#define BER_METER_CORE_H

#include "ber/ber_core.h" /* the records and the free functions */
#include "clib_common.h"
#include "detection/detection_core.h"
#include "dp_state.h"
#include "jm_perf.h"
#include <complex.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C"
{
#endif

#define BER_METER_STATE_MAGIC DP_FOURCC ('B', 'E', 'R', 'M')
#define BER_METER_STATE_VERSION 1u

  typedef struct
  {
    int      m;             
    int      bps;           
    size_t   target_errors; 
    double   conf;          
    uint8_t *truth;         
    size_t   truth_len;     
    /* running counters — this is what the state blob carries */
    size_t errors;     
    size_t symbols;    
    size_t bit_errors; 
    size_t bits;       
    size_t skipped;    
    size_t bursts;     
    /* the last alignment detected, and the marker geometry that found it —
       score() uses these rather than taking them from the caller, so a
       measurement cannot be handed an alignment that belongs to a different
       burst or a different marker */
    ber_align_t last;      
    size_t      mk_t0;     
    size_t      mk_n;      
    size_t      mk_period; 
  } ber_meter_state_t;

  ber_align_t ber_align_detect (const float _Complex *rx, size_t rx_len,
                                const uint8_t *truth, size_t truth_len, int m,
                                size_t t0, size_t n_marker, size_t period,
                                int lag_span, double pfa);

  ber_interval_t ber_confidence (size_t errors, size_t symbols, double conf);

  /* ── the meter ────────────────────────────────────────────────────────── */

  ber_meter_state_t *ber_meter_create (int m, size_t target_errors,
                                       double conf);
  void               ber_meter_destroy (ber_meter_state_t *state);
  void ber_meter_reset (ber_meter_state_t *state);

  int ber_meter_set_truth (ber_meter_state_t *state, const uint8_t *truth,
                           size_t truth_len);

  ber_align_t ber_meter_detect (const ber_meter_state_t *state,
                                const float _Complex *rx, size_t rx_len,
                                size_t t0, size_t n_marker, size_t period,
                                int lag_span, double pfa);

  int ber_meter_align (ber_meter_state_t *state, const float _Complex *rx,
                       size_t rx_len, size_t t0, size_t n_marker,
                       size_t period, int lag_span, double pfa);

  size_t ber_meter_score (ber_meter_state_t *state, const float _Complex *rx,
                          size_t rx_len, size_t lo, size_t hi);

  void ber_meter_set_align (ber_meter_state_t *state, ber_align_t align,
                            size_t t0, size_t n_marker, size_t period);

  int ber_meter_get_enough (const ber_meter_state_t *state);

  ber_interval_t ber_meter_interval (const ber_meter_state_t *state,
                                     size_t errors, size_t symbols);

  ber_interval_t ber_meter_ser (const ber_meter_state_t *state);

  ber_interval_t ber_meter_ber (const ber_meter_state_t *state);

  size_t ber_meter_get_errors (const ber_meter_state_t *state);
  size_t ber_meter_get_symbols (const ber_meter_state_t *state);
  size_t ber_meter_get_bit_errors (const ber_meter_state_t *state);
  size_t ber_meter_get_bits (const ber_meter_state_t *state);
  size_t ber_meter_get_skipped (const ber_meter_state_t *state);
  int    ber_meter_get_m (const ber_meter_state_t *state);
  size_t ber_meter_get_target_errors (const ber_meter_state_t *state);
  int    ber_meter_get_lag (const ber_meter_state_t *state);
  double ber_meter_get_phase (const ber_meter_state_t *state);
  double ber_meter_get_align_stat (const ber_meter_state_t *state);
  double ber_meter_get_align_margin_db (const ber_meter_state_t *state);
  double ber_meter_get_align_runner_db (const ber_meter_state_t *state);
  size_t ber_meter_get_align_occurrences (const ber_meter_state_t *state);
  size_t ber_meter_get_align_slips (const ber_meter_state_t *state);
  int    ber_meter_get_align_saturated (const ber_meter_state_t *state);
  int    ber_meter_get_align_ok (const ber_meter_state_t *state);
  double ber_meter_get_conf (const ber_meter_state_t *state);

  size_t ber_meter_state_bytes (const ber_meter_state_t *state);
  void   ber_meter_get_state (const ber_meter_state_t *state, void *blob);
  int    ber_meter_set_state (ber_meter_state_t *state, const void *blob);

#ifdef __cplusplus
}
#endif

#endif /* BER_METER_CORE_H */