How to calculate time domain SNR using known sequence I am using the following formula to calculate SNR of a real world complex baseband signal sampled at 1x Nyquist.
SNR      = Rxy(tm)^2 / [ Px*Py - Rxy(tm)^2 ]
SNR (dB) = 10*log10(SNR)

where
Rxy(tm) = peak of the cross correlation at time delay, tm 
Px = power in reference signal 
Py = power in received signal

I verified proper implementation of the formula using simulated real-valued and complex-valued signals with and without noise.
On real data the SNR estimates using the above formula are too low (by 10.0+ dB). I manually verified the actual SNR a few different ways. I used spectral analysis to visually measure the signal power to the noise floor. I also measured the signal power to noise power (when signal is off), and both of those techniques give me an answer closer to what I expect.
I am flummoxed as to why this equation is not working on real-world signals. Do I need to take the DC bias (mean of data) into account and add that back to the SNR estimate? If I do that then I get values closer to what I expect.
Reference: Formula came from Principles of Communications (Tranter, Ziemer) textbook
The peak of the cross correlation should be the transmit signal power times the channel's attenuation.
Realizing that, it's really just
\begin{align}
\text{SNR} &amp;= \frac{P_\text{signal}}{P_\text{noise}}\\
&amp;= \frac{P_\text{signal}}{P_\text{received} - P_\text{signal}}\\
&amp;= \frac{P_\text{tx}\cdot a_\text{channel}}{P_\text{received} - P_\text{tx}\cdot a_\text{channel}}\\
&amp;= \frac{P_{crosscorr,max}}{P_\text{received}-P_{crosscorr,max}},
\end{align}
which is
=Rxy(tm)^2 / (Py-Rxy(tm)^2)

in your notation.
So, either that book is wrong or you're missing something there.