summaryrefslogtreecommitdiff
path: root/controller/fw/src/dsss_demod.h
blob: b9e75d2f21dc3ff248b91719623b6f7553d6f51d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#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)

/* 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;

#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[DSSS_GOLD_CODE_COUNT];

    struct group group;

    struct matcher_state matcher_cache[DSSS_MATCHER_CACHE_SIZE];
};


extern void handle_dsss_received(uint8_t data[TRANSMISSION_SYMBOLS]);

void dsss_demod_init(struct dsss_demod_state *st);
#ifdef SIMULATION
void dsss_demod_step(struct dsss_demod_state *st, float new_value, uint64_t ts, int record_channel);
#else /* SIMULATION */
void dsss_demod_step(struct dsss_demod_state *st, float new_value, uint64_t ts);
#endif /* SIMULATION */

#endif /* __DSSS_DEMOD_H__ */