shithub: opus

Download patch

ref: 4259d354df7159e44b580257981635611ed075ab
parent: b22b11a412977570ef0a8581cb7ebc9edbaf4e39
author: Jean-Marc Valin <jmvalin@amazon.com>
date: Sat Oct 28 22:20:35 EDT 2023

Reusing already-optimized celt_fir()

--- a/dnn/lpcnet_enc.c
+++ b/dnn/lpcnet_enc.c
@@ -42,6 +42,7 @@
 #include "lpcnet.h"
 #include "os_support.h"
 #include "_kiss_fft_guts.h"
+#include "celt_lpc.h"
 
 
 int lpcnet_encoder_get_size(void) {
@@ -98,6 +99,7 @@
   float xcorr[PITCH_MAX_PERIOD];
   float ener0;
   float ener;
+  float x[FRAME_SIZE+LPC_ORDER];
   /* [b,a]=ellip(2, 2, 20, 1200/8000); */
   static const float lp_b[2] = {-0.84946f, 1.f};
   static const float lp_a[2] = {-1.54220f, 0.70781f};
@@ -131,16 +133,13 @@
   OPUS_MOVE(st->exc_buf, &st->exc_buf[FRAME_SIZE], PITCH_MAX_PERIOD);
   OPUS_MOVE(st->lp_buf, &st->lp_buf[FRAME_SIZE], PITCH_MAX_PERIOD);
   OPUS_COPY(&aligned_in[TRAINING_OFFSET], in, FRAME_SIZE-TRAINING_OFFSET);
+  OPUS_COPY(&x[0], st->pitch_mem, LPC_ORDER);
+  OPUS_COPY(&x[LPC_ORDER], aligned_in, FRAME_SIZE);
+  OPUS_COPY(st->pitch_mem, &aligned_in[FRAME_SIZE-LPC_ORDER], LPC_ORDER);
+  celt_fir(&x[LPC_ORDER], st->lpc, &st->lp_buf[PITCH_MAX_PERIOD], FRAME_SIZE, LPC_ORDER, st->arch);
   for (i=0;i<FRAME_SIZE;i++) {
-    int j;
-    float sum = aligned_in[i];
-    for (j=0;j<LPC_ORDER;j++)
-      sum += st->lpc[j]*st->pitch_mem[j];
-    OPUS_MOVE(st->pitch_mem+1, st->pitch_mem, LPC_ORDER-1);
-    st->pitch_mem[0] = aligned_in[i];
-    st->lp_buf[PITCH_MAX_PERIOD+i] = sum;
-    st->exc_buf[PITCH_MAX_PERIOD+i] = sum + .7f*st->pitch_filt;
-    st->pitch_filt = sum;
+    st->exc_buf[PITCH_MAX_PERIOD+i] = st->lp_buf[PITCH_MAX_PERIOD+i] + .7f*st->pitch_filt;
+    st->pitch_filt = st->lp_buf[PITCH_MAX_PERIOD+i];
     /*printf("%f\n", st->exc_buf[PITCH_MAX_PERIOD+i]);*/
   }
   biquad(&st->lp_buf[PITCH_MAX_PERIOD], st->lp_mem, &st->lp_buf[PITCH_MAX_PERIOD], lp_b, lp_a, FRAME_SIZE);
--