Dual RX with SoapySDR on different frequencies

Hi all,

I’ve already seen several posts for dual RX but nothing to receive at different frequencies using SoapySDR. My idea is to get a bigger bandwidth, eg 2x50MHz to see the whole 2.4GHz band.

First I tried at the same frequency with 60MS/s and it works. I would expect the 2 channels to receive signals at the same power (they each have their own antenna but very close to each other), but it seems channel 1 is always receiving at a lower power level when there’s no significant signal. Here’s an FFT of the 2 channels, 10dB per line vertically:

When my WiFi router sends some signals, I can clearly see them, but there’s again some difference between the 2 channels. This time channel 1 shows a higher power than channel 0. Also it seems the rest of the spectrum gets more flat on channel 1.

Is there any calibration to do so that the 2 channels show similar results?

I then tried listening on 2 different frequencies. The Soapy API for setFrequency says to use args to augment the tuning algorithm, like "OFFSET" to specify an "RF" tuning offset, but the args parameter is not used in both methods.

I then saw that the 2nd setFrequency method allows to specify the name, either “RF” or “BB”. Using “BB” calls SetNCOFreq.

So what I ended up doing is something like

setFrequency(RX, 0, "RF", freq, null);
setFrequency(RX, 0, "BB", +15 000 000, null);
setFrequency(RX, 1, "RF", freq, null);
setFrequency(RX, 1, "BB", -15 000 000, null);

Is that the right way to do it? It seems to be working, but then I read, using SoapySDRUtil

    BB freq range: [-10, 10] MHz
  Tune args:
     * LO Offset - Tune the LO with an offset and compensate with the baseband CORDIC.
       [key=OFFSET, units=Hz, default=0.0, type=float, range=[-1e+07, 1e+07]]
     * BB - Specify a specific value for this component or IGNORE to skip tuning it.
       [key=BB, units=Hz, default=DEFAULT, type=float, range=[-1e+07, 1e+07], options=(DEFAULT, IGNORE)]
  Sample rates: [0.1, 65] MSps
  Filter bandwidths: [1.4, 130] MHz

So it seems “BB” is limited to +/-10MHz?

What about the LO offset? It seems we can’t use it with the setFrequency methods.

Also, are the 2 channels synchronized, meaning they start receiving at the same time? It appears so as Soapy gives me 1 stream to read from the 2 channels, and my WiFi signal appears and disappears at the same time on both channels. I haven’t tried over more than a few seconds though.

I did other tests with the 2 channels listening on the exact same frequency. I forgot to explicitly set the bandwidth in my previous code. Now the results are a lot closer, but there’s still some differences especially on the outer parts.

I roughly do

setGainElement({ LNA, 30 })

Is there something else to do?

If someone knows about my previous questions on the API to listen on different frequencies…Maybe @andrewback or @IgnasJ?

BB is limited by ADC/DAC sample rate. I think SoapySDR sets ADC/DAC to 20 MHz at startup, so it reports +/-10 MHz for “BB” range. After setting sample rate, it should return different value.

Thanks Ignas, indeed it looks like I can set “BB” to +/-30MHz, but I wanted to be sure.

I have a question on the bandwidth when receiving on the 2 channels on different frequencies. If I sample at 60MS/s, listen at 2450MHz and shift the 2 channels by -21MHz and +21MHz, what bandwidth should I set for each channels through SoapySDR? 60MHz? 100MHz? 120MHz? Other?

Here’s roughly what I’m doing:

setSampleRate(RX, 0, 60e6);
setSampleRate(RX, 1, 60e6);
setFrequency(RX, 0, "RF", 2450e6, null);
setFrequency(RX, 1, "RF", 2450e6, null);
setFrequency(RX, 0, "BB", -21e6, null);
setFrequency(RX, 1, "BB", +21e6, null);
setBandwidth(RX, 0, ?);
setBandwidth(RX, 1, ?);

As I can set the bandwidth for each channel separately, I first tried 60MHz per channel, but it doesn’t look good:

  1. For some reasons I get a big spike at first at 2420MHz. The spectrum also looks “wavy”, as if the bandwidth is incorrect.

  2. Soon after starting the spike at 2420MHz disappears, but the spectrum still looks “wavy”.

  3. Here again with my WiFi at 2462MHz. I’m seeing its mirror too at the far left.

I then tried to put 100MHz bandwidth for each channel, thinking that’s the entire band I’m looking at, but the result is weirder:

I then tried to put 120MHz for each channel, and I guess it’s fine like that:

  1. I have the usual spike at the beginning at 2420MHz but the spectrum doesn’t look “wavy”.

  2. The spike disappears soon after, and the spectrum is quite flat.

  3. Here it is with my WiFi at 2462MHz, still with the mirror on the left.

So @IgnasJ what bandwidth am I suppose to set through SoapySDR?

Also is the lime settings things up at first while in dual channel, as I get a spike at 2420MHz at the beginning, but it disappears fast maybe after a few milliseconds.

I tested again and was able to simplify things in SoapySDR. Instead of specifying the frequency for “RF” and “BB” (so I guess the LO and NCO internally), I can simply specify the frequency for both channels like so:

setFrequency(RX, 0, 2429e6, NULL);
setFrequency(RX, 1, 2471e6, NULL);

I end up with similar results as with my previous test:

setFrequency(RX, 0, "RF", 2450e6, null);
setFrequency(RX, 1, "RF", 2450e6, null);
setFrequency(RX, 0, "BB", -21e6, null);
setFrequency(RX, 1, "BB", +21e6, null);

so I guess the underlying code takes care of setting things properly so that both channels can listen at different frequencies, as long as they are not too far apart.

I’m not sure why but I’m not seeing the wavy spectrum even with 60MHz bandwidth per channel.

I still see some weird spike at 2420, 2450 and 2480MHz though, that disappear after a 3 to 5 milliseconds:

  • 3 big visible spikes

  • that disappear after ~5ms

  • 3 big visible spikes, plus a real signal at 2445MHz

  • only the real signal is visible after ~5ms

In mono channel I’m not seeing those weird spikes. Is this normal?