Thanks to Andreas Hornig who has recently released a new program called "CalibrateSDR" (GitHub code) which is designed to accurately determine the frequency offset of an SDR via an IQ recording of a DAB+ station.

Cheaper RTL-SDR and SDRs use a low quality crystal oscillator which usually has a large offset from the ideal frequency. Furthermore, that frequency offset will change as the dongle warms up or as the ambient temperature changes. The end result is that any signals received will not be at the correct frequency, and they will drift as the temperature changes. Higher end SDRs and improved RTL-SDRs like our RTL-SDR Blog V3 use a temperature compensated oscillator (TCXO) which has a very small frequency offset and very little temperature drift.

CalibrateSDR can be used with almost any SDR to determine the frequency offset. Andreas notes that CalibrateSDR uses the synchronization channel symbols from DAB+ digital audio stations to determine the offset. His post contains a great explanation of how this works. If you don't have DAB+ in your area, an alternative is Kalibrate-RTL which uses GSM cellphone signals to calibrate.

His results were as expected, showing that the generic RTL-SDRs have large frequency offsets, and his RTL-SDR Blog V3 and LimeSDR have much better precision.

The null symbol (lower amplitude portion) and phase reference (Orange) in a DAB+ signal