diff src/FeatureExtractor.cpp @ 176:50bf5c5bca34 refactors

Add minimum and maximum frequency parameters to FeatureExtractor
author Chris Cannam
date Fri, 13 Feb 2015 15:18:47 +0000
parents ef3c4b451c57
children 1440773da492
line wrap: on
line diff
--- a/src/FeatureExtractor.cpp	Fri Feb 06 18:47:27 2015 +0000
+++ b/src/FeatureExtractor.cpp	Fri Feb 13 15:18:47 2015 +0000
@@ -82,21 +82,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
 }
 
@@ -108,11 +123,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;
+        }
     }
 }
 
@@ -123,7 +148,10 @@
     
     for (int i = 0; i <= m_params.fftSize/2; i++) {
         double mag = real[i] * real[i] + imag[i] * imag[i];
-        frame[m_freqMap[i]] += mag;
+        int index = m_freqMap[i];
+        if (index >= 0) {
+            frame[index] += mag;
+        }
     }
 
     return frame;
@@ -136,7 +164,10 @@
     
     for (int i = 0; i <= m_params.fftSize/2; i++) {
         double mag = cframe[i*2] * cframe[i*2] + cframe[i*2+1] * cframe[i*2+1];
-        frame[m_freqMap[i]] += mag;
+        int index = m_freqMap[i];
+        if (index >= 0) {
+            frame[index] += mag;
+        }
     }
 
     return frame;