Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion include/rnnoise.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,8 @@ RNNOISE_EXPORT DenoiseState *rnnoise_create();

RNNOISE_EXPORT void rnnoise_destroy(DenoiseState *st);

RNNOISE_EXPORT float rnnoise_process_frame(DenoiseState *st, float *out, const float *in);
RNNOISE_EXPORT size_t rnnoise_need_samples(DenoiseState *st);

RNNOISE_EXPORT size_t rnnoise_add_samples(DenoiseState *st, const float *in, size_t samples);

RNNOISE_EXPORT float rnnoise_process_frame(DenoiseState *st, float *out);
34 changes: 28 additions & 6 deletions src/denoise.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ typedef struct {
} CommonState;

struct DenoiseState {
float input[FRAME_SIZE];
size_t input_pos;

float analysis_mem[FRAME_SIZE];
float cepstral_mem[CEPS_MEM][NB_BANDS];
int memid;
Expand Down Expand Up @@ -468,22 +471,41 @@ void pitch_filter(kiss_fft_cpx *X, const kiss_fft_cpx *P, const float *Ex, const
}
}

float rnnoise_process_frame(DenoiseState *st, float *out, const float *in) {
size_t rnnoise_need_samples(DenoiseState *st) {
return FRAME_SIZE - st->input_pos;
}

size_t rnnoise_add_samples(DenoiseState *st, const float *in, size_t samples) {
static const float a_hp[2] = {-1.99599, 0.99600};
static const float b_hp[2] = {-2, 1};

if (FRAME_SIZE - st->input_pos < samples)
samples = FRAME_SIZE - st->input_pos;

if (!samples)
return 0;

biquad(st->input + st->input_pos, st->mem_hp_x, in, b_hp, a_hp, samples);
st->input_pos += samples;

return samples;
}

float rnnoise_process_frame(DenoiseState *st, float *out) {
int i;
kiss_fft_cpx X[FREQ_SIZE];
kiss_fft_cpx P[WINDOW_SIZE];
float x[FRAME_SIZE];
float Ex[NB_BANDS], Ep[NB_BANDS];
float Exp[NB_BANDS];
float features[NB_FEATURES];
float g[NB_BANDS];
float gf[FREQ_SIZE]={1};
float vad_prob = 0;
int silence;
static const float a_hp[2] = {-1.99599, 0.99600};
static const float b_hp[2] = {-2, 1};
biquad(x, st->mem_hp_x, in, b_hp, a_hp, FRAME_SIZE);
silence = compute_frame_features(st, X, P, Ex, Ep, Exp, features, x);

celt_assert(st->input_pos == FRAME_SIZE);
silence = compute_frame_features(st, X, P, Ex, Ep, Exp, features, st->input);
st->input_pos = 0;

if (!silence) {
compute_rnn(&st->rnn, g, &vad_prob, features);
Expand Down