Measuring SDR Noise Figure

Last night Mark and I were working on a 115 kbit/s FSK modem link for balloons that uses SDR receivers and FSK modem software.

We connected the transmitter to the SDR rx via a switched attenuator, calibrated with the spec-an, and measured a Minimum Detectable Signal (MDS) of about -75dBm. Based on an Eb/No of 15dB for 2FSK (to get a BER of 1E-5) I was expecting:

MDS = Eb/No + 10*log10(B) - 174 + NF
MDS = 15 + 10*log10(115E3) - 174 + NF
MDS = -108.4 + NF

So we are way off expected performance at the moment, and are testing the various components one by one.

One number I wanted to know was the Noise Figure (NF) of the SDR. Mark has a bunch of SDRs so we got on a roll and checked out the NF on all of them.

Now there are a lot of people playing with SDRs, but very few tutorials on HowTo engineer radio systems. For example, how to answer questions like “can I send this many bit/s over X km with SDR hardware Y?” So I thought it might be useful to explain how we measured Noise Figure (NF) and present the results for a bunch of SDRs.

From the Wikipedia article on Noise Figure:

The Noise Figure is the difference in decibels (dB) between the noise output of the actual receiver to the noise output of an “ideal” receiver.

An ideal receiver has an output noise power of:

Nout_dB = 10log10(B) - 174 + G_dB

The -174 dBm/Hz figure is the thermal noise density at 25C. For every 1Hz of bandwidth you will get -174dBm of noise power. It’s the lower limit set by the laws of physics. G_dB is the Rx gain. The 10log10(B) term takes into account the bandwidth of the Rx. A wider bandwidth means more total noise power.

So if you have a 1Hz bandwidth, and a gain of 100dB, you would expect Nout_NdB = 0 – 174 + 100 = -74dBm at the Rx output with no signal. If you have a 1000Hz bandwidth receiver you would have NdB_out = 10*log10(1000) – 174 + 100 = 30 – 174 + 100 = -44dBm of noise power at the output.

That’s for an ideal receiver. A real receiver has an output noise power of:

Nout_dB = 10log10(B) - 174 + G_dB + NF_dB

It’s NF_dB worse than an ideal receiver.

To determine Noise Figure we compare the output noise for our receiver (Rx) to an ideal receiver using these steps:

  1. Sample the Rx output first with an input test signal of known power and then with noise only.
  2. Find the Rx gain by comparing the Rx output power to the test signal input power.
  3. Find the noise output power, then using the gain we can find the noise input power.
  4. Normalise the noise input power to 1Hz noise bandwidth (so it’s units are also dBm/Hz) and compare to the thermal noise floor.

Here is the GNU Octave script nf_from_gr.m we used, and here are the results we obtained:

octave:17> nf_from_gr
    HackRF: Pin: -100.0  Pout: 38.1  G: 138.1  NF: 8.9 dB
   RTL-SDR: Pin: -100.0  Pout: 45.8  G: 145.8  NF: 6.7 dB
    AirSpy: Pin: -100.0  Pout: 42.0  G: 142.0  NF: 7.3 dB
FunCube PP: Pin: -100.0  Pout: 31.0  G: 131.0  NF: 3.9 dB

GNU Radio was used to collect a few seconds of samples and save them to a file for processing by Octave. For the test signal I used a calibrated signal generator set to -100dBm. All tests were performed on a chunk of spectrum around 440MHz.

These results are not definitive – there are so many “knobs and sliders” on the SDRs it’s hard to say if we had them adjusted right. More gain in front of the ADC tends to reduce NF. The results seem reasonable though, no huge or negative NFs.

A good way to check our script would be to use a pre-amp with a known NF in front of the SDR, but we haven’t tried that yet.

It’s important to sample a chunk of noise without too many birdies (and SDRs seem full of them!). So the script asks you for a start “st” and end “en” range of frequencies. Here is a sample spectrum of the SDR output with the test signal (top) and just noise (bottom):


At the end of SM2000 Part 1 there is a section on measuring Noise Figure using a spectrum analyser.

SNR and Eb/No Worked Example explains how I work between SNR and Eb/No.

3 thoughts on “Measuring SDR Noise Figure”

  1. Hi David,

    Leif, SM5BSZ has done quite a few measurements on SDRs of various types. His website is a treasure trove of that sort of measurement stuff. All pretty carefully done :).

    I myself have been using two ‘identical’ antennas going to two different receivers of different technologies and looking at real time reception of 20m ham signals.

    But the whole signal to noise business while it looks well defined on paper raises real questions in my mind as to what it means for real signals. If you look at a ‘simple’ FSK signal. If we measure noise as the noise in a rectangular band sufficient to accomodate the FSK signal then things are pretty simple. If we build two receive chains for each tone, then the noise bandwidth is much narrower for each tone. Also, we have at least 3 data flows that represent our signal. Just tone 1, just tone2 and both tones. Did the signal just get easier to decode? If the noise is white perhaps not. Real noise is not white. And then there are single interferring tones, etc.

    So when I look at signal to noise on Leif’s software, i wind up more confused than ever when I am looking at real Olivia 32/1000 signals for example.

    I especially liked your balloon decoder in that is points out how much better we can do with a simple ADC –> computer type of receiver than all those Ls and Cs that used to be necessary. And then there is the whole issue of signal redundancy and forward error correcting and does it really improve things for real signals given a ‘computerized’ receiver.

    Lots of fun :).


    1. Thanks John for those thoughts, and noted on Leif’s work. It is rather tricky to work out the “noise bandwidth” for FSK.

      The best approach I have found is use Eb/No. No is the spectral noise density (power in dBm per Hz) so can be computed as above using a handy chunk of spectrum. Eb is the energy/bit, or total signal Power/bit rate. The BER at a given Eb/No can then be compared to the theoretical BER curves.

      I agree with your thoughts on real world channels – especially at HF. The balloon telemetry channels are unique in that they are real AWGN Line of Sight channels – just like the text books. So we really do get 300km on 10mW at 100 bit/s, as calculated.



  2. If you are interested in measuring noise figure, this is a great resource:

    You can make your own excess noise generator with another SDR. Just transmit AWGN at two different gain settings, about 10 dB apart. Then use a pad to drop the ‘off’ level down to near kTBF so that the added noise in the receiver is measurable. Follow the directions in the Agilent app note on the Y factor method. You should be able to do measure the NF to within 1 dB this way.

Comments are closed.