changeset 176:50bf5c5bca34 refactors

Add minimum and maximum frequency parameters to FeatureExtractor
author Chris Cannam
date Fri, 13 Feb 2015 15:18:47 +0000
parents e0dc4675059c
children 937951e66c5b
files src/FeatureExtractor.cpp src/FeatureExtractor.h
diffstat 2 files changed, 58 insertions(+), 14 deletions(-) [+]
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;
--- a/src/FeatureExtractor.h	Fri Feb 06 18:47:27 2015 +0000
+++ b/src/FeatureExtractor.h	Fri Feb 13 15:18:47 2015 +0000
@@ -49,7 +49,9 @@
             sampleRate(rate_),
             useChromaFrequencyMap(false),
             fftSize(fftSize_),
-            referenceFrequency(440.0)
+            referenceFrequency(440.0),
+            minFrequency(0.),
+            maxFrequency(rate_/2.)
         {}
 
         /** Sample rate of audio */
@@ -66,6 +68,12 @@
 
         /** Frequency of concert A */
         double referenceFrequency;
+
+        /** Minimum frequency cutoff to include in feature */
+        double minFrequency;
+
+        /** Maximum frequency cutoff to include in feature */
+        double maxFrequency;
     };
 
     /**
@@ -138,7 +146,12 @@
      *  linearly for bins 0-34 (0 to 732Hz), and logarithmically for
      *  the remaining bins (midi notes 79 to 127, bins 35 to 83),
      *  where all energy above note 127 is mapped into the final
-     *  bin. */
+     *  bin.
+     * 
+     *  If a bin's frequency is outside the minFrequency->maxFrequency
+     *  range, it will be mapped to a target bin of -1 and should be
+     *  discarded.
+     */
     std::vector<int> m_freqMap;
 
     /** The size of a returned feature. */