diff options
Diffstat (limited to 'controller/fw/src/dsss_demod.h')
-rw-r--r-- | controller/fw/src/dsss_demod.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/controller/fw/src/dsss_demod.h b/controller/fw/src/dsss_demod.h new file mode 100644 index 0000000..8ab5cac --- /dev/null +++ b/controller/fw/src/dsss_demod.h @@ -0,0 +1,44 @@ +#ifndef __DSSS_DEMOD_H__ +#define __DSSS_DEMOD_H__ + +#define DSSS_GOLD_CODE_LENGTH ((1<<DSSS_GOLD_CODE_NBITS) - 1) +#define DSSS_GOLD_CODE_COUNT ((1<<DSSS_GOLD_CODE_NBITS) + 1) +#define DSSS_CORRELATION_LENGTH (DSSS_GOLD_CODE_LENGTH * DSSS_DECIMATION) + +struct iir_biquad { + float a[2]; + float b[3]; +}; + +struct iir_biquad_state { + float reg[2]; +}; + +struct cwt_iir_filter_state { + struct iir_biquad_state st[3]; +}; + +struct dsss_demod_state { + float signal[DSSS_CORRELATION_LENGTH]; + size_t signal_wpos; + + float correlation[DSSS_GOLD_CODE_COUNT][DSSS_WAVELET_LUT_SIZE]; + size_t correlation_wpos; + + struct cwt_iir_filter_state cwt_filter[DSSS_GOLD_CODE_COUNT]; + + struct { + int len; /* length of group in samples */ + float max; /* signed value of largest peak in group on any channel */ + int max_idx; /* position of above peak counted from start of group */ + int max_ch; /* channel (gold sequence index) of above peak */ + } group; +}; + +#ifdef SIMULATION +void dsss_demod_step(struct dsss_demod_state *st, float new_value, size_t sim_pos); +#else /* SIMULATION */ +void dsss_demod_step(struct dsss_demod_state *st, float new_value); +#endif /* SIMULATION */ + +#endif /* __DSSS_DEMOD_H__ */ |