diff layer/SpectrogramLayer.cpp @ 1:ab83c415a6cd

* Backed out partially complete changes to make the spectrogram only store results up to the requested max frequency. The speed improvement was minimal at the expense of annoyance when changing frequency limit, and although it did save memory, it wasn't yet reliable and fixing it is not a high enough priority.
author Chris Cannam
date Tue, 10 Jan 2006 17:04:02 +0000
parents 2a4f26e85b4c
children 37b110168acf
line wrap: on
line diff
--- a/layer/SpectrogramLayer.cpp	Tue Jan 10 16:33:16 2006 +0000
+++ b/layer/SpectrogramLayer.cpp	Tue Jan 10 17:04:02 2006 +0000
@@ -42,7 +42,6 @@
     m_frequencyScale(LinearFrequencyScale),
     m_cache(0),
     m_cacheInvalid(true),
-    m_maxCachedFrequency(0),
     m_pixmapCache(0),
     m_pixmapCacheInvalid(true),
     m_fillThread(0),
@@ -463,19 +462,13 @@
     if (m_maxFrequency == mf) return;
 
     m_mutex.lock();
-
-    // don't need to invalidate main cache here...
-
+    // don't need to invalidate main cache here
     m_pixmapCacheInvalid = true;
     
     m_maxFrequency = mf;
     emit layerParametersChanged();
     
     m_mutex.unlock();
-
-    // ... but we do still need to do this, in case m_maxFrequency
-    // now > m_maxCachedFrequency
-    fillCache();
 }
 
 size_t
@@ -731,8 +724,6 @@
 
     for (size_t i = 0; i < m_windowSize / 2; ++i) {
 
-	if (int(i) >= m_cache->height()) break;
-
 	int value = 0;
 
 	if (m_colourScale == PhaseColourScale) {
@@ -741,6 +732,7 @@
 	    value = int((phase * 128 / M_PI) + 128);
 
 	} else {
+
 	    double mag = sqrt(output[i][0] * output[i][0] +
 			      output[i][1] * output[i][1]);
 	    mag /= m_windowSize / 2;
@@ -773,7 +765,7 @@
 	    break;
 	}
 
-	if (column < m_cache->width()) {
+	if (column < m_cache->width() && (int)i < m_cache->height()) {
 	    m_cache->setPixel(column, i, value + 1); // 0 is "unset"
 	}
     }
@@ -795,9 +787,7 @@
 
 //	std::cerr << "SpectrogramLayer::CacheFillThread::run in loop" << std::endl;
 
-	if (m_layer.m_model &&
-	    (m_layer.m_cacheInvalid ||
-	     m_layer.m_maxFrequency > m_layer.m_maxCachedFrequency)) {
+	if (m_layer.m_model && m_layer.m_cacheInvalid) {
 
 //	    std::cerr << "SpectrogramLayer::CacheFillThread::run: something to do" << std::endl;
 
@@ -805,11 +795,6 @@
 		m_layer.m_condition.wait(&m_layer.m_mutex, 100);
 	    }
 
-	    size_t minFreq = 0;
-	    if (!m_layer.m_cacheInvalid) {
-		minFreq = m_layer.m_maxCachedFrequency;
-	    }
-
 	    m_layer.m_cachedInitialVisibleArea = false;
 	    m_layer.m_cacheInvalid = false;
 	    m_fillExtent = 0;
@@ -837,15 +822,9 @@
 	    }
 
 	    delete m_layer.m_cache;
-	    size_t bins = windowSize / 2;
-	    if (m_layer.m_maxFrequency > 0) {
-		int sr = m_layer.m_model->getSampleRate();
-		bins = int((double(m_layer.m_maxFrequency) * windowSize) / sr + 0.1);
-		if (bins > windowSize / 2) bins = windowSize / 2;
-	    }
 	    m_layer.m_cache = new QImage((end - start) / windowIncrement + 1,
-					 bins, //!!!
-					 QImage::Format_Indexed8);
+					windowSize / 2,
+					QImage::Format_Indexed8);
     
 	    m_layer.setCacheColourmap();
     
@@ -859,12 +838,12 @@
 		fftw_malloc(windowSize * sizeof(fftw_complex));
 
 	    fftw_plan plan = fftw_plan_dft_r2c_1d(windowSize, input,
-						  output, FFTW_MEASURE);
+						  output, FFTW_ESTIMATE);
 
 	    Window<double> windower(m_layer.m_windowType, m_layer.m_windowSize);
 
 	    if (!plan) {
-		std::cerr << "WARNING: fftw_plan(" << windowSize << ") failed!" << std::endl;
+		std::cerr << "WARNING: fftw_plan_dft_r2c_1d(" << windowSize << ") failed!" << std::endl;
 		fftw_free(input);
 		fftw_free(output);
 		m_layer.m_mutex.lock();