Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/rnnoise.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@jmvalin.ca>2017-08-16 22:23:00 +0300
committerJean-Marc Valin <jmvalin@jmvalin.ca>2017-08-16 22:23:00 +0300
commitc7aabb5db4ccab9352269e2e364a2f3f042ca146 (patch)
treeefb3dff2f9ea5fd622d5af6f9194a04c4c1aeedb
parent5f646c195fbbca32db5a62d6a80f3bc0d262012e (diff)
Adds pitch filtering
-rw-r--r--src/denoise.c51
1 files changed, 44 insertions, 7 deletions
diff --git a/src/denoise.c b/src/denoise.c
index 7e2cb6a..27d745b 100644
--- a/src/denoise.c
+++ b/src/denoise.c
@@ -5,6 +5,7 @@
#include "common.h"
#include <math.h>
#include "pitch.h"
+#include "arch.h"
#include "rnn.h"
#include "rnn_data.h"
@@ -375,6 +376,41 @@ static void biquad(float *y, float mem[2], const float *x, const float *b, const
}
}
+void pitch_filter(kiss_fft_cpx *X, const kiss_fft_cpx *P, const float *Ex, const float *Ep,
+ const float *Exp, const float *g) {
+ int i;
+ float r[NB_BANDS];
+ float rf[FREQ_SIZE] = {0};
+ for (i=0;i<NB_BANDS;i++) {
+#if 0
+ if (Exp[i]>g[i]) r[i] = 1;
+ else r[i] = Exp[i]*(1-g[i])/(.001 + g[i]*(1-Exp[i]));
+ r[i] = MIN16(1, MAX16(0, r[i]));
+#else
+ if (Exp[i]>g[i]) r[i] = 1;
+ else r[i] = SQUARE(Exp[i])*(1-SQUARE(g[i]))/(.001 + SQUARE(g[i])*(1-SQUARE(Exp[i])));
+ r[i] = sqrt(MIN16(1, MAX16(0, r[i])));
+#endif
+ r[i] *= sqrt(Ex[i]/(1e-8+Ep[i]));
+ }
+ interp_band_gain(rf, r);
+ for (i=0;i<FREQ_SIZE;i++) {
+ X[i].r += rf[i]*P[i].r;
+ X[i].i += rf[i]*P[i].i;
+ }
+ float newE[NB_BANDS];
+ compute_band_energy(newE, X);
+ float norm[NB_BANDS];
+ float normf[FREQ_SIZE]={0};
+ for (i=0;i<NB_BANDS;i++) {
+ norm[i] = sqrt(Ex[i]/(1e-8+newE[i]));
+ }
+ interp_band_gain(normf, norm);
+ for (i=0;i<FREQ_SIZE;i++) {
+ X[i].r *= normf[i];
+ X[i].i *= normf[i];
+ }
+}
void rnnoise_process_frame(DenoiseState *st, float *out, const float *in) {
int i;
@@ -395,6 +431,7 @@ void rnnoise_process_frame(DenoiseState *st, float *out, const float *in) {
if (!silence) {
compute_rnn(&st->rnn, g, &vad_prob, features);
+ pitch_filter(X, P, Ex, Ep, Exp, g);
interp_band_gain(gf, g);
#if 1
for (i=0;i<FREQ_SIZE;i++) {
@@ -504,13 +541,14 @@ int main(int argc, char **argv) {
else if (vad_cnt > 0) vad = 0.5f;
else vad = 1.f;
- frame_analysis(st, X, Ex, x);
+ frame_analysis(st, Y, Ey, x);
frame_analysis(noise_state, N, En, n);
for (i=0;i<NB_BANDS;i++) Ln[i] = log10(1e-2+En[i]);
- int silence = compute_frame_features(noisy, Y, P, Ey, Ep, Exp, features, xn);
+ int silence = compute_frame_features(noisy, X, P, Ex, Ep, Exp, features, xn);
+ pitch_filter(X, P, Ex, Ep, Exp, g);
//printf("%f %d\n", noisy->last_gain, noisy->last_period);
for (i=0;i<NB_BANDS;i++) {
- g[i] = sqrt((Ex[i]+1e-2)/(Ey[i]+1e-2));
+ g[i] = sqrt((Ey[i]+1e-2)/(Ex[i]+1e-2));
if (g[i] > 1) g[i] = 1;
if (silence) g[i] = -1;
}
@@ -529,15 +567,14 @@ int main(int argc, char **argv) {
#endif
#if 0
compute_rnn(&noisy->rnn, g, &vad_prob, features);
- //for (i=0;i<NB_BANDS;i++) scanf("%f", &g[i]);
interp_band_gain(gf, g);
#if 1
for (i=0;i<FREQ_SIZE;i++) {
- Y[i].r *= gf[i];
- Y[i].i *= gf[i];
+ X[i].r *= gf[i];
+ X[i].i *= gf[i];
}
#endif
- frame_synthesis(noisy, xn, Y);
+ frame_synthesis(noisy, xn, X);
for (i=0;i<FRAME_SIZE;i++) tmp[i] = xn[i];
fwrite(tmp, sizeof(short), FRAME_SIZE, fout);