From 4100c7fce0dd01358175d4cc318501df2c23a0e8 Mon Sep 17 00:00:00 2001 From: LongHairedHacker Date: Sat, 14 Jul 2018 14:51:06 +0200 Subject: [PATCH] Finished implementing wspr coding process --- firmware/scripts/wspr_coding | Bin 13128 -> 0 bytes firmware/scripts/wspr_coding.c | 80 +++++++++++++++++++++++++-------- 2 files changed, 62 insertions(+), 18 deletions(-) delete mode 100755 firmware/scripts/wspr_coding diff --git a/firmware/scripts/wspr_coding b/firmware/scripts/wspr_coding deleted file mode 100755 index ed8466e48e97e24bbfec5a008e5e8492d350cfa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13128 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 diff --git a/firmware/scripts/wspr_coding.c b/firmware/scripts/wspr_coding.c index 4317e95..b23efca 100644 --- a/firmware/scripts/wspr_coding.c +++ b/firmware/scripts/wspr_coding.c @@ -3,6 +3,8 @@ #include #include +static const uint8_t WSPR_LENGTH = 162; + uint8_t wspr_call_char(char c) { c = toupper(c); if(c >= '0' && c <= '9') { @@ -41,18 +43,18 @@ uint8_t wspr_power(uint8_t power) { uint64_t wspr_message(char *call, char *loc, uint8_t power) { uint32_t m, n; - n = wspr_loc_char(call[0]); - n = n * 36 + wspr_loc_char(call[1]); - n = n * 10 + wspr_loc_char(call[2]); - n = n * 27 + wspr_loc_char(call[3]) - 10; - n = n * 27 + wspr_loc_char(call[4]) - 10; - n = n * 27 + wspr_loc_char(call[5]) - 10; + n = wspr_call_char(call[0]); + n = n * 36 + wspr_call_char(call[1]); + n = n * 10 + wspr_call_char(call[2]); + n = n * 27 + wspr_call_char(call[3]) - 10; + n = n * 27 + wspr_call_char(call[4]) - 10; + n = n * 27 + wspr_call_char(call[5]) - 10; m = 179 - 10 * wspr_loc_char(loc[0]) - wspr_loc_char(loc[2]); m = m * 180 + 10 * wspr_loc_char(loc[1]) + wspr_loc_char(loc[3]); m = m * 128 + wspr_power(power) + 64; - return n << 21 | m; + return ((uint64_t) n) << 22 | m; } const uint32_t WSPR_FEC_TAPS1 = 0xF2D05351; @@ -68,13 +70,13 @@ uint8_t wspr_parity32(uint32_t x) { } void wspr_fec(uint64_t msg, uint8_t *output) { - memset(output, 0, 162); + memset(output, 0, WSPR_LENGTH); uint32_t reg = 0; for(uint8_t i = 0; i < 81; i++) { uint8_t bit = 0; if(i < 50) { - bit = (msg & (1 << (50 - i))) != 0; + bit = (msg >> (50 - i - 1)) & 1; } reg = (reg << 1) | bit; @@ -104,9 +106,9 @@ uint8_t wspr_reverse_bits(uint8_t bits) { void wspr_interleave(uint8_t *input, uint8_t *output) { uint8_t p = 0; uint8_t i = 0; - while(p < 162) { + while(p < WSPR_LENGTH) { uint8_t rev_i = wspr_reverse_bits(i); - if(rev_i < 162) { + if(rev_i < WSPR_LENGTH) { output[rev_i] = input[p]; p++; } @@ -122,23 +124,65 @@ const uint8_t WSPR_SYNC[162] = { }; void wspr_add_sync(uint8_t *symbols) { - for(uint8_t i = 0; i < 161; i++) { + for(uint8_t i = 0; i < WSPR_LENGTH; i++) { symbols[i] = WSPR_SYNC[i] + 2 * symbols[i]; } } -int main(int argc, char const *argv[]) { +uint64_t validation_msg = 1086526031934565; + +uint8_t validation_bits[162] = { + 1,1,1,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,0, + 1,1,0,1,1,0,1,1,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1, + 0,0,0,1,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,0,0,1,1,1,1, + 0,1,1,0,1,1,0,1,0,1,0,1,0,1,0,1,1,0,0,0,1,1,0,1,0,0,1,1,1,1 +}; + +uint8_t validation[162] = { + 3, 3, 0, 0, 2, 0, 0, 0, 1, 0, 2, 0, 1, 3, 1, 2, 2, 2, 1, 0, 0, 3, 2, 3, 1, 3, 3, 2, 2, 0, + 2, 0, 0, 0, 3, 2, 0, 1, 2, 3, 2, 2, 0, 0, 2, 2, 3, 2, 1, 1, 0, 2, 3, 3, 2, 1, 0, 2, 2, 1, + 3, 2, 1, 2, 2, 2, 0, 3, 3, 0, 3, 0, 3, 0, 1, 2, 1, 0, 2, 1, 2, 0, 3, 2, 1, 3, 2, 0, 0, 3, + 3, 2, 3, 0, 3, 2, 2, 0, 3, 0, 2, 0, 2, 0, 1, 0, 2, 3, 0, 2, 1, 1, 1, 2, 3, 3, 0, 2, 3, 1, + 2, 1, 2, 2, 2, 1, 3, 3, 2, 0, 0, 0, 0, 1, 0, 3, 2, 0, 1, 3, 2, 2, 2, 2, 2, 0, 2, 3, 3, 2, + 3, 2, 3, 3, 2, 0, 0, 3, 1, 2, 2, 2 +}; + +int main(int argc, char const *argv[]) { + uint8_t test[162]; + uint8_t test1[162]; + uint64_t msg = wspr_message(" K1ABC", "FN42", 37); + + + if(msg == validation_msg) { + printf("%lu✓\n", msg); + } + else { + printf("%lu✗\n", msg); + } - uint8_t test[161]; - uint8_t test1[161]; - uint64_t msg = wspr_message("DL1SSK", "JN39WE", 27); wspr_fec(msg, test); + + for(uint8_t i = 0; i < WSPR_LENGTH; i++) { + if(test[i] == validation_bits[i]) { + printf("%d✓", test[i]); + } + else { + printf("%d✗", test[i]); + } + } + printf("\n\n"); + wspr_interleave(test, test1); wspr_add_sync(test1); - for(uint8_t i = 0; i < 161; i++) { - printf("%d,", test1[i]); + for(uint8_t i = 0; i < WSPR_LENGTH; i++) { + if(test1[i] == validation[i]) { + printf("%d✓", test1[i]); + } + else { + printf("%d✗", test1[i]); + } } printf("\n");