comparison dsp/tempotracking/DownBeat.cpp @ 58:d72fcd34d9a7

* Fixes to problems shown up by vamp-plugin-tester. Still not all plugins pass all tests, though
author cannam
date Mon, 23 Mar 2009 16:28:53 +0000
parents d241e7701c0c
children 6cb2b3cd5356
comparison
equal deleted inserted replaced
57:d241e7701c0c 58:d72fcd34d9a7
26 m_factor(decimationFactor), 26 m_factor(decimationFactor),
27 m_increment(dfIncrement), 27 m_increment(dfIncrement),
28 m_decimator1(0), 28 m_decimator1(0),
29 m_decimator2(0), 29 m_decimator2(0),
30 m_buffer(0), 30 m_buffer(0),
31 m_decbuf(0),
31 m_bufsiz(0), 32 m_bufsiz(0),
32 m_buffill(0), 33 m_buffill(0),
33 m_beatframesize(0), 34 m_beatframesize(0),
34 m_beatframe(0) 35 m_beatframe(0)
35 { 36 {
62 } 63 }
63 64
64 void 65 void
65 DownBeat::makeDecimators() 66 DownBeat::makeDecimators()
66 { 67 {
68 // std::cerr << "m_factor = " << m_factor << std::endl;
67 if (m_factor < 2) return; 69 if (m_factor < 2) return;
68 int highest = Decimator::getHighestSupportedFactor(); 70 int highest = Decimator::getHighestSupportedFactor();
69 if (m_factor <= highest) { 71 if (m_factor <= highest) {
70 m_decimator1 = new Decimator(m_increment, m_factor); 72 m_decimator1 = new Decimator(m_increment, m_factor);
71 // std::cerr << "DownBeat: decimator 1 factor " << m_factor << ", size " << m_increment << std::endl; 73 // std::cerr << "DownBeat: decimator 1 factor " << m_factor << ", size " << m_increment << std::endl;
89 } else { 91 } else {
90 // std::cerr << "DownBeat::pushAudioBlock: realloc m_buffer to " << m_bufsiz << std::endl; 92 // std::cerr << "DownBeat::pushAudioBlock: realloc m_buffer to " << m_bufsiz << std::endl;
91 m_buffer = (float *)realloc(m_buffer, m_bufsiz * sizeof(float)); 93 m_buffer = (float *)realloc(m_buffer, m_bufsiz * sizeof(float));
92 } 94 }
93 } 95 }
94 if (!m_decimator1) makeDecimators(); 96 if (!m_decimator1 && m_factor > 1) makeDecimators();
95 float rmsin = 0, rmsout = 0; 97 // float rmsin = 0, rmsout = 0;
96 for (int i = 0; i < m_increment; ++i) { 98 // for (int i = 0; i < m_increment; ++i) {
97 rmsin += audio[i] * audio[i]; 99 // rmsin += audio[i] * audio[i];
98 } 100 // }
99 if (m_decimator2) { 101 if (m_decimator2) {
100 m_decimator1->process(audio, m_decbuf); 102 m_decimator1->process(audio, m_decbuf);
101 m_decimator2->process(m_decbuf, m_buffer + m_buffill); 103 m_decimator2->process(m_decbuf, m_buffer + m_buffill);
104 } else if (m_decimator1) {
105 m_decimator1->process(audio, m_buffer + m_buffill);
102 } else { 106 } else {
103 m_decimator1->process(audio, m_buffer + m_buffill); 107 // just copy across (m_factor is presumably 1)
104 } 108 for (int i = 0; i < m_increment; ++i) {
105 for (int i = 0; i < m_increment / m_factor; ++i) { 109 (m_buffer + m_buffill)[i] = audio[i];
106 rmsout += m_buffer[m_buffill + i] * m_buffer[m_buffill + i]; 110 }
107 } 111 }
112 // for (int i = 0; i < m_increment / m_factor; ++i) {
113 // rmsout += m_buffer[m_buffill + i] * m_buffer[m_buffill + i];
114 // }
108 // std::cerr << "pushAudioBlock: rms in " << sqrt(rmsin) << ", out " << sqrt(rmsout) << std::endl; 115 // std::cerr << "pushAudioBlock: rms in " << sqrt(rmsin) << ", out " << sqrt(rmsout) << std::endl;
109 m_buffill += m_increment / m_factor; 116 m_buffill += m_increment / m_factor;
110 } 117 }
111 118
112 const float * 119 const float *
118 125
119 void 126 void
120 DownBeat::resetAudioBuffer() 127 DownBeat::resetAudioBuffer()
121 { 128 {
122 if (m_buffer) free(m_buffer); 129 if (m_buffer) free(m_buffer);
130 m_buffer = 0;
123 m_buffill = 0; 131 m_buffill = 0;
124 m_bufsiz = 0; 132 m_bufsiz = 0;
125 } 133 }
126 134
127 void 135 void
159 // Also apply a Hanning window to the beat frame buffer, sized 167 // Also apply a Hanning window to the beat frame buffer, sized
160 // to the beat extents rather than the frame size. (Because 168 // to the beat extents rather than the frame size. (Because
161 // the size varies, it's easier to do this by hand than use 169 // the size varies, it's easier to do this by hand than use
162 // our Window abstraction.) 170 // our Window abstraction.)
163 171
164 float rms = 0; 172 // std::cerr << "beatlen = " << beatlen << std::endl;
165 for (size_t j = 0; j < beatlen; ++j) { 173
174 // float rms = 0;
175 for (size_t j = 0; j < beatlen && j < m_beatframesize; ++j) {
166 double mul = 0.5 * (1.0 - cos(TWO_PI * (double(j) / double(beatlen)))); 176 double mul = 0.5 * (1.0 - cos(TWO_PI * (double(j) / double(beatlen))));
167 m_beatframe[j] = audio[beatstart + j] * mul; 177 m_beatframe[j] = audio[beatstart + j] * mul;
168 rms += m_beatframe[j] * m_beatframe[j]; 178 // rms += m_beatframe[j] * m_beatframe[j];
169 } 179 }
170 rms = sqrt(rms); 180 // rms = sqrt(rms);
171 // std::cerr << "beat " << i << ": audio rms " << rms << std::endl; 181 // std::cerr << "beat " << i << ": audio rms " << rms << std::endl;
172 182
173 for (size_t j = beatlen; j < m_beatframesize; ++j) { 183 for (size_t j = beatlen; j < m_beatframesize; ++j) {
174 m_beatframe[j] = 0.0; 184 m_beatframe[j] = 0.0;
175 } 185 }