diff --git a/impl/CMakeLists.txt b/impl/CMakeLists.txt index 33b8a15..2ed0fd3 100644 --- a/impl/CMakeLists.txt +++ b/impl/CMakeLists.txt @@ -23,6 +23,8 @@ set(sources src/correlator.c src/freq_est.h src/freq_est.c + src/whitening.h + src/whitening.c ) include_directories( diff --git a/impl/src/main.c b/impl/src/main.c index 1f26eb1..9deb8ee 100644 --- a/impl/src/main.c +++ b/impl/src/main.c @@ -12,6 +12,7 @@ #include "transmission.h" #include "correlator.h" #include "freq_est.h" +#include "whitening.h" typedef enum { RX_STATE_ACQUISITION, @@ -286,6 +287,9 @@ int main(void) fec_decode(payload_fec, payload_len_bytes, payload_enc, payload); + // de-whiten the data + whitening_apply_in_place(payload, payload_len_bytes); + int valid = crc_validate_message(PAYLOAD_CRC_SCHEME, payload, payload_len_bytes, payload_crc); payload[payload_len_bytes] = '\0'; diff --git a/impl/src/packet_mod.c b/impl/src/packet_mod.c index aa11368..fcce2c4 100644 --- a/impl/src/packet_mod.c +++ b/impl/src/packet_mod.c @@ -1,6 +1,7 @@ #include #include +#include "whitening.h" #include "preamble.h" #include "config.h" @@ -95,6 +96,10 @@ result_t packet_mod_encode(packet_mod_ctx_t *ctx) return ERR_NO_MEM; } + // whiten the raw data + whitening_apply_in_place(ctx->pkt_bytes, ctx->length); + + // apply the FEC ERR_CHECK_LIQUID(fec_encode(ctx->fec, ctx->length, ctx->pkt_bytes, enc_msg)); free(ctx->pkt_bytes); diff --git a/impl/src/whitening.c b/impl/src/whitening.c new file mode 100644 index 0000000..8d0139d --- /dev/null +++ b/impl/src/whitening.c @@ -0,0 +1,25 @@ +#include + +#include "whitening.h" + +void whitening_apply_in_place(uint8_t *data, size_t length) +{ + /* 9-bit LFSR according to CCITT data whitening procedure. */ + uint16_t lfsr = 0x1FF; + + for(size_t i = 0; i < length; i++) { + uint8_t byte = 0; + + // advance the LFSR and collect the output in a byte. + for(int k = 0; k < 8; k++) { + byte <<= 1; + byte |= lfsr & 0x001; + + uint16_t tmp = lfsr ^ (lfsr >> 5); + lfsr >>= 1; + lfsr |= (tmp & 0x001) << 8; + } + + data[i] ^= byte; + } +} diff --git a/impl/src/whitening.h b/impl/src/whitening.h new file mode 100644 index 0000000..448ad70 --- /dev/null +++ b/impl/src/whitening.h @@ -0,0 +1,9 @@ +#ifndef WHITENING_H +#define WHITENING_H + +#include +#include + +void whitening_apply_in_place(uint8_t *data, size_t length); + +#endif // WHITENING_H