Зачем
buffer[i] *= 1;
?
Есть ошибка с тем, что у вас код работает только с длиной равной степеням двойки, но нигде этого не проверяется. Обычно, чтобы не возиться с частыми случаями, расширяют буфер до степени двойки.
Если же делать с нечетными n, то эти стандартные формулы не работают.
Еще возможно по коду разбросаны всякие off by one error и перепутанные знаки (почему в w() аргумент у синуса/косинуса берется со знаком минус?)
Еще недочет - вы 2 раза вызываете w(), когда как можно было бы и запомнить результат первого вызова.
И еще, обычно рекурсию разворачивают в циклы. В английской вики приведен
псевдокод.