diff src/FeatureExtractor.cpp @ 178:1440773da492 tuning-rescale

Merge from refactors branch
author Chris Cannam
date Mon, 16 Feb 2015 14:47:43 +0000
parents 001db4c32eb0 50bf5c5bca34
children d1bc89794cd4
line wrap: on
line diff
--- a/src/FeatureExtractor.cpp	Thu Feb 05 16:26:41 2015 +0000
+++ b/src/FeatureExtractor.cpp	Mon Feb 16 14:47:43 2015 +0000
@@ -24,7 +24,7 @@
 
 using namespace std;
 
-#define DEBUG_FEATURE_EXTRACTOR 1
+//#define DEBUG_FEATURE_EXTRACTOR 1
 
 FeatureExtractor::FeatureExtractor(Parameters parameters) :
     m_params(parameters)
@@ -95,21 +95,36 @@
 
     int i = 0;
     while (i <= crossoverBin) {
-        m_freqMap[i] = i;
-        ++i;
+        double freq = i * binWidth;
+        if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
+            m_freqMap[i++] = -1;
+        } else {
+            m_freqMap[i] = i;
+            i++;
+        }
     }
 
     while (i <= m_params.fftSize/2) {
-        double midi = log(i * binWidth / refFreq) / log(2.0) * 12 + 69;
-        if (midi > 127) midi = 127;
-        int target = crossoverBin + lrint(midi) - crossoverMidi;
-        if (target >= m_featureSize) target = m_featureSize - 1;
-        m_freqMap[i++] = target;
+        double freq = i * binWidth;
+        if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
+            m_freqMap[i++] = -1;
+        } else {
+            double midi = log(freq / refFreq) / log(2.0) * 12 + 69;
+            if (midi > 127) midi = 127;
+            int target = crossoverBin + lrint(midi) - crossoverMidi;
+            if (target >= m_featureSize) target = m_featureSize - 1;
+            m_freqMap[i++] = target;
+        }
     }
 
 #ifdef DEBUG_FEATURE_EXTRACTOR
     cerr << "FeatureExtractor: crossover bin is " << crossoverBin << " for midi "
          << crossoverMidi << endl;
+    cerr << "FeatureExtractor: map is:" << endl;
+    for (i = 0; i <= m_params.fftSize/2; ++i) {
+        cerr << i << ": " << m_freqMap[i] << ", ";
+    }
+    cerr << endl;
 #endif
 }
 
@@ -121,11 +136,21 @@
     int crossoverBin = (int)(1 / (pow(2, 1/12.0) - 1));
     int i = 0;
     while (i <= crossoverBin) {
-        m_freqMap[i++] = 0;
+        double freq = i * binWidth;
+        if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
+            m_freqMap[i++] = -1;
+        } else {
+            m_freqMap[i++] = 0;
+        }
     }
     while (i <= m_params.fftSize/2) {
-        double midi = log(i * binWidth / refFreq) / log(2.0) * 12 + 69;
-        m_freqMap[i++] = (lrint(midi)) % 12 + 1;
+        double freq = i * binWidth;
+        if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
+            m_freqMap[i++] = -1;
+        } else {
+            double midi = log(freq / refFreq) / log(2.0) * 12 + 69;
+            m_freqMap[i++] = (lrint(midi)) % 12 + 1;
+        }
     }
 }
 
@@ -165,12 +190,18 @@
         vector<double> scaled = scaleMags(mags);
 
         for (int i = 0; i <= m_params.fftSize/2; i++) {
-            frame[m_freqMap[i]] += scaled[i];
+            int index = m_freqMap[i];
+            if (index >= 0) {
+                frame[index] += scaled[i];
+            }
         }
 
     } else {
         for (int i = 0; i <= m_params.fftSize/2; i++) {
-            frame[m_freqMap[i]] += mags[i];
+            int index = m_freqMap[i];
+            if (index >= 0) {
+                frame[index] += mags[i];
+            }
         }
     }