Multichannel (simultaneous) RX using LimeSDR



Not being able to help you with switching 2 TX channels to RX (as this is what you want if I get it right), just wished to ask if you saw a new Lime board with two LMS chips. Don’t remember its name, saw it somewhere on their pages. Don’t know how much it would cost though :). But at least technically it should be able to give 4xTX…

I just started to use 2 RX channels in parallel in our custom Windows app, so far looks pretty decent.



Yup, I did that, at first with custom C++ application in burst-based mode, and later again in GNU Radio Companion in continuous mode. I was transmitting BPSK signals with different main lobe width on two frequencies (utilizing two TX channels) and then receiving these signals with two RX channels. I was not actually decoding these BPSK signals (since that was not a purpose of my tests), but since the received signals spectrum looks quite well I would say it should work :slight_smile: Here is the example output:


I hadn’t seen the new board with two LMS chips yet, which would be good. That would give me four channels once I get an external reference clock on the chips.

Since you got the two channel RX working, how are you finding the timing of the RX samples? Can you get samples from each RX at the same time or within a sample or two? Sampling timing is important for my work.



Yes, I tested this by switching both rx inputs to one generator output through T-type RF-connector. For my purpose it was sufficient, but I don’t remember exactly which maximum difference in terms of sample count I saw. I remember that it depended on sampling frequency and/or oversampling factor. If I remember correctly, at rates of 20 and 40 MHz it was exact sample-to-sample correspondence between two channels, but when I did rx at 10 MHz (meaning that I used x16 oversampling), I saw several samples phase offset. Though I dont remember how many. I think visually it was no more than 4-5 samples, may be 2-3, but not certain about this now. I just remember that it looked a bit surprising to me, but didn’t go deeper to find out what it was related with.



Actually such board is available on LimeNET campaign page (look for LimeSDR QPCIe). It is quite expensive though.

I have discovered MIMO channels alignment bug, which has been recently fixed by Josh Blum. However, this fix was applied only in SoapyLMS7 plugin, so if you are using e.g. LimeSuite to control your board, you can still suffer from this and observe misalignment as big as few thousands of samples…


In that comment on github, he states that it occurs if overflow has happened, if I get it right. But I don’t remember to read about overflows in your initial report (though may be I didn’t read it with much attention). Can this unsync happen with no overflows? It’s interesting to me because I’m using LimeSuite and probably will have to deal with that kind of failures myself. Though didn’t encounter it yet…


Indeed, no “usual” overflows were reported, but I believe Josh meant overflows in internal fifo queues storing samples from both channels. Actually, he explained it little more in this post. What I’ve understood it means, that despite it is fixed in SoapyLMS plugin, it may still happen when you are using C driver API in direct way.


Thank you for this reference, it’s the nuance we must be aware of, as it isn’t fixed in C API. (Though I think it’s not essentially that kind of unalignment that will_mysky meant originally, but still.)


That problem should not happen with no overflows. Basically, as long as you read same amount of samples from each FIFO and no overflows occur, timestamp should be same for both channels so you don’t need to check both timestamps.
Use timestamp from each FIFO If you need to use channels independently or realign channels after lag spike. If FIFOs are constantly overflowing increase FIFO size or reduce sampling rate so your application can process data stream fast enough.


Good news, thank you!


Hi all,

I’m in the process of trying to RX from the “A” and B" receivers using GNURadio Companion and the associated stack of API. I have single channel RX working just fine. My osmocom source block uses the “soapy=0,driver=lime,nchan=2” as discussed in another thread ( but I am getting the error

RuntimeError: resolve_port: hierarchical block ‘source_impl’: output 1 is not connected internally

every time I attempt to run the code. I can’t see where I’m going wrong here. LimeUtils can locate and connect to the device without issue, and if I run single channel source (and remove the “nchan=2”) everything works fine.

Thanks everyone for your help


My advise is to use USRP Source/Sink instead of Osmocom Source/Sink, as you won’t be able to use LimeSDR in MIMO mode with Osmocom blocks anyway.


Hi all,

I also looking for to receive simultaneously two RX frequencies. But according my investigation, it’s doable only if the two frequencies are in the range of the bandwidth (61.44MHz). Indeed, according the datasheet of the LMS7002M, the two RX chains share the same RXLO/PLL. Is it correct ?

Thanks for your reply.




I have gotten signals out using the UHD: USRP Source block, setting Device Arguments to


the number of Channels to 2, but how do I select the antennas? As this is a USRP dialog box, it lists certain things on the drop down. Can I just type “LNAL” and “LNAH” in the antenna boxes and make it go?

Thanks everyone for your assistance


Again, yes :slight_smile:


ok, now I am quite confused. I have used the above method, and where it appears that it is rx’ing two signals when I record the input from each channel to a “file sink” in GNU Radio I am getting data from channel 0 only and nothing from channel 1. the antennas are connected to the RX1_H and RX2_H ports respectively. I wish there was more clear documentation for doing 2 channel RX because I can’t believe it’s this difficult to get working properly.

I am tuning both RX to the same frequency, with the same sample rate.


I don’t know much about the limeSDR…,
But, limeSDR only have 2 RX channels, not 6.

The thing, that you saw, “RX_L, RX_H, RX_W” is actually same one RX channel.
It just choose which carrier frequency you will get.
RX_L : is lower then 2.5Ghz,
RX_H : higher than 2.5GhZ,
W: wide,

these three thing may because of different rx power, I guess… but not sure.


Do you have some sample C++ code showing the multi-channel RX?

I can properly receive up to 68MHz of bandwidth through SoapySDR on a Lime PCIe on channel 0.

If I try to receive on channel 1 only, I don’t receive anything (SoapySDRDevice_readStream returns -1). @IgnasJ Can it be that I must use either channel 0, or both channel 0 and 1, but not only channel 1?

If I try to receive on both channels 0 and 1, I get an Access violation writing location after a few receive when calling SoapySDRDevice_readStream.

@joshblum Something unrelated to the above: SoapySDRDevice_getAntenna returns LNAL and LNAW properly, but it returns NONE when I pass LNAH to SoapySDRDevice_setAntenna.


Thanks. Looks like the logic wasn’t quite right for LNAH path since its doesn’t have a corresponding EN_INSHSW register like the others. I fixed this on master.