Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Alter library to support streaming from a ringbuffer #62

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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