Fix segmentation logic
This commit is contained in:
@@ -83,19 +83,30 @@ public:
|
|||||||
double f2 = nyquist;
|
double f2 = nyquist;
|
||||||
bool inPercussive = false;
|
bool inPercussive = false;
|
||||||
for (int i = n - 1; i > 0; --i) {
|
for (int i = n - 1; i > 0; --i) {
|
||||||
if (m_numeric[i] == 1) { // percussive
|
int c = m_numeric[i];
|
||||||
if (!inPercussive) {
|
if (!inPercussive) {
|
||||||
|
if (c == 2) { // residual/silent
|
||||||
|
continue;
|
||||||
|
} else if (c == 1) { // percussive
|
||||||
inPercussive = true;
|
inPercussive = true;
|
||||||
f2 = frequencyForBin(i);
|
f2 = frequencyForBin(i);
|
||||||
continue;
|
} else { // harmonic
|
||||||
|
f1 = f2 = frequencyForBin(i);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else if (m_numeric[i] == 0) { // harmonic
|
} else { // inPercussive
|
||||||
if (inPercussive) {
|
if (c != 1) { // non-percussive
|
||||||
f1 = frequencyForBin(i);
|
f1 = frequencyForBin(i);
|
||||||
}
|
break;
|
||||||
break; // always when harmonic reached
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (f1 == nyquist && f2 < nyquist) {
|
||||||
|
f1 = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// std::cout << "f0 = " << f0 << ", f1 = " << f1 << ", f2 = " << f2 << std::endl;
|
||||||
|
|
||||||
return Segmentation(f0, f1, f2);
|
return Segmentation(f0, f1, f2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user