Mercurial > hg > match-vamp
comparison 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 |
comparison
equal
deleted
inserted
replaced
175:e0dc4675059c | 176:50bf5c5bca34 |
---|---|
80 cerr << "FeatureExtractor::makeStandardFrequencyMap: refFreq = " << refFreq << endl; | 80 cerr << "FeatureExtractor::makeStandardFrequencyMap: refFreq = " << refFreq << endl; |
81 #endif | 81 #endif |
82 | 82 |
83 int i = 0; | 83 int i = 0; |
84 while (i <= crossoverBin) { | 84 while (i <= crossoverBin) { |
85 m_freqMap[i] = i; | 85 double freq = i * binWidth; |
86 ++i; | 86 if (freq < m_params.minFrequency || freq > m_params.maxFrequency) { |
87 m_freqMap[i++] = -1; | |
88 } else { | |
89 m_freqMap[i] = i; | |
90 i++; | |
91 } | |
87 } | 92 } |
88 | 93 |
89 while (i <= m_params.fftSize/2) { | 94 while (i <= m_params.fftSize/2) { |
90 double midi = log(i * binWidth / refFreq) / log(2.0) * 12 + 69; | 95 double freq = i * binWidth; |
91 if (midi > 127) midi = 127; | 96 if (freq < m_params.minFrequency || freq > m_params.maxFrequency) { |
92 int target = crossoverBin + lrint(midi) - crossoverMidi; | 97 m_freqMap[i++] = -1; |
93 if (target >= m_featureSize) target = m_featureSize - 1; | 98 } else { |
94 m_freqMap[i++] = target; | 99 double midi = log(freq / refFreq) / log(2.0) * 12 + 69; |
100 if (midi > 127) midi = 127; | |
101 int target = crossoverBin + lrint(midi) - crossoverMidi; | |
102 if (target >= m_featureSize) target = m_featureSize - 1; | |
103 m_freqMap[i++] = target; | |
104 } | |
95 } | 105 } |
96 | 106 |
97 #ifdef DEBUG_FEATURE_EXTRACTOR | 107 #ifdef DEBUG_FEATURE_EXTRACTOR |
98 cerr << "FeatureExtractor: crossover bin is " << crossoverBin << " for midi " | 108 cerr << "FeatureExtractor: crossover bin is " << crossoverBin << " for midi " |
99 << crossoverMidi << endl; | 109 << crossoverMidi << endl; |
110 cerr << "FeatureExtractor: map is:" << endl; | |
111 for (i = 0; i <= m_params.fftSize/2; ++i) { | |
112 cerr << i << ": " << m_freqMap[i] << ", "; | |
113 } | |
114 cerr << endl; | |
100 #endif | 115 #endif |
101 } | 116 } |
102 | 117 |
103 void | 118 void |
104 FeatureExtractor::makeChromaFrequencyMap() | 119 FeatureExtractor::makeChromaFrequencyMap() |
106 double refFreq = m_params.referenceFrequency; | 121 double refFreq = m_params.referenceFrequency; |
107 double binWidth = m_params.sampleRate / m_params.fftSize; | 122 double binWidth = m_params.sampleRate / m_params.fftSize; |
108 int crossoverBin = (int)(1 / (pow(2, 1/12.0) - 1)); | 123 int crossoverBin = (int)(1 / (pow(2, 1/12.0) - 1)); |
109 int i = 0; | 124 int i = 0; |
110 while (i <= crossoverBin) { | 125 while (i <= crossoverBin) { |
111 m_freqMap[i++] = 0; | 126 double freq = i * binWidth; |
127 if (freq < m_params.minFrequency || freq > m_params.maxFrequency) { | |
128 m_freqMap[i++] = -1; | |
129 } else { | |
130 m_freqMap[i++] = 0; | |
131 } | |
112 } | 132 } |
113 while (i <= m_params.fftSize/2) { | 133 while (i <= m_params.fftSize/2) { |
114 double midi = log(i * binWidth / refFreq) / log(2.0) * 12 + 69; | 134 double freq = i * binWidth; |
115 m_freqMap[i++] = (lrint(midi)) % 12 + 1; | 135 if (freq < m_params.minFrequency || freq > m_params.maxFrequency) { |
136 m_freqMap[i++] = -1; | |
137 } else { | |
138 double midi = log(freq / refFreq) / log(2.0) * 12 + 69; | |
139 m_freqMap[i++] = (lrint(midi)) % 12 + 1; | |
140 } | |
116 } | 141 } |
117 } | 142 } |
118 | 143 |
119 vector<double> | 144 vector<double> |
120 FeatureExtractor::process(const vector<double> &real, const vector<double> &imag) | 145 FeatureExtractor::process(const vector<double> &real, const vector<double> &imag) |
121 { | 146 { |
122 vector<double> frame(m_featureSize, 0.0); | 147 vector<double> frame(m_featureSize, 0.0); |
123 | 148 |
124 for (int i = 0; i <= m_params.fftSize/2; i++) { | 149 for (int i = 0; i <= m_params.fftSize/2; i++) { |
125 double mag = real[i] * real[i] + imag[i] * imag[i]; | 150 double mag = real[i] * real[i] + imag[i] * imag[i]; |
126 frame[m_freqMap[i]] += mag; | 151 int index = m_freqMap[i]; |
152 if (index >= 0) { | |
153 frame[index] += mag; | |
154 } | |
127 } | 155 } |
128 | 156 |
129 return frame; | 157 return frame; |
130 } | 158 } |
131 | 159 |
134 { | 162 { |
135 vector<double> frame(m_featureSize, 0.0); | 163 vector<double> frame(m_featureSize, 0.0); |
136 | 164 |
137 for (int i = 0; i <= m_params.fftSize/2; i++) { | 165 for (int i = 0; i <= m_params.fftSize/2; i++) { |
138 double mag = cframe[i*2] * cframe[i*2] + cframe[i*2+1] * cframe[i*2+1]; | 166 double mag = cframe[i*2] * cframe[i*2] + cframe[i*2+1] * cframe[i*2+1]; |
139 frame[m_freqMap[i]] += mag; | 167 int index = m_freqMap[i]; |
168 if (index >= 0) { | |
169 frame[index] += mag; | |
170 } | |
140 } | 171 } |
141 | 172 |
142 return frame; | 173 return frame; |
143 } | 174 } |
144 | 175 |