1*a58d3d2aSXin Li #ifndef LPCNET_PRIVATE_H 2*a58d3d2aSXin Li #define LPCNET_PRIVATE_H 3*a58d3d2aSXin Li 4*a58d3d2aSXin Li #include <stdio.h> 5*a58d3d2aSXin Li #include "freq.h" 6*a58d3d2aSXin Li #include "lpcnet.h" 7*a58d3d2aSXin Li #include "plc_data.h" 8*a58d3d2aSXin Li #include "pitchdnn.h" 9*a58d3d2aSXin Li #include "fargan.h" 10*a58d3d2aSXin Li 11*a58d3d2aSXin Li 12*a58d3d2aSXin Li #define PITCH_FRAME_SIZE 320 13*a58d3d2aSXin Li #define PITCH_BUF_SIZE (PITCH_MAX_PERIOD+PITCH_FRAME_SIZE) 14*a58d3d2aSXin Li 15*a58d3d2aSXin Li #define PLC_MAX_FEC 100 16*a58d3d2aSXin Li #define MAX_FEATURE_BUFFER_SIZE 4 17*a58d3d2aSXin Li 18*a58d3d2aSXin Li #define PITCH_IF_MAX_FREQ 30 19*a58d3d2aSXin Li #define PITCH_IF_FEATURES (3*PITCH_IF_MAX_FREQ - 2) 20*a58d3d2aSXin Li 21*a58d3d2aSXin Li #define CONT_VECTORS 5 22*a58d3d2aSXin Li 23*a58d3d2aSXin Li #define FEATURES_DELAY 1 24*a58d3d2aSXin Li 25*a58d3d2aSXin Li struct LPCNetEncState{ 26*a58d3d2aSXin Li PitchDNNState pitchdnn; 27*a58d3d2aSXin Li float analysis_mem[OVERLAP_SIZE]; 28*a58d3d2aSXin Li float mem_preemph; 29*a58d3d2aSXin Li kiss_fft_cpx prev_if[PITCH_IF_MAX_FREQ]; 30*a58d3d2aSXin Li float if_features[PITCH_IF_FEATURES]; 31*a58d3d2aSXin Li float xcorr_features[PITCH_MAX_PERIOD - PITCH_MIN_PERIOD]; 32*a58d3d2aSXin Li float dnn_pitch; 33*a58d3d2aSXin Li float pitch_mem[LPC_ORDER]; 34*a58d3d2aSXin Li float pitch_filt; 35*a58d3d2aSXin Li float exc_buf[PITCH_BUF_SIZE]; 36*a58d3d2aSXin Li float lp_buf[PITCH_BUF_SIZE]; 37*a58d3d2aSXin Li float lp_mem[4]; 38*a58d3d2aSXin Li float lpc[LPC_ORDER]; 39*a58d3d2aSXin Li float features[NB_TOTAL_FEATURES]; 40*a58d3d2aSXin Li float sig_mem[LPC_ORDER]; 41*a58d3d2aSXin Li float burg_cepstrum[2*NB_BANDS]; 42*a58d3d2aSXin Li }; 43*a58d3d2aSXin Li 44*a58d3d2aSXin Li typedef struct { 45*a58d3d2aSXin Li float gru1_state[PLC_GRU1_STATE_SIZE]; 46*a58d3d2aSXin Li float gru2_state[PLC_GRU2_STATE_SIZE]; 47*a58d3d2aSXin Li } PLCNetState; 48*a58d3d2aSXin Li 49*a58d3d2aSXin Li #define PLC_BUF_SIZE ((CONT_VECTORS+5)*FRAME_SIZE) 50*a58d3d2aSXin Li struct LPCNetPLCState { 51*a58d3d2aSXin Li PLCModel model; 52*a58d3d2aSXin Li FARGANState fargan; 53*a58d3d2aSXin Li LPCNetEncState enc; 54*a58d3d2aSXin Li int loaded; 55*a58d3d2aSXin Li int arch; 56*a58d3d2aSXin Li 57*a58d3d2aSXin Li #define LPCNET_PLC_RESET_START fec 58*a58d3d2aSXin Li float fec[PLC_MAX_FEC][NB_FEATURES]; 59*a58d3d2aSXin Li int analysis_gap; 60*a58d3d2aSXin Li int fec_read_pos; 61*a58d3d2aSXin Li int fec_fill_pos; 62*a58d3d2aSXin Li int fec_skip; 63*a58d3d2aSXin Li int analysis_pos; 64*a58d3d2aSXin Li int predict_pos; 65*a58d3d2aSXin Li float pcm[PLC_BUF_SIZE]; 66*a58d3d2aSXin Li int blend; 67*a58d3d2aSXin Li float features[NB_TOTAL_FEATURES]; 68*a58d3d2aSXin Li float cont_features[CONT_VECTORS*NB_FEATURES]; 69*a58d3d2aSXin Li int loss_count; 70*a58d3d2aSXin Li PLCNetState plc_net; 71*a58d3d2aSXin Li PLCNetState plc_bak[2]; 72*a58d3d2aSXin Li }; 73*a58d3d2aSXin Li 74*a58d3d2aSXin Li void preemphasis(float *y, float *mem, const float *x, float coef, int N); 75*a58d3d2aSXin Li 76*a58d3d2aSXin Li void compute_frame_features(LPCNetEncState *st, const float *in, int arch); 77*a58d3d2aSXin Li 78*a58d3d2aSXin Li void lpcnet_reset_signal(LPCNetState *lpcnet); 79*a58d3d2aSXin Li void run_frame_network(LPCNetState *lpcnet, float *gru_a_condition, float *gru_b_condition, float *lpc, const float *features); 80*a58d3d2aSXin Li void run_frame_network_deferred(LPCNetState *lpcnet, const float *features); 81*a58d3d2aSXin Li void run_frame_network_flush(LPCNetState *lpcnet); 82*a58d3d2aSXin Li 83*a58d3d2aSXin Li 84*a58d3d2aSXin Li void lpcnet_synthesize_tail_impl(LPCNetState *lpcnet, opus_int16 *output, int N, int preload); 85*a58d3d2aSXin Li void lpcnet_synthesize_impl(LPCNetState *lpcnet, const float *features, opus_int16 *output, int N, int preload); 86*a58d3d2aSXin Li void lpcnet_synthesize_blend_impl(LPCNetState *lpcnet, const opus_int16 *pcm_in, opus_int16 *output, int N); 87*a58d3d2aSXin Li 88*a58d3d2aSXin Li void run_frame_network(LPCNetState *lpcnet, float *gru_a_condition, float *gru_b_condition, float *lpc, const float *features); 89*a58d3d2aSXin Li 90*a58d3d2aSXin Li #endif 91