test multiple polynomials

This commit is contained in:
Ahmet Inan 2025-07-12 14:12:24 +02:00
commit 80b2cb4483
3 changed files with 32 additions and 14 deletions

View file

@ -29,6 +29,9 @@ struct Common
static const int block_skew = 3;
static const int first_meta = 4;
static const int first_seed = 9;
static constexpr int slm_poly[16] = {
0x11d, 0x12b, 0x12d, 0x14d, 0x15f, 0x163, 0x165, 0x169,
0x171, 0x187, 0x18d, 0x1a9, 0x1c3, 0x1cf, 0x1e7, 0x1f5 };
CODE::CRC<uint32_t> crc0;
CODE::HadamardEncoder<6> hadamard_encoder;
int8_t meta[32];

View file

@ -278,6 +278,10 @@ struct Decoder : Common
for (int i = 0; i < meta_tones; ++i)
meta[i] = clamp(std::nearbyint(127 * demod[i*block_length+meta_off].real()));
int meta_data = hadamard_decoder(meta);
if (meta_data < 0) {
std::cerr << "meta data damaged" << std::endl;
meta_data = 0;
}
hadamard_encoder(meta, meta_data);
for (int i = 0; i < meta_tones; ++i) {
tone[block_length*i+meta_off] *= meta[i];
@ -290,6 +294,10 @@ struct Decoder : Common
for (int i = 0; i < seed_tones; ++i)
seed[i] = clamp(std::nearbyint(127 * demod[i*block_length+seed_off].real()));
int seed_data = hadamard_decoder(seed);
if (seed_data < 0) {
std::cerr << "seed data damaged" << std::endl;
seed_data = 0;
}
hadamard_encoder(seed, seed_data);
for (int i = 0; i < seed_tones; ++i) {
tone[block_length*i+seed_off] *= seed[i];
@ -315,10 +323,15 @@ struct Decoder : Common
for (int i = seed_off; i < tone_count; i += block_length)
chan[i] = DSP::lerp(chan[i], tone[i], value(0.5));
}
CODE::MLS seq2(mls2_poly, seed_data);
int poly_index = j ? meta_data : 0;
if (poly_index < 0 || poly_index > 15) {
std::cerr << "poly index damaged" << std::endl;
meta_data = 0;
}
CODE::MLS seq(slm_poly[poly_index], seed_data+1);
for (int i = 0; i < tone_count; ++i)
if (i % block_length != meta_off && i % block_length != seed_off)
demod[i] *= nrz(seq2());
demod[i] *= nrz(seq());
value sp = 0, np = 0;
for (int i = 0, l = k; i < tone_count; ++i) {
cmplx hard(1, 0);

View file

@ -79,23 +79,25 @@ struct Encoder : public Common
value scale = value(0.5) / std::sqrt(value(tone_count));
for (int i = 0; differential && symbol_number > 0 && i < tone_count; ++i)
tone[i] *= prev[i];
if (symbol_number >= 0) {
hadamard_encoder(meta, symbol_number ? symbol_number : oper_mode);
for (int i = 0; i < meta_tones; ++i)
tone[block_length*i+meta_off] *= meta[i];
}
value best_papr = 1000;
for (int trial = 0; trial < 64; ++trial) {
int trials = symbol_number ? 16 * 64 : 64;
for (int trial = 0; trial < trials; ++trial) {
for (int i = 0; i < tone_count; ++i)
temp[i] = tone[i];
if (symbol_number >= 0) {
hadamard_encoder(seed, trial);
CODE::MLS seq2(mls2_poly, trial);
for (int i = 0, s = 0; i < tone_count; ++i)
if (i % block_length == seed_off)
int poly_index = trial >> 6;
int meta_data = symbol_number ? poly_index : oper_mode;
hadamard_encoder(meta, meta_data);
int seed_data = trial & 63;
hadamard_encoder(seed, seed_data);
CODE::MLS seq(slm_poly[poly_index], seed_data + 1);
for (int i = 0, m = 0, s = 0; i < tone_count; ++i)
if (i % block_length == meta_off)
temp[i] *= meta[m++];
else if (i % block_length == seed_off)
temp[i] *= seed[s++];
else if (i % block_length != meta_off)
temp[i] *= nrz(seq2());
else
temp[i] *= nrz(seq());
}
for (int i = 0; i < symbol_len; ++i)
fdom[i] = 0;