Mercurial > hg > tipic
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, ¶ms.a[0], m_sz); v_copy(m_b, ¶ms.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