Skip to content

Commit f122681

Browse files
committed
Added parameterizable maximum attenuation.
1 parent dead333 commit f122681

File tree

4 files changed

+98
-19
lines changed

4 files changed

+98
-19
lines changed

Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ noinst_PROGRAMS = examples/rnnoise_demo
3838
endif
3939

4040
examples_rnnoise_demo_SOURCES = examples/rnnoise_demo.c
41-
examples_rnnoise_demo_LDADD = librnnoise.la
41+
examples_rnnoise_demo_LDADD = librnnoise.la $(LIBM)
4242

4343
pkgconfigdir = $(libdir)/pkgconfig
4444
pkgconfig_DATA = rnnoise.pc

examples/rnnoise_demo.c

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,36 +24,73 @@
2424
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2525
*/
2626

27+
#include <math.h>
2728
#include <stdio.h>
2829
#include "rnnoise.h"
30+
#include <stdlib.h>
31+
#include <sys/types.h>
32+
#include "rnnoise.h"
2933

3034
#define FRAME_SIZE 480
3135

3236
int main(int argc, char **argv) {
33-
int i;
37+
int i, ci;
3438
int first = 1;
39+
int channels;
3540
float x[FRAME_SIZE];
36-
FILE *f1, *fout;
37-
DenoiseState *st;
38-
st = rnnoise_create(NULL);
39-
if (argc!=3) {
40-
fprintf(stderr, "usage: %s <noisy speech> <output denoised>\n", argv[0]);
41+
short *tmp;
42+
RNNModel *model = NULL;
43+
DenoiseState **sts;
44+
float max_attenuation;
45+
if (argc < 3) {
46+
fprintf(stderr, "usage: %s <channels> <max attenuation dB> [model]\n", argv[0]);
47+
return 1;
48+
}
49+
50+
channels = atoi(argv[1]);
51+
if (channels < 1) channels = 1;
52+
max_attenuation = pow(10, -atof(argv[2])/10);
53+
54+
if (argc >= 4) {
55+
model = rnnoise_get_model(argv[3]);
56+
if (!model) {
57+
fprintf(stderr, "Model not found!\n");
58+
return 1;
59+
}
60+
}
61+
62+
sts = malloc(channels * sizeof(DenoiseState *));
63+
if (!sts) {
64+
perror("malloc");
4165
return 1;
4266
}
43-
f1 = fopen(argv[1], "r");
44-
fout = fopen(argv[2], "w");
67+
tmp = malloc(channels * FRAME_SIZE * sizeof(short));
68+
if (!tmp) {
69+
perror("malloc");
70+
return 1;
71+
}
72+
for (i = 0; i < channels; i++) {
73+
sts[i] = rnnoise_create(model);
74+
rnnoise_set_param(sts[i], RNNOISE_PARAM_MAX_ATTENUATION, max_attenuation);
75+
}
76+
4577
while (1) {
46-
short tmp[FRAME_SIZE];
47-
fread(tmp, sizeof(short), FRAME_SIZE, f1);
48-
if (feof(f1)) break;
49-
for (i=0;i<FRAME_SIZE;i++) x[i] = tmp[i];
50-
rnnoise_process_frame(st, x, x);
51-
for (i=0;i<FRAME_SIZE;i++) tmp[i] = x[i];
52-
if (!first) fwrite(tmp, sizeof(short), FRAME_SIZE, fout);
78+
fread(tmp, sizeof(short), channels * FRAME_SIZE, stdin);
79+
if (feof(stdin)) break;
80+
81+
for (ci = 0; ci < channels; ci++) {
82+
for (i=0;i<FRAME_SIZE;i++) x[i] = tmp[i*channels+ci];
83+
rnnoise_process_frame(sts[ci], x, x);
84+
for (i=0;i<FRAME_SIZE;i++) tmp[i*channels+ci] = x[i];
85+
}
86+
87+
if (!first) fwrite(tmp, sizeof(short), channels * FRAME_SIZE, stdout);
5388
first = 0;
5489
}
55-
rnnoise_destroy(st);
56-
fclose(f1);
57-
fclose(fout);
90+
91+
for (i = 0; i < channels; i++)
92+
rnnoise_destroy(sts[i]);
93+
free(tmp);
94+
free(sts);
5895
return 0;
5996
}

include/rnnoise.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,9 @@ RNNOISE_EXPORT const char **rnnoise_models(void);
6565

6666
RNNOISE_EXPORT RNNModel *rnnoise_get_model(const char *name);
6767

68+
/* Parameters to a denoise state */
69+
#define RNNOISE_PARAM_MAX_ATTENUATION 1
70+
71+
RNNOISE_EXPORT void rnnoise_set_param(DenoiseState *st, int param, float value);
72+
6873
#endif

src/denoise.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@
6565

6666
#define NB_FEATURES (NB_BANDS+3*NB_DELTA_CEPS+2)
6767

68+
/* We don't allow max attenuation to be more than 60dB */
69+
#define MIN_MAX_ATTENUATION 0.000001f
70+
6871

6972
#ifndef TRAINING
7073
#define TRAINING 0
@@ -99,6 +102,8 @@ struct DenoiseState {
99102
float mem_hp_x[2];
100103
float lastg[NB_BANDS];
101104
RNNState rnn;
105+
106+
float max_attenuation;
102107
};
103108

104109
#if SMOOTH_BANDS
@@ -507,6 +512,26 @@ float rnnoise_process_frame(DenoiseState *st, float *out, const float *in) {
507512
g[i] = MAX16(g[i], alpha*st->lastg[i]);
508513
st->lastg[i] = g[i];
509514
}
515+
516+
/* Apply maximum attenuation (minimum value) */
517+
if (st->max_attenuation) {
518+
float min = 1, mult;
519+
for (i=0;i<NB_BANDS;i++) {
520+
if (g[i] < min) min = g[i];
521+
}
522+
if (min < st->max_attenuation) {
523+
if (min < MIN_MAX_ATTENUATION)
524+
min = MIN_MAX_ATTENUATION;
525+
mult = st->max_attenuation / min;
526+
for (i=0;i<NB_BANDS;i++) {
527+
if (g[i] < MIN_MAX_ATTENUATION) g[i] = MIN_MAX_ATTENUATION;
528+
g[i] *= mult;
529+
if (g[i] > 1) g[i] = 1;
530+
st->lastg[i] = g[i];
531+
}
532+
}
533+
}
534+
510535
interp_band_gain(gf, g);
511536
#if 1
512537
for (i=0;i<FREQ_SIZE;i++) {
@@ -520,6 +545,18 @@ float rnnoise_process_frame(DenoiseState *st, float *out, const float *in) {
520545
return vad_prob;
521546
}
522547

548+
void rnnoise_set_param(DenoiseState *st, int param, float value)
549+
{
550+
switch (param) {
551+
case RNNOISE_PARAM_MAX_ATTENUATION:
552+
if ((value > MIN_MAX_ATTENUATION && value <= 1) || value == 0)
553+
st->max_attenuation = value;
554+
else
555+
st->max_attenuation = MIN_MAX_ATTENUATION;
556+
break;
557+
}
558+
}
559+
523560
#if TRAINING
524561

525562
static float uni_rand() {

0 commit comments

Comments
 (0)