xref: /aosp_15_r20/external/libopus/dnn/lpcnet_private.h (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
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