diff audioio/IntegerTimeStretcher.cpp @ 13:00ed645f4175

* various fixes in the time stretcher
author Chris Cannam
date Tue, 12 Sep 2006 19:13:12 +0000
parents ee967635c728
children
line wrap: on
line diff
--- a/audioio/IntegerTimeStretcher.cpp	Tue Sep 12 16:43:00 2006 +0000
+++ b/audioio/IntegerTimeStretcher.cpp	Tue Sep 12 19:13:12 2006 +0000
@@ -38,6 +38,7 @@
     m_freq = (fftwf_complex *)fftwf_malloc(sizeof(fftwf_complex) * m_wlen);
     m_dbuf = (float *)fftwf_malloc(sizeof(float) * m_wlen);
     m_mashbuf = (float *)fftwf_malloc(sizeof(float) * m_wlen);
+    m_modulationbuf = (float *)fftwf_malloc(sizeof(float) * m_wlen);
     m_prevPhase = (float *)fftwf_malloc(sizeof(float) * m_wlen);
     m_prevAdjustedPhase = (float *)fftwf_malloc(sizeof(float) * m_wlen);
 
@@ -46,6 +47,7 @@
 
     for (int i = 0; i < m_wlen; ++i) {
 	m_mashbuf[i] = 0.0;
+	m_modulationbuf[i] = 0.0;
         m_prevPhase[i] = 0.0;
         m_prevAdjustedPhase[i] = 0.0;
     }
@@ -62,6 +64,7 @@
     fftwf_free(m_freq);
     fftwf_free(m_dbuf);
     fftwf_free(m_mashbuf);
+    fftwf_free(m_modulationbuf);
     fftwf_free(m_prevPhase);
     fftwf_free(m_prevAdjustedPhase);
 
@@ -125,19 +128,29 @@
 	    size_t got = m_inbuf.peek(m_dbuf, m_wlen);
 	    assert(got == m_wlen);
 		
-	    processBlock(m_dbuf, m_mashbuf);
+	    processBlock(m_dbuf, m_mashbuf, m_modulationbuf);
 
 #ifdef DEBUG_INTEGER_TIME_STRETCHER
 	    std::cerr << "writing first " << m_n2 << " from mashbuf, skipping " << m_n1 << " on inbuf " << std::endl;
 #endif
 	    m_inbuf.skip(m_n1);
+
+            for (size_t i = 0; i < m_n2; ++i) {
+                if (m_modulationbuf[i] > 0.f) {
+                    m_mashbuf[i] /= m_modulationbuf[i];
+                }
+            }
+
 	    m_outbuf.write(m_mashbuf, m_n2);
 
 	    for (size_t i = 0; i < m_wlen - m_n2; ++i) {
 		m_mashbuf[i] = m_mashbuf[i + m_n2];
+                m_modulationbuf[i] = m_modulationbuf[i + m_n2];
 	    }
+
 	    for (size_t i = m_wlen - m_n2; i < m_wlen; ++i) {
 		m_mashbuf[i] = 0.0f;
+                m_modulationbuf[i] = 0.0f;
 	    }
 	}
 
@@ -171,7 +184,7 @@
 }
 
 void
-IntegerTimeStretcher::processBlock(float *buf, float *out)
+IntegerTimeStretcher::processBlock(float *buf, float *out, float *modulation)
 {
     size_t i;
 
@@ -232,14 +245,15 @@
     }
     
     m_window->cut(buf);
-    
+/*    
     int div = m_wlen / m_n2;
     if (div > 1) div /= 2;
     for (i = 0; i < m_wlen; ++i) {
 	buf[i] /= div;
     }
-
+*/
     for (i = 0; i < m_wlen; ++i) {
 	out[i] += buf[i];
+        modulation[i] += m_window->getValue(i);
     }
 }