ref: 8ca8adae2bdf086c83edf45560bc14d943ab13d3
parent: e018b6f1521abcf6c971130c2b4108fbdfd3df0a
author: Jean-Marc Valin <jmvalin@jmvalin.ca>
date: Sun Jun 24 19:00:08 EDT 2018
Add LPC analysis
--- a/dnn/celt_lpc.h
+++ b/dnn/celt_lpc.h
@@ -35,7 +35,7 @@
#include "x86/celt_lpc_sse.h"
#endif
-#define LPC_ORDER 24
+#define LPC_ORDER 16
void _celt_lpc(opus_val16 *_lpc, const opus_val32 *ac, int p);
--- a/dnn/denoise.c
+++ b/dnn/denoise.c
@@ -37,7 +37,10 @@
#include "rnnoise.h"
#include "pitch.h"
#include "arch.h"
+#include "celt_lpc.h"
+#define PREEMPHASIS (0.85f)
+
#define FRAME_SIZE_SHIFT 2
#define FRAME_SIZE (40<<FRAME_SIZE_SHIFT)
#define WINDOW_SIZE (2*FRAME_SIZE)
@@ -305,10 +308,23 @@
static void frame_analysis(DenoiseState *st, kiss_fft_cpx *X, float *Ex, const float *in) {int i;
float x[WINDOW_SIZE];
+ float ac[LPC_ORDER+1];
+ float lpc[LPC_ORDER];
RNN_COPY(x, st->analysis_mem, FRAME_SIZE);
for (i=0;i<FRAME_SIZE;i++) x[FRAME_SIZE + i] = in[i];
RNN_COPY(st->analysis_mem, in, FRAME_SIZE);
apply_window(x);
+ {+ _celt_autocorr(x, ac, NULL, 0, LPC_ORDER, WINDOW_SIZE);
+ /* -40 dB noise floor. */
+ ac[0] -= ac[0]*1e-4;
+ /* Lag windowing. */
+ for (i=1;i<LPC_ORDER+1;i++) ac[i] *= (1 - 6e-5*i*i);
+ _celt_lpc(lpc, ac, LPC_ORDER);
+ printf("1 ");+ for(i=0;i<LPC_ORDER;i++) printf("%f ", lpc[i]);+ printf("\n");+ }
forward_transform(X, x);
#if TRAINING
for (i=lowpass;i<FREQ_SIZE;i++)
@@ -429,6 +445,16 @@
}
}
+static void preemphasis(float *y, float *mem, const float *x, float coef, int N) {+ int i;
+ for (i=0;i<N;i++) {+ float yi;
+ yi = x[i] + *mem;
+ *mem = -coef*x[i];
+ y[i] = yi;
+ }
+}
+
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;
@@ -521,6 +547,7 @@
static const float a_hp[2] = {-1.99599, 0.99600}; static const float b_hp[2] = {-2, 1}; float mem_hp_x[2]={0};+ float mem_preemph=0;
float x[FRAME_SIZE];
FILE *f1;
DenoiseState *st;
@@ -546,10 +573,11 @@
for (i=0;i<FRAME_SIZE;i++) x[i] = tmp[i];
for (i=0;i<FRAME_SIZE;i++) E += tmp[i]*(float)tmp[i];
biquad(x, mem_hp_x, x, b_hp, a_hp, FRAME_SIZE);
+ preemphasis(x, &mem_preemph, x, PREEMPHASIS, FRAME_SIZE);
compute_frame_features(st, X, P, Ex, Ep, Exp, features, x);
pitch_filter(X, P, Ex, Ep, Exp, g);
-#if 1
+#if 0
fwrite(features, sizeof(float), NB_FEATURES, stdout);
fwrite(g, sizeof(float), NB_BANDS, stdout);
fwrite(Ln, sizeof(float), NB_BANDS, stdout);
--
⑨