Fourier transformation
Using operator== on doubles isn't usually a good idea, although it may be okay in the TestSpike case as you know you've assigned exactly 1.0 to it previously.

I would write GenerateSpike as follows:

void GenerateSpike(Complex* data, int length) {
  std::fill(data, data+length, 0.0);
  if (length &gt;= 2)
    data[1] = 1.0;
}


By the way, you're not checking that the array is of sufficient length in TestSpike.

stepSize in FFT does not depend on the parameters of the second-outermost loop, so it should be in the outermost loop.  You should also use stepSize instead of bflySize/2 in the call to butterfly.

About testing:  w, butterfly, Reverse, and FFT all seem to be pure functions, so you can test them simply by checking the return value.  You might want to get a framework like GTest or Boost.Test to make them easier to write.