From 13dd3481c77691151dafde0d9834825cbc9f8ff4 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Sat, 11 Feb 2023 21:18:14 +0100 Subject: [PATCH] added 8 bit operation mode symbol --- decode.cc | 44 +++++++++++++++++++++++++++++++++----------- encode.cc | 10 ++++++++++ 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/decode.cc b/decode.cc index 40e2dd1..ef901af 100644 --- a/decode.cc +++ b/decode.cc @@ -26,6 +26,7 @@ namespace DSP { using std::abs; using std::min; using std::cos; using std::sin; #include "mls.hh" #include "crc.hh" #include "psk.hh" +#include "hadamard_decoder.hh" #include "polar_tables.hh" #include "polar_helper.hh" #include "polar_encoder.hh" @@ -184,6 +185,7 @@ struct Decoder DSP::BipBuffer input_hist; SchmidlCox correlator; CODE::CRC crc; + CODE::HadamardDecoder<8> hadamard; CODE::PolarEncoder polarenc; CODE::PolarListDecoder polardec; mesg_type mesg[mesg_bits], mess[code_len]; @@ -247,6 +249,7 @@ struct Decoder { frozen_bits = frozen_4096_2080; blockdc.samples(filter_len); + DSP::Phasor osc; const cmplx *buf; bool okay; do { @@ -261,23 +264,42 @@ struct Decoder cfo_rad = correlator.cfo_rad; std::cerr << "symbol pos: " << symbol_pos << std::endl; std::cerr << "coarse cfo: " << cfo_rad * (sample_rate / Const::TwoPi()) << " Hz " << std::endl; + + osc.omega(-cfo_rad); + for (int i = 0; i < symbol_pos; ++i) + buf = next_sample(); + for (int i = 0; i < symbol_len; ++i) + tdom[i] = buf[i] * osc(); + for (int i = 0; i < guard_len; ++i) + osc(); + fwd(fdom, tdom); + for (int i = 0; i < subcarrier_count; ++i) + prev[i] = fdom[first_subcarrier+i]; + for (int i = 0; i < symbol_len+guard_len; ++i) + buf = next_sample(); + for (int i = 0; i < symbol_len; ++i) + tdom[i] = buf[i] * osc(); + for (int i = 0; i < guard_len; ++i) + osc(); + fwd(fdom, tdom); + for (int i = 0; i < subcarrier_count; ++i) + cons[i] = demod_or_erase(fdom[first_subcarrier+i], prev[i]); + for (int i = 0; i < subcarrier_count; ++i) + prev[i] = fdom[first_subcarrier+i]; + for (int i = 0; i < subcarrier_count; ++i) + mod_soft(code+mod_bits*i, cons[i], 8); + int oper_mode = hadamard(code); + if (oper_mode != 1) { + std::cerr << "operation mode " << oper_mode << " unsupported." << std::endl; + continue; + } + std::cerr << "oper mode: " << oper_mode << std::endl; okay = true; } while (skip_count--); if (!okay) return; - DSP::Phasor osc; - osc.omega(-cfo_rad); - for (int i = 0; i < symbol_pos; ++i) - buf = next_sample(); - for (int i = 0; i < symbol_len; ++i) - tdom[i] = buf[i] * osc(); - for (int i = 0; i < guard_len; ++i) - osc(); - fwd(fdom, tdom); - for (int i = 0; i < subcarrier_count; ++i) - prev[i] = fdom[first_subcarrier+i]; std::cerr << "demod "; for (int j = 0; j < payload_symbols; ++j) { for (int i = 0; i < symbol_len+guard_len; ++i) diff --git a/encode.cc b/encode.cc index b1a8ec9..0c76fc9 100644 --- a/encode.cc +++ b/encode.cc @@ -18,6 +18,7 @@ Copyright 2023 Ahmet Inan #include "mls.hh" #include "crc.hh" #include "psk.hh" +#include "hadamard_encoder.hh" #include "polar_tables.hh" #include "polar_helper.hh" #include "polar_encoder.hh" @@ -40,6 +41,7 @@ struct Encoder DSP::WritePCM *pcm; DSP::FastFourierTransform bwd; CODE::CRC crc; + CODE::HadamardEncoder<8> hadamard; CODE::PolarSysEnc polarenc; code_type code[code_len], mesg[mesg_bits]; cmplx fdom[symbol_len], tdom[symbol_len], guard[guard_len]; @@ -77,6 +79,13 @@ struct Encoder symbol(); symbol(false); } + void meta_data(int data) + { + hadamard(code, data); + for (int i = 0; i < subcarrier_count; ++i) + fdom[first_subcarrier+i] *= mod_map(code+mod_bits*i); + symbol(); + } cmplx mod_map(code_type *b) { return PhaseShiftKeying<4, cmplx, code_type>::map(b); @@ -84,6 +93,7 @@ struct Encoder Encoder(DSP::WritePCM *pcm, const uint8_t *inp) : pcm(pcm), crc(0x8F6E37A0) { schmidl_cox(); + meta_data(1); for (int i = 0; i < data_bits; ++i) mesg[i] = nrz(CODE::get_le_bit(inp, i)); crc.reset();