#ifndef LPCNET_PRIVATE_H #define LPCNET_PRIVATE_H #include #include "common.h" #include "freq.h" #include "lpcnet.h" #include "nnet_data.h" #include "plc_data.h" #include "kiss99.h" #define BITS_PER_CHAR 8 #define PITCH_MIN_PERIOD 32 #define PITCH_MAX_PERIOD 256 #define PITCH_FRAME_SIZE 320 #define PITCH_BUF_SIZE (PITCH_MAX_PERIOD+PITCH_FRAME_SIZE) #define MULTI 4 #define MULTI_MASK (MULTI-1) #define FORBIDDEN_INTERP 7 #define PLC_MAX_FEC 100 #define MAX_FEATURE_BUFFER_SIZE 4 struct LPCNetState { LPCNetModel model; float sampling_logit_table[256]; kiss99_ctx rng; #define LPCNET_RESET_START nnet NNetState nnet; int last_exc; float last_sig[LPC_ORDER]; float feature_buffer[NB_FEATURES*MAX_FEATURE_BUFFER_SIZE]; int feature_buffer_fill; float last_features[NB_FEATURES]; #if FEATURES_DELAY>0 float old_lpc[FEATURES_DELAY][LPC_ORDER]; #endif float gru_a_condition[3*GRU_A_STATE_SIZE]; float gru_b_condition[3*GRU_B_STATE_SIZE]; int frame_count; float deemph_mem; float lpc[LPC_ORDER]; }; struct LPCNetDecState { LPCNetState lpcnet_state; float vq_mem[NB_BANDS]; }; struct LPCNetEncState{ float analysis_mem[OVERLAP_SIZE]; float mem_preemph; int pcount; float pitch_mem[LPC_ORDER]; float pitch_filt; float xc[10][PITCH_MAX_PERIOD+1]; float frame_weight[10]; float exc_buf[PITCH_BUF_SIZE]; float pitch_max_path[2][PITCH_MAX_PERIOD]; float pitch_max_path_all; int best_i; float last_gain; int last_period; float lpc[LPC_ORDER]; float vq_mem[NB_BANDS]; float features[4][NB_TOTAL_FEATURES]; float sig_mem[LPC_ORDER]; int exc_mem; float burg_cepstrum[2*NB_BANDS]; }; #define PLC_BUF_SIZE (FEATURES_DELAY*FRAME_SIZE + TRAINING_OFFSET) struct LPCNetPLCState { PLCModel model; LPCNetState lpcnet; LPCNetEncState enc; int enable_blending; #define LPCNET_PLC_RESET_START fec float fec[PLC_MAX_FEC][NB_FEATURES]; int fec_keep_pos; int fec_read_pos; int fec_fill_pos; int fec_skip; short pcm[PLC_BUF_SIZE+FRAME_SIZE]; int pcm_fill; int skip_analysis; int blend; float features[NB_TOTAL_FEATURES]; int loss_count; PLCNetState plc_net; PLCNetState plc_copy[FEATURES_DELAY+1]; }; void preemphasis(float *y, float *mem, const float *x, float coef, int N); void perform_double_interp(float features[4][NB_TOTAL_FEATURES], const float *mem, int best_id); void compute_frame_features(LPCNetEncState *st, const float *in); void decode_packet(float features[4][NB_TOTAL_FEATURES], float *vq_mem, const unsigned char buf[8]); void lpcnet_reset_signal(LPCNetState *lpcnet); void run_frame_network(LPCNetState *lpcnet, float *gru_a_condition, float *gru_b_condition, float *lpc, const float *features); void run_frame_network_deferred(LPCNetState *lpcnet, const float *features); void run_frame_network_flush(LPCNetState *lpcnet); void lpcnet_synthesize_tail_impl(LPCNetState *lpcnet, short *output, int N, int preload); void lpcnet_synthesize_impl(LPCNetState *lpcnet, const float *features, short *output, int N, int preload); void lpcnet_synthesize_blend_impl(LPCNetState *lpcnet, const short *pcm_in, short *output, int N); void process_single_frame(LPCNetEncState *st, FILE *ffeat); int lpcnet_compute_single_frame_features(LPCNetEncState *st, const short *pcm, float features[NB_TOTAL_FEATURES]); void process_single_frame(LPCNetEncState *st, FILE *ffeat); void run_frame_network(LPCNetState *lpcnet, float *gru_a_condition, float *gru_b_condition, float *lpc, const float *features); int parse_weights(WeightArray **list, const unsigned char *data, int len); #endif