satdump/src-core/modules/npp/viterbi.h
2021-10-09 14:57:07 +02:00

76 lines
No EOL
2.6 KiB
C++

#pragma once
#include <complex>
#define TestBitsLen 1024
#include "libs/viterbi_lib/viterbi.h"
namespace npp
{
class HRDViterbi
{
private:
bool d_sync_check;
//float d_ber_threshold;
int d_insync_after;
int d_outsync_after;
int d_reset_after;
float ber_calc1(struct viterbi_state *state0, struct viterbi_state *state1, unsigned int symsnr, unsigned char *insymbols_I, unsigned char *insymbols_Q);
void phase_move_two(unsigned char phase_state, unsigned int symsnr, unsigned char *in_I, unsigned char *in_Q, unsigned char *out_I, unsigned char *out_Q);
void do_reset();
void enter_idle();
void enter_synced();
int d_mettab[2][256]; //metric table for continuous decoder
struct viterbi_state d_state0[64]; //main viterbi decoder state 0 memory
struct viterbi_state d_state1[64]; //main viterbi decoder state 1 memory
unsigned char d_viterbi_in[4];
bool d_viterbi_enable;
unsigned int d_shift, d_shift_main_decoder;
unsigned int d_phase;
bool d_valid_ber_found;
unsigned char d_bits, d_sym_count;
bool d_even_symbol_last, d_curr_is_even, d_even_symbol;
struct viterbi_state d_00_st0[64];
struct viterbi_state d_00_st1[64];
struct viterbi_state d_180_st0[64];
struct viterbi_state d_180_st1[64];
float d_ber[4][8];
unsigned int d_chan_len; //BER test input syms
unsigned char d_valid_packet_count; //count packets with valid BER
unsigned char d_invalid_packet_count;
unsigned char d_state;
private:
unsigned char *insymbols_interleaved_depunctured;
unsigned char *decoded_data; //viterbi decoded data buffer [symsnr is many more as necessary]
unsigned char *encoded_data; //encoded data buffer
unsigned char *input_symbols_buffer_I; //buffer for to char translated input symbols I
unsigned char *input_symbols_buffer_Q; //buffer for to char translated input symbols Q
unsigned char *input_symbols_buffer_I_ph; //buffer for phase moved symbols I
unsigned char *input_symbols_buffer_Q_ph; //buffer for phase moved symbols Q
public:
float d_ber_threshold;
bool switchInv;
HRDViterbi(bool sync_check, float ber_threshold, int insync_after, int outsync_after, int reset_after, int buffer_size);
~HRDViterbi();
unsigned char &getState();
int work(std::complex<float> *in, int size, uint8_t *output);
float ber();
};
} // namespace npp