It seems you're calculating the spectrum by averaging 10 windows (non-overlapping?) to get the magnitude squared at 8192 or 8193 frequencies (from 0 to Nyquist, but some algorithms might drop the Nyquist frequency at bin 8192).
The first thing to check is that the peak is in the right bin. You didn't say what the sampling rate is, but bin 743 would be 743/16384 times the sampling rate. If the signal really is at 800 Hz, that puts Fs at approximately 17640 samples/second. That seems wrong. Your test signal would probably be at a standard rate such as 8000, 16000, 22050, 32000, 44100, or 48000. For Fs = 22050, the peak would be sharply in bin 800/22050*16384 = 594.
Another criteria to check is that the total energy in the signal is approximately the same in both the time and frequency domains. Here's an example in Python:
In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050 In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n) In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384) # PSD by Welch's Method In [4]: sum(x**2)/Fs # time-domain energy Out[4]: 0.24149869319296949 In [5]: sum(y) * N/16384 # frequency-domain energy Out[5]: 0.24148752834391252
The input signal x, which consists of two sinusoids sampled at Fs = 22050 samples/second, is segmented into 10 non-overlapping windows of size NFFT = 2048 samples. The call to psd (power spectral density) computes the spectrum y as the average of the magnitude squared of ten 16384-point DFTs (actually it's 8193 points since x is real-valued).
The computed frequency-domain energy has a scaling factor of N/16384 because the psd function scaled y to the DFT size instead of to the total signal length. Whether or not this is an issue depends on how your system handles normalizing the PSD. Another optional normalization is scaling by 1/Fs. This matches the energy to the original analog signal. The default normalizations should be well documented in the library.