LimeSDR TDMA Based applications


I am currently building a DMR stack that could be used with SDR devices like LimeSDR.

Currently this is my setup:


  • The gnuradio-companion flow graph demodulate the 4FSK
  • The demodulated dibits are transmit by UDP to the software that decode DMR messages.
  • The software is able to decode DMR audio and data packets

The global idea is to be able to use my stack to build a DMR dispatcher software (open):

  • Receive SMS, Calls, GPS data, …
  • Transmit SMS, Calls

All of this without internet, without brandmeister things

Here is the DMR structure:

As you can see, depending if you are mobile station or base stations you are supposed to not necessary transmit the CACH. But in fact chineese radios (like I have: Retevis RT3), transmit the CACH.

(I will have to try with MOTOTRBO / HYTERA radios but i don’t have it…)

For the reception currently i don’t take care on TDMA, because I synchronise with the SYNC and I have the correct number of bytes (cach include)

The “worst” case for RX is when VOICE packets are transmit because you have one SYNC packet and then 5 packets without sync

But this is not a problem because the transmitted byte are correctly received, we don’t loose bytes during the demodulation, there is no synchronisation fails

But now I would like to implement the transmission.

For the transmission there are two cases:

1/ Supporting the TDMA: When we receive something we can transmit only if the “slot where we want to transmit” is idle.

2/ Not supporting TDMA: If you receive something (based on RSSI): you don’t transmit, If you don’t receive: you can transmit

Note in the case of #2: In this case, maybe the most simple is to act like chineese radios: transmit Slot 1 and Slot 2 (with idle slot and empty datas for the idle slot). But of course if you do it, the other will not be able to use “dual slot”.

Example for transmission in slot 1:

  • CACH Slot 1
  • Data (begin payload - sync - end payload)
  • CACH Slot 2 - idle
  • EmptyData (but not zeros)

Now my questions:

  1. Is it possible to work with TDMA protocols using SDR devices ? (We are not realy real time)

  2. Is it possible to get timestamp of received packets using gnuradio-companion ? Is it possible to transmit packets at specific timestamps (based on received timestamps) using gnuradio-companion ?

  3. Do you know a good method to use TDMA with SDR devices ? (Using timestamp ? Anything else ?)

  4. Did someone already implement 4FSK modulator/demodulator on LimeSDR FPGA ?

  5. I’m not sure, but i see something like if LMS7002 support 4FSK demod/modulator. Did someone already play with it ? (in this case, the TDMA could be FPGA based)

  6. For the transmission: Is it possible to stop the transmit carrier when i have nothing to send ? (On this forum I found lot of persons looking for a solution to stop the carrier, without reseting the lime… Someone find the “copy” block, but i don’t tried yet.


Some answers to your questions:

  1. Yes, it’s possible. Both the USRP and the LimeSDR support transmit time tags for bursts of samples. One project which does TDMA very well is Osmocom GSM base station transceiver. (and gr-gsm as well). Osmocom stack supports LimeSDR
  2. Yes. gr-limesdr has support for tx_time tags.Beware that gnuradio-companion while extremely useful in the design phase is not really the best choice for production. Ideally you want a standalone application that is not written in Python for performance reasons and flexibility.
  3. 4FSK modulation and demodulation is done in software usually, it’s not very demanding in computation resources. Downsampling and upsampling with filtering are though.
  4. It depends on what you mean by carrier. If there are no samples being sent, there will be no useful signal. However any local oscillator leakage might be present, so if that bothers you, you can adjust the TX gain to minimum while no samples are being played back over the air.