comparison src/FeatureExtractor.cpp @ 159:cdbee79699b0 refactors

Introduce reference frequency param to feature extractor
author Chris Cannam
date Thu, 29 Jan 2015 17:02:48 +0000
parents cfba9aec7569
children cf1282d1f940
comparison
equal deleted inserted replaced
157:d6c1556fadd0 159:cdbee79699b0
68 } 68 }
69 69
70 void 70 void
71 FeatureExtractor::makeStandardFrequencyMap() 71 FeatureExtractor::makeStandardFrequencyMap()
72 { 72 {
73 double refFreq = m_params.referenceFrequency;
73 double binWidth = m_params.sampleRate / m_params.fftSize; 74 double binWidth = m_params.sampleRate / m_params.fftSize;
74 int crossoverBin = (int)(2 / (pow(2, 1/12.0) - 1)); 75 int crossoverBin = (int)(2 / (pow(2, 1/12.0) - 1));
75 int crossoverMidi = lrint(log(crossoverBin*binWidth/440.0)/ 76 int crossoverMidi = lrint(log(crossoverBin * binWidth / refFreq)/
76 log(2.0) * 12 + 69); 77 log(2.0) * 12 + 69);
77
78 // freq = 440 * Math.pow(2, (midi-69)/12.0) / binWidth;
79 78
80 int i = 0; 79 int i = 0;
81 while (i <= crossoverBin) { 80 while (i <= crossoverBin) {
82 m_freqMap[i] = i; 81 m_freqMap[i] = i;
83 ++i; 82 ++i;
84 } 83 }
85 84
86 while (i <= m_params.fftSize/2) { 85 while (i <= m_params.fftSize/2) {
87 double midi = log(i*binWidth/440.0) / log(2.0) * 12 + 69; 86 double midi = log(i * binWidth / refFreq) / log(2.0) * 12 + 69;
88 if (midi > 127) midi = 127; 87 if (midi > 127) midi = 127;
89 int target = crossoverBin + lrint(midi) - crossoverMidi; 88 int target = crossoverBin + lrint(midi) - crossoverMidi;
90 if (target >= m_featureSize) target = m_featureSize - 1; 89 if (target >= m_featureSize) target = m_featureSize - 1;
91 m_freqMap[i++] = target; 90 m_freqMap[i++] = target;
92 } 91 }
93 } 92 }
94 93
95 void 94 void
96 FeatureExtractor::makeChromaFrequencyMap() 95 FeatureExtractor::makeChromaFrequencyMap()
97 { 96 {
97 double refFreq = m_params.referenceFrequency;
98 double binWidth = m_params.sampleRate / m_params.fftSize; 98 double binWidth = m_params.sampleRate / m_params.fftSize;
99 int crossoverBin = (int)(1 / (pow(2, 1/12.0) - 1)); 99 int crossoverBin = (int)(1 / (pow(2, 1/12.0) - 1));
100 int i = 0; 100 int i = 0;
101 while (i <= crossoverBin) { 101 while (i <= crossoverBin) {
102 m_freqMap[i++] = 0; 102 m_freqMap[i++] = 0;
103 } 103 }
104 while (i <= m_params.fftSize/2) { 104 while (i <= m_params.fftSize/2) {
105 double midi = log(i*binWidth/440.0) / log(2.0) * 12 + 69; 105 double midi = log(i * binWidth / refFreq) / log(2.0) * 12 + 69;
106 m_freqMap[i++] = (lrint(midi)) % 12 + 1; 106 m_freqMap[i++] = (lrint(midi)) % 12 + 1;
107 } 107 }
108 } 108 }
109 109
110 vector<double> 110 vector<double>