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