comparison 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
comparison
equal deleted inserted replaced
169:001db4c32eb0 178:1440773da492
22 #include <cassert> 22 #include <cassert>
23 #include <cmath> 23 #include <cmath>
24 24
25 using namespace std; 25 using namespace std;
26 26
27 #define DEBUG_FEATURE_EXTRACTOR 1 27 //#define DEBUG_FEATURE_EXTRACTOR 1
28 28
29 FeatureExtractor::FeatureExtractor(Parameters parameters) : 29 FeatureExtractor::FeatureExtractor(Parameters parameters) :
30 m_params(parameters) 30 m_params(parameters)
31 { 31 {
32 m_featureSize = getFeatureSizeFor(parameters); 32 m_featureSize = getFeatureSizeFor(parameters);
93 int crossoverMidi = lrint(log(crossoverBin * binWidth / refFreq)/ 93 int crossoverMidi = lrint(log(crossoverBin * binWidth / refFreq)/
94 log(2.0) * 12 + 69); 94 log(2.0) * 12 + 69);
95 95
96 int i = 0; 96 int i = 0;
97 while (i <= crossoverBin) { 97 while (i <= crossoverBin) {
98 m_freqMap[i] = i; 98 double freq = i * binWidth;
99 ++i; 99 if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
100 m_freqMap[i++] = -1;
101 } else {
102 m_freqMap[i] = i;
103 i++;
104 }
100 } 105 }
101 106
102 while (i <= m_params.fftSize/2) { 107 while (i <= m_params.fftSize/2) {
103 double midi = log(i * binWidth / refFreq) / log(2.0) * 12 + 69; 108 double freq = i * binWidth;
104 if (midi > 127) midi = 127; 109 if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
105 int target = crossoverBin + lrint(midi) - crossoverMidi; 110 m_freqMap[i++] = -1;
106 if (target >= m_featureSize) target = m_featureSize - 1; 111 } else {
107 m_freqMap[i++] = target; 112 double midi = log(freq / refFreq) / log(2.0) * 12 + 69;
113 if (midi > 127) midi = 127;
114 int target = crossoverBin + lrint(midi) - crossoverMidi;
115 if (target >= m_featureSize) target = m_featureSize - 1;
116 m_freqMap[i++] = target;
117 }
108 } 118 }
109 119
110 #ifdef DEBUG_FEATURE_EXTRACTOR 120 #ifdef DEBUG_FEATURE_EXTRACTOR
111 cerr << "FeatureExtractor: crossover bin is " << crossoverBin << " for midi " 121 cerr << "FeatureExtractor: crossover bin is " << crossoverBin << " for midi "
112 << crossoverMidi << endl; 122 << crossoverMidi << endl;
123 cerr << "FeatureExtractor: map is:" << endl;
124 for (i = 0; i <= m_params.fftSize/2; ++i) {
125 cerr << i << ": " << m_freqMap[i] << ", ";
126 }
127 cerr << endl;
113 #endif 128 #endif
114 } 129 }
115 130
116 void 131 void
117 FeatureExtractor::makeChromaFrequencyMap() 132 FeatureExtractor::makeChromaFrequencyMap()
119 double refFreq = m_params.referenceFrequency; 134 double refFreq = m_params.referenceFrequency;
120 double binWidth = m_params.sampleRate / m_params.fftSize; 135 double binWidth = m_params.sampleRate / m_params.fftSize;
121 int crossoverBin = (int)(1 / (pow(2, 1/12.0) - 1)); 136 int crossoverBin = (int)(1 / (pow(2, 1/12.0) - 1));
122 int i = 0; 137 int i = 0;
123 while (i <= crossoverBin) { 138 while (i <= crossoverBin) {
124 m_freqMap[i++] = 0; 139 double freq = i * binWidth;
140 if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
141 m_freqMap[i++] = -1;
142 } else {
143 m_freqMap[i++] = 0;
144 }
125 } 145 }
126 while (i <= m_params.fftSize/2) { 146 while (i <= m_params.fftSize/2) {
127 double midi = log(i * binWidth / refFreq) / log(2.0) * 12 + 69; 147 double freq = i * binWidth;
128 m_freqMap[i++] = (lrint(midi)) % 12 + 1; 148 if (freq < m_params.minFrequency || freq > m_params.maxFrequency) {
149 m_freqMap[i++] = -1;
150 } else {
151 double midi = log(freq / refFreq) / log(2.0) * 12 + 69;
152 m_freqMap[i++] = (lrint(midi)) % 12 + 1;
153 }
129 } 154 }
130 } 155 }
131 156
132 vector<double> 157 vector<double>
133 FeatureExtractor::process(const vector<double> &real, const vector<double> &imag) 158 FeatureExtractor::process(const vector<double> &real, const vector<double> &imag)
163 188
164 // See comment in makeStandardFrequencyMap above 189 // See comment in makeStandardFrequencyMap above
165 vector<double> scaled = scaleMags(mags); 190 vector<double> scaled = scaleMags(mags);
166 191
167 for (int i = 0; i <= m_params.fftSize/2; i++) { 192 for (int i = 0; i <= m_params.fftSize/2; i++) {
168 frame[m_freqMap[i]] += scaled[i]; 193 int index = m_freqMap[i];
194 if (index >= 0) {
195 frame[index] += scaled[i];
196 }
169 } 197 }
170 198
171 } else { 199 } else {
172 for (int i = 0; i <= m_params.fftSize/2; i++) { 200 for (int i = 0; i <= m_params.fftSize/2; i++) {
173 frame[m_freqMap[i]] += mags[i]; 201 int index = m_freqMap[i];
202 if (index >= 0) {
203 frame[index] += mags[i];
204 }
174 } 205 }
175 } 206 }
176 207
177 return frame; 208 return frame;
178 } 209 }