added 8 bit operation mode symbol

This commit is contained in:
Ahmet Inan 2023-02-11 21:18:14 +01:00
commit 13dd3481c7
2 changed files with 43 additions and 11 deletions

View file

@ -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<cmplx, buffer_len> input_hist;
SchmidlCox<value, cmplx, search_pos, symbol_len, guard_len> correlator;
CODE::CRC<uint32_t> crc;
CODE::HadamardDecoder<8> hadamard;
CODE::PolarEncoder<mesg_type> polarenc;
CODE::PolarListDecoder<mesg_type, code_order> 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<cmplx> 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<cmplx> 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)

View file

@ -18,6 +18,7 @@ Copyright 2023 Ahmet Inan <inan@aicodix.de>
#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<value> *pcm;
DSP::FastFourierTransform<symbol_len, cmplx, 1> bwd;
CODE::CRC<uint32_t> crc;
CODE::HadamardEncoder<8> hadamard;
CODE::PolarSysEnc<code_type> 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<value> *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();