Mercurial > hg > match-vamp
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;