Mercurial > hg > cepstral-pitchtracker
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 |