# 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

• what does "peak of the cross-correlation at time delay, tm" mean? Sounds self-contradictory: either it's the peak, or it's at a fixed delay? Jul 23 '20 at 14:57
• It is a single value at the time instant where the cross correlation is maximized. It is a peak. Jul 23 '20 at 15:00
• OK; let's work with that then :) you your SNR, the product between the reference power and the received power makes no sense – that should simply be received power. Jul 23 '20 at 15:04
• As I said, I didn't make up the formula. You can google the book and preview it on Amazon or Google Scholar to see details of derivation. Jul 23 '20 at 15:06
• @MarcusMüller here is a link to the book. You can preview it and go to page 362: amazon.com/Principles-Communications-Rodger-Ziemer/dp/… Jul 23 '20 at 15:25

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} &= \frac{P_\text{signal}}{P_\text{noise}}\\ &= \frac{P_\text{signal}}{P_\text{received} - P_\text{signal}}\\ &= \frac{P_\text{tx}\cdot a_\text{channel}}{P_\text{received} - P_\text{tx}\cdot a_\text{channel}}\\ &= \frac{P_{crosscorr,max}}{P_\text{received}-P_{crosscorr,max}}, \end{align}

which is

=Rxy(tm)^2 / (Py-Rxy(tm)^2)


• that's part of my $a_\text{channel}$ (the channel goes end-to-end). You might be forgetting to normalize your received signal energy by the length if you get a crosscorrelation higher than the received signal. Jul 23 '20 at 16:58