shithub: opus

Download patch

ref: ddbdbec444b07fc223ecad73e5c2467c2846aec9
parent: 176507e4fcb4c6376af5ec465f23692ce84495fd
author: Jean-Marc Valin <jmvalin@amazon.com>
date: Fri Nov 24 13:02:35 EST 2023

Optimize biquad() to reduce dependency chains

--- a/dnn/lpcnet_enc.c
+++ b/dnn/lpcnet_enc.c
@@ -83,14 +83,25 @@
 
 static void biquad(float *y, float mem[2], const float *x, const float *b, const float *a, int N) {
   int i;
+  float mem0, mem1;
+  mem0 = mem[0];
+  mem1 = mem[1];
   for (i=0;i<N;i++) {
-    float xi, yi;
+    float xi, yi, mem00;
     xi = x[i];
-    yi = x[i] + mem[0];
-    mem[0] = mem[1] + (b[0]*xi - a[0]*yi);
-    mem[1] = (b[1]*xi - a[1]*yi);
+    yi = x[i] + mem0;
+    mem00 = mem0;
+    /* Original code:
+    mem0 = mem1 + (b[0]*xi - a[0]*yi);
+    mem1 = (b[1]*xi - a[1]*yi);
+    Modified to reduce dependency chains:
+    */
+    mem0 = (b[0]-a[0])*xi + mem1 - a[0]*mem0;
+    mem1 = (b[1]-a[1])*xi + 1e-30f - a[1]*mem00;
     y[i] = yi;
   }
+  mem[0] = mem0;
+  mem[1] = mem1;
 }
 
 #define celt_log10(x) (0.3010299957f*celt_log2(x))
--