[Top][All Lists]

Re: [Discuss-gnuradio] m2m4 SNR estimator off by 3 dB

 From: Tom Rondeau Subject: Re: [Discuss-gnuradio] m2m4 SNR estimator off by 3 dB Date: Thu, 28 Aug 2014 15:09:42 -0700

On Thu, Aug 28, 2014 at 10:46 AM, Jared Dulmage wrote:
Tom,

I just have a BPSK sim: random source -> map +/-1 -> char2float -> complex -> add <- noise source

I mag^2 probe the inputs to the adder and SNR probe the output.  Everything is complex.  The mag^2 blocks give me exactly what I expect from the char2float scale and the noise source variance.  The SNR probe is off by 3 dB for any set of input powers.  For example, if I set the noise power to 0 dB and the signal to 6 dB I get 9 dB SNR.   3 dB noise, 10 dB signal I get 10 dB SNR.  This seems consistent with the extra 2 x factor in the code.  Here's the _expression_ from Pauluzzi/Beaulieu

p = sqrt(2 * M2^2 - M4) / (M2 - sqrt(2 * M2^2 - M4))

M2 = 2nd moment of input
M4 = 4th moment of input
p = Es/No estimate for complex signals

Not sure how I'm getting it wrong, if I am.  I have gnuradio v3.7.4.  Perhaps this was corrected in a more recent version?  Could you share your flowgraph so I could compare with mine?

Thanks,
Jared.

Ah, I've found the mistake in my tests. I was averaging the signals at the wrong place. Threw together the flowgraph too quickly this morning. (There's actually a funny story here, but I don't want to embarrass the person; so I'll take on the embarrassment myself for not double checking things myself.)

This identified that I was making similar mistakes with the other estimators -- I would have forced them all to the same results and must have based it on a bogus starting target. I'll check in corrections soon, tomorrow hopefully. The skewness estimator is giving me trouble for non-binary psk signals, though.

Tom

From: Tom Rondeau
Date: 08/28/2014 08:52AM
Subject: Re: [Discuss-gnuradio] m2m4 SNR estimator off by 3 dB

On Thu, Aug 28, 2014 at 7:04 AM, Tom Rondeau wrote:
On Wed, Aug 27, 2014 at 9:33 AM, Jared Dulmage wrote:
It appears that the MPSK m2m4 SNR estimator has an extra factor of 2.

double
mpsk_snr_est_m2m4::snr()
{
double y1_2 = d_y1*d_y1;
return 10.0*log10(2.0*sqrt(2*y1_2 - d_y2) /
(d_y1 - sqrt(2*y1_2 - d_y2)));
}

where d_y1 and d_y2 are the running 2nd and 4th moments of the input, respectively.

The 2.0* is not present in the estimate _expression_ from the reference (Pauluzzi and Beaulieu eq. 39).

The 3 dB offset can also be seen by generating a signal (say random BPSK) with AWGN, measuring the signal and noise powers separately while estimating the SNR via the m2m4 on the sum.

It's an easy fix, I just wanted to get verification and notify other users.

Thanks,
Jared.

Hi Jared,

I'd have to review the paper again, but I suspect you're right. I was using this estimator just the other day and scratching my head about the results. I was on a plane, though, and was really focused on something else.

Thanks!

Tom

Just tested this and it looks fine the way it is. Are you doing real or complex signals? The estimators are designed to work with complex numbers, so that might be the difference you're seeing. I just have a simple simulation that I can switch between BPSK and QPSK (both complex signals, though). I use the MPSK measurement block and calculate the power of the signal and noise separately and output that to a number sink. With the current method, I see the same SNRs on both paths.

There is also the gr-digital/examples/snr_estimators.py example you can explore to compare them.

Tom