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:
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:
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?!
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.
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 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:
@Osvald
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.