It's input agnostic, anything will work just as it would with any other real valued prototype filter. I've implemented polyphase filter banks this on radar systems in practice, where we're operating on complex data, both pulse compressed and uncompressed. Filter banks like these have loads of applications due to the i inherent design and theoretical speed.
Polyphase filter banks typically create a phase shifted "copy" of the original version to achieve better reconstruction. From just scanning the code, it looks like this is what he's doing with his X1 and X2 vectors. You'll notice if you step through the code and check out the spectrum, the sub-bands will have no passband overlap. It's even more obvious if you look at the shifted versions of the filter frequency response. Since the "copy" of the original signal was phase shifted, it will also have non-overlapping segments within itself, but tougher the original and copy combine to fully cover from -pi to pic on a normalized frequency scale.
Typically the processing chain is this: get input, create a copy, phase shift the copy (everything for here on out is done twice, one for the original and one for the phase shifted copy; let's call these upper (original) and lower (copy)), apply prototype polyphase filter to the upper and lower signals, apply a DFT to do the polyphase magic, and now you're all channelized. Synthesis is pretty much just this in reverse.
The part people struggle with is typically the polyphase filters and the use of the upper and lower signals, which seems to be the case for this question . The filter bank itself is not complicated but the math behind the polyphase can be if you don't have a multi-rate signal processing background . The prototype filter is typically designed to make say 32 sub-bands, but since we have are upper and lower signals which each have 32 sub-bands, we really have 64. I'll leave the math behind why polyphase filters work to a textbook since that wasn't in your question.
- See above, has to do with the phase shift. Also go a few lines up and you'll see a negation. Check out those indices. The subtraction you're seeing may not be doing exactly what you think it's doing. Try stepping through the code and checking it out.