STFT Window Size is 2048, Why is the output 1025? I feel like I am having a brainfart over here and can't seem to remember what's going on with STFT outputs.

Consider these two lines of code from the Python library Librosa:

# Window the time series.
y_frames = util.frame(y, frame_length=n_fft, hop_length=hop_length)

# Pre-allocate the STFT matrix
stft_matrix = np.empty((int(1 + n_fft // 2), y_frames.shape[1]),
                       dtype=dtype,
                       order='F')


In the first line, we have a function that creates a matrix with a window length of n_fft (2048).

Then in the next line, we pre-allocate our STFT, but our window length is now 1025 instead of 1024 as dictated by the 1+n_fft // 2?  Where does this extra frequency bin come from?  Why is not just 1024?
The continuous Fourier transform possesses symmetries  when computed on real signals (Hermitian symmetry). The discrete version, an FFT (of even length) possesses a slighty twisted symmetry. 

The DC coefficient ($F(0)$) is real, as well as the Nyquist one ($F(N/2)$). In between, you get $\frac{2048-2}{2}=1023$ "complex" coefficients, "duplicated" in positive and negative frequencies. 

So for real signal, each STFT frame can be represented by $1023+2$ frequency bins, the remaining   1023 being recovered by Hermitian symmetry.

You can get complementary information at FFT of Pure Real Sequences:


  As a result, we can see that if N is even, both $F(0)$ and $F(N/2)$ must
  be real. Given these two values and the complex values $F(1)...F(N/2-1)$,
  (I.E. N numbers in total) the sequence is completely characterised.