comparison PeakInterpolator.cpp @ 40:8f56ef28b0b1

Minor fixes
author Chris Cannam
date Fri, 20 Jul 2012 10:46:40 +0100
parents 822cf7b8e070
children 45b4401136f6
comparison
equal deleted inserted replaced
39:822cf7b8e070 40:8f56ef28b0b1
22 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */ 23 */
24 24
25 #include "PeakInterpolator.h" 25 #include "PeakInterpolator.h"
26 26
27 #include <iostream>
28
27 static double cubicInterpolate(const double y[4], double x) 29 static double cubicInterpolate(const double y[4], double x)
28 { 30 {
29 double a0 = y[3] - y[2] - y[0] + y[1]; 31 double a0 = y[3] - y[2] - y[0] + y[1];
30 double a1 = y[0] - y[1] - a0; 32 double a1 = y[0] - y[1] - a0;
31 double a2 = y[2] - y[0]; 33 double a2 = y[2] - y[0];
38 } 40 }
39 41
40 double 42 double
41 PeakInterpolator::findPeakLocation(const double *data, int size, int peakIndex) 43 PeakInterpolator::findPeakLocation(const double *data, int size, int peakIndex)
42 { 44 {
43 if (peakIndex < 2 || peakIndex > size - 3) { 45 std::cerr << "findPeakLocation: size " << size << ", peakIndex " << peakIndex << std::endl;
46
47 if (peakIndex < 1 || peakIndex > size - 2) {
48 std::cerr << "returning " << peakIndex << ", data too short" << std::endl;
44 return peakIndex; 49 return peakIndex;
45 } 50 }
46 51
47 double maxval = 0.0; 52 double maxval = 0.0;
48 double location = peakIndex; 53 double location = peakIndex;
51 double y[4]; 56 double y[4];
52 57
53 y[0] = data[peakIndex-1]; 58 y[0] = data[peakIndex-1];
54 y[1] = data[peakIndex]; 59 y[1] = data[peakIndex];
55 y[2] = data[peakIndex+1]; 60 y[2] = data[peakIndex+1];
56 y[3] = data[peakIndex+2]; 61 if (peakIndex < size - 2) {
62 y[3] = data[peakIndex+2];
63 } else {
64 y[3] = y[2];
65 }
66 std::cerr << "a y: " << y[0] << " " << y[1] << " " << y[2] << " " << y[3] << std::endl;
57 for (int i = 0; i < divisions; ++i) { 67 for (int i = 0; i < divisions; ++i) {
58 double probe = double(i) / double(divisions); 68 double probe = double(i) / double(divisions);
59 double value = cubicInterpolate(y, probe); 69 double value = cubicInterpolate(y, probe);
70 std::cerr << "probe = " << probe << ", value = " << value << " for location " << peakIndex + probe << std::endl;
60 if (value > maxval) { 71 if (value > maxval) {
61 maxval = value; 72 maxval = value;
62 location = peakIndex + probe; 73 location = peakIndex + probe;
63 } 74 }
64 } 75 }
65 76
66 y[3] = y[2]; 77 y[3] = y[2];
67 y[2] = y[1]; 78 y[2] = y[1];
68 y[1] = y[0]; 79 y[1] = y[0];
69 y[0] = data[peakIndex-2]; 80 if (peakIndex > 1) {
81 y[0] = data[peakIndex-2];
82 } else {
83 y[0] = y[1];
84 }
85 std::cerr << "b y: " << y[0] << " " << y[1] << " " << y[2] << " " << y[3] << std::endl;
70 for (int i = 0; i < divisions; ++i) { 86 for (int i = 0; i < divisions; ++i) {
71 double probe = double(i) / double(divisions); 87 double probe = double(i) / double(divisions);
72 double value = cubicInterpolate(y, probe); 88 double value = cubicInterpolate(y, probe);
89 std::cerr << "probe = " << probe << ", value = " << value << " for location " << peakIndex - 1 + probe << std::endl;
73 if (value > maxval) { 90 if (value > maxval) {
74 maxval = value; 91 maxval = value;
75 location = peakIndex - 1 + probe; 92 location = peakIndex - 1 + probe;
76 } 93 }
77 } 94 }
78 95
96 std::cerr << "returning " << location << std::endl;
97
79 return location; 98 return location;
80 } 99 }
81 100