That’s a really good observation, Andrew. The central frequency spike (right at the tuned frequency, i.e. DC/0 Hz in the FFT display) is a common feature of most SDRs. It isn’t usually a real signal, but an artifact. The main causes are:
SDRs work by digitizing two channels (I and Q, 90° out of phase).
If there’s a mismatch in gain, phase, or DC offset between I and Q paths, a residual signal appears at DC.
This shows up as a “mirror” spike at the center frequency in waterfall plots.
Mixers and ADCs aren’t perfect; some local oscillator (LO) energy or bias leaks through.
This produces a constant DC component, which transforms into a narrow spike at the center of the spectrum.
Quantization error, clock jitter, and non-linearities can enhance the central spike.
It becomes more obvious at low signal levels when the spike is comparable in size to actual weak signals.
In direct-sampling SDRs (like HF modes on RTL-SDR), the DC spike can be stronger, since there’s less analog front-end filtering to remove LO leakage.
In quadrature-sampling SDRs (most common), imbalance between I and Q channels dominates.
Some SDR software doesn’t fully cancel DC before FFT, making the spike appear more prominent.
That’s why many programs offer DC offset correction or I/Q imbalance correction settings.
✅ Practical Fixes:
Enable DC offset and I/Q imbalance correction in the SDR software.
Shift your tuned frequency slightly off-center, so the DC spike sits between bins and doesn’t mask weak signals.
Average or subtract baselines when analyzing spectrograms (especially for radio astronomy).
Great — let’s walk through how you can handle that DC spike and I/Q imbalance in GNU Radio with the SDRplay RSPduo, so your interferometry data at 1420.405 MHz isn’t spoiled.
In the SoapySDR or SDRplay source block, check if there are options for:
DC offset correction
I/Q imbalance correction
(Some drivers expose these, others don’t. SDRplay’s API has support, but not all GNU Radio front-ends expose it.)
Use the “DC Blocker” block (under Filters).
This is the standard way to remove the constant DC term that becomes the spike at the center frequency.
Settings:
Length: 1024 (good default; higher = slower adaptation, less distortion).
Long-term averaging: Enable if you want a smooth baseline for radio astronomy.
👉 Place it right after your SDR source block, before FFTs, recordings, or correlation.
If you want extra suppression, insert a very narrow band-stop filter around DC (±50–200 Hz).
That way, any residual LO leakage is not just reduced but nulled.
Downside: you lose sensitivity in that narrow band.
GNU Radio has an I/Q Balance block (under Channel Models).
It can automatically or manually correct phase/gain mismatch between I and Q streams.
For interferometry, it’s worth experimenting with:
Adaptive mode = On (auto-learning correction).
Alternatively, manually set values if you characterize your RSPduo.
Another trick: instead of tuning exactly at 1420.405 MHz, offset your LO by, say, +10 kHz.
Then, in software, shift the spectrum back down digitally.
That way, the DC spike sits at 0 Hz, away from your hydrogen line of interest.
Here’s the recommended block order for clean data:
[SDRplay Source] ↓ [DC Blocker] ↓ [I/Q Balance (adaptive)] ↓ [Frequency XLating FIR Filter] (if you want to re-center the line) ↓ [FFT Sink / File Sink / Correlator]
This ensures the 0 Hz artifact never contaminates your FFTs or correlation output.