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