changeset 30:00df792783e3

Faster filter implementation (less copying)
author Chris Cannam
date Wed, 30 Sep 2015 13:45:08 +0100
parents 63959419587f
children 9e34c7d5bd1f
files src/Filter.cpp src/Filter.h
diffstat 2 files changed, 31 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/Filter.cpp	Wed Sep 30 13:44:50 2015 +0100
+++ b/src/Filter.cpp	Wed Sep 30 13:45:08 2015 +0100
@@ -24,23 +24,28 @@
     m_b = allocate<double>(m_sz);
     v_copy(m_a, &params.a[0], m_sz);
     v_copy(m_b, &params.b[0], m_sz);
-    m_inbuf = allocate_and_zero<double>(m_sz);
-    m_outbuf = allocate_and_zero<double>(m_order);
+    m_offmax = 20;
+    m_offa = m_offmax;
+    m_offb = m_offmax;
+    m_bufa = allocate_and_zero<double>(m_sz + m_offmax);
+    m_bufb = allocate_and_zero<double>(m_order + m_offmax);
 }
 
 Filter::~Filter()
 {
     deallocate(m_a);
     deallocate(m_b);
-    deallocate(m_inbuf);
-    deallocate(m_outbuf);
+    deallocate(m_bufa);
+    deallocate(m_bufb);
 }
 
 void
 Filter::reset()
 {
-    v_zero(m_inbuf, m_sz);
-    v_zero(m_outbuf, m_order);
+    m_offa = m_offmax;
+    m_offb = m_offmax;
+    v_zero(m_bufa, m_sz + m_offmax);
+    v_zero(m_bufb, m_order + m_offmax);
 }
 
 void
@@ -50,16 +55,25 @@
 {
     for (int s = 0; s < n; ++s) {
 
-	v_move(m_inbuf + 1, m_inbuf, m_order);
-	m_inbuf[0] = in[s];
+        if (m_offa > 0) --m_offa;
+        else {
+            v_move(m_bufa + m_offmax + 1, m_bufa, m_sz - 1);
+            m_offa = m_offmax;
+        }
+        m_bufa[m_offa] = in[s];
 
-	double b_sum = v_multiply_and_sum(m_b, m_inbuf, m_sz);
-	double a_sum = v_multiply_and_sum(m_a + 1, m_outbuf, m_order);
+	double b_sum = v_multiply_and_sum(m_b, m_bufa + m_offa, m_sz);
+	double a_sum = v_multiply_and_sum(m_a + 1, m_bufb + m_offb, m_order);
 
 	double outval = b_sum - a_sum;
 
-	v_move(m_outbuf + 1, m_outbuf, m_order - 1);
-	m_outbuf[0] = outval;
+        if (m_offb > 0) --m_offb;
+        else {
+            v_move(m_bufb + m_offmax + 1, m_bufb, m_order - 1);
+            m_offb = m_offmax;
+        }
+        m_bufb[m_offb] = outval;
+        
 	out[s] = outval;
     }
 }
--- a/src/Filter.h	Wed Sep 30 13:44:50 2015 +0100
+++ b/src/Filter.h	Wed Sep 30 13:45:08 2015 +0100
@@ -34,8 +34,11 @@
     int m_sz;
     double *m_a;
     double *m_b;
-    double *m_inbuf;
-    double *m_outbuf;
+    double *m_bufa;
+    double *m_bufb;
+    int m_offa;
+    int m_offb;
+    int m_offmax;
 
     Filter(const Filter &); // not supplied
     Filter &operator=(const Filter &); // not supplied