Mercurial > hg > match-vamp
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. */