I'm very new to audio programming, so played around with your source to see what happens when I do this and that... I have a few hints, too.
There are a few unnecessary calculations in CenterCut_Run:
double cR, cI;
double A, B, C, D;
cR = lR + rR;
cI = lI + rI;
A = cR*cR + cI*cI;
B = -cR*(lR+rR)-cI*(lI+rI);
C = lR*rR+lI*rI;
D = B*B-4*A*C;
if (D>=0.0 && A>nodivbyzero) {
double alpha = (-B-sqrt(D))/(2*A);
cR*=alpha;
cI*=alpha;
} else
cR = cI = 0.0;
B is the same as -A, so you can replace the code with the following:
double cR, cI;
double A, C, D;
cR = lR + rR;
cI = lI + rI;
A = cR*cR + cI*cI;
C = lR*rR+lI*rI;
D = A*(A-4*C);
if (D>=0.0 && A>nodivbyzero) {
double alpha = (A-sqrt(D))/(2*A);
cR*=alpha;
cI*=alpha;
} else
cR = cI = 0.0;
Also, the bass is often in the middle with the voice, so you might try to set cI=cR=0 for i < (100*halfwindow/samplefreq) to keep the frequencies below 100 hz, or something like that.
I hope that was useful .