Simple modulation using LimeSDR & grc


i want to create a simple project with GRC: Import file, modulate it, send it with LimeSDR, receive it with same LimeSDR and demodulate it.
So far I’ve tried to modulate with bpsk without the Lime using constellation modulator. When I noticed this constellation:

I thought the smeared points are because the constellation modulator needs at least sbs = 2. Yet a qam constellation is not better

What am I missing? A synchronization?

Since it is not crucial to use the constellation modulator and I’ve also read that it will be deprecated in version 3.9, I also tried to pack the bits myself:

which worked great until I noticed that the 1.0/-1.0 sequence in the device was correct for the first character of the text file, but then it was false. Also the spectrum is not really how I expected it.

After some debugging and trial & error I realized my mistake(s).
The “Repack Bits” blocks needed MSB Endianness (duh) and using digital.psk_2() for the constellation object proofed helpful, apparently I had this wrong.

Without any transmission yet, just Mod/Demod, I receive the correct data:
Screenshot from 2018-10-05 11-40-13

I’ve also experimented with the frequency deviation of the receiver depending on how much bits being packed into one symbol. So far for BPSK and QPSK these two formulas proofed helpful:
min = 1.0/(1.0+bits_to_pack/4.0)
max = 1.0*(1.0+bits_to_pack/4.0)

If someone is interested I can provide status updates in this topic?!


Hi, @maschi01

It is always interesting to read other people experience. You can never know when someone will need it and it may save a day or two for the new or not so experienced people. Thank you for posting this. :slight_smile:

1 Like

After some days now I thought I’ll give an update.

Before sending anything I wanted to get my modulation & demodulation right. So i started a side project with a lot of try & Error and experimenting with different blocks, but finally i got my data (however I needed to bitshift the whole file).

The result:
Screenshot from 2018-10-16 09-42-05

The good thing: This also works when I add my LimeSDRs, however, since I don’t trigger on a syncword yet, the Data is scattered in the bithsifted files.
The project looks like this by now. Variables & TX part with modulation and primitive packet generation:

The RX Device. Notice that the LimeSuite RX has an input, I modified the code to be able to activate AGC.

And the demodulation and bitshift:


1 Like

@maschi01, what modifications have you done with LimeSuite blocks? Because I see they are named as “Modified”.

Both Source and Sink have the option to “Print Stream Stats”, e.g. the “RX rate: … MB/s dropped packets: … FIFO: …” lines.
Source has a new input which sets the value it gets as the AGC value via a callback.

I’m also planning to give both sink and source a port to modify SPI registers.

Nice! Good to see you dig deeper and try to adjust code to your needs. Stream stats are great for debugging streams and etc. You can check stream metadata timestamps as well if you need more info about packets. Check Limesuite.h for more info.

Thanks! But to be fair, the stats lines were already in the LimeSuite Blocks, i just activated them :slight_smile:

I will probably share the modifications once I’m happy with the code.