#ifndef __DSSS_DEMOD_H__ #define __DSSS_DEMOD_H__ #include <stdint.h> #include <unistd.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) /* FIXME: move to makefile */ #define DSSS_MATCHER_CACHE_SIZE 8 /* FIXME: move to more appropriate header */ #define PAYLOAD_DATA_BYTE ((PAYLOAD_DATA_BIT+7)/8) 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 group { int len; /* length of group in samples */ float max; /* signed value of largest peak in group on any channel */ uint64_t max_ts; /* absolute position of above peak */ int max_ch; /* channel (gold sequence index) of above peak */ }; struct matcher_state { int last_phase; /* 0 .. DSSS_CORRELATION_LENGTH */ int candidate_phase; float last_score; float candidate_score; int last_skips; int candidate_skips; #if DSSS_GOLD_CODE_NBITS > 7 #error DSSS_GOLD_CODE_NBITS is too large for matcher_state.data data type (uint8_t) #endif uint8_t data[TRANSMISSION_SYMBOLS]; int data_pos; uint8_t candidate_data; }; 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; struct group group; struct matcher_state matcher_cache[DSSS_MATCHER_CACHE_SIZE]; }; extern void handle_dsss_received(uint8_t data[static TRANSMISSION_SYMBOLS]); void dsss_demod_init(struct dsss_demod_state *st); void dsss_demod_step(struct dsss_demod_state *st, float new_value, uint64_t ts); #endif /* __DSSS_DEMOD_H__ */