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