opus/dnn/lpcnet_private.h
2023-06-22 00:58:25 -04:00

125 lines
3.5 KiB
C

#ifndef LPCNET_PRIVATE_H
#define LPCNET_PRIVATE_H
#include <stdio.h>
#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