In my project to receive amateur satellites with the rtl-sdr I noticed the
sdr itself has a considerable frequency error as noted in
Going full duplex with amateur satellites, part 5 : first test of the amplifier with RTL-SDR.
Using the PI2NOS output frequency I ended up at an error of 54 ppm so I
entered that in gqrx. But to be really sure there is a program named
kalibrate-rtl available via
GitHub - steve-m/kalibrate-rtl: fork of http://thre.at/kalibrate/ for use with rtl-sdr devices.
I had some trouble finding the right way to use this program so I am sharing
my steps here. First try to guess the error by using a known frequency
such as a local repeater (especially when they mention using GPS to maintain
frequency) or a broadcast FM station.
First step with kalibrate-sdr is to scan for GSM channels which are strong
enough. I noticed in later runs that I really need to add the first guessed
frequency error, otherwise it will not find the GSM channels at all.
koos@kernighan:~/radiowork/kalibrate-rtl/src$ ./kal -s GSM900 -e 54
Found 1 device(s):
0: Generic RTL2832U OEM
Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Exact sample rate is: 270833.002142 Hz
[R82XX] PLL not locked!
kal: Scanning for GSM-900 base stations.
GSM-900:
chan: 8 (936.6MHz + 724Hz) power: 67277.85
chan: 17 (938.4MHz + 606Hz) power: 36428.54
Second step with kalibrate-sdr is to select a GSM channel to use for the
calibration run. I selected channel 8 which looks quite active.
koos@kernighan:~/radiowork/kalibrate-rtl/src$ ./kal -e 54 -c 8
Found 1 device(s):
0: Generic RTL2832U OEM
Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Exact sample rate is: 270833.002142 Hz
[R82XX] PLL not locked!
kal: Calculating clock frequency offset.
Using GSM-900 channel 8 (936.6MHz)
average [min, max] (range, stddev)
+ 169Hz [85, 251] (166, 49.119198)
overruns: 0
not found: 0
average absolute error: 53.820 ppm
And only in that step you get the output with the calculated frequency error.
Update:
Doing this calibration is also a good idea for the stick running the ads-b
receiver. That came out to -30 ppm and using that factor makes dump1090
receive signals from greater distances.