0

I'm trying to develop an application for the demodulation of some GMSK signals transmitted over the air. I'm using a RTL-SDR which outputs 8 bits IQ samples of the baseband signal.

Here is what I've understood and what I've done :

Since they are GMSK signals, the binary data is encoded by phase variations. A +PI/2 phase change equals 1 and a -PI/2 phase change equals 0.

So I developped the following piece of software :

  • apply a frequency translation, then low pass filter and decimate to 1 sample/symbol
  • read each couple of I and Q samples
  • compute the instantaneous phase with arctan(Q/I)
  • compare phase change between the n-th and the previous (n-1) sample
  • if n > n-1 then we have 1 or we have 0

While this method works relatively well with a high SNR (i.e. 60dB), it become realy bad with a lower ratio.

I guess this bad performance is due to the non-coherent demodulation.

I saw that coherent demodulation which uses carrier/clock recovery then phase error estimation is a lot more reliable and accurate.

I'm a true signal processing beginner. Do you know what should I do with my IQ samples to gain a better demodulation?

Thank you.

EDIT 2021/05/16 : Trying another approach

I guess a timing recovery algorithm sould be applied to an output NRZ signal. So I'm trying another way to demodulate GMSK.

In order to use a TED algorithm (such as Zero Crossing) later, my input baseband signal is sampled at 2 samples/symbol,

Diagram block of GMSK demodulator

For each complex sample, I compute the instantaneous phase with arctan(Q/I) :

Wrapped instantaneous phase

Then I perform phase unwrapping :

enter image description here

And I compute the derivative by doing nth-(n-1)th phase and finally I get a FM demodulated audio of my baseband signal and not a NRZ signal :

enter image description here

However, I saw that passing this signal to Clock Recovery MM and Binary Slicer blocks in GNURadio Companion gives the array of 0s and 1s.

How can I get an NRZ signal ?

pior
  • 1
  • 1
  • Typically demodulators oversample by something between 2 and 8 times. Then like you said there are carrier and phase estimation loops. Phase estimation can give a fractional estimate that is higher resolution than the oversampling rate. So a poly-phase version of the low pass filter is used. – IanJ Apr 18 '21 at 16:22
  • Do you filter the noise somewhere? – gotchi85 Apr 18 '21 at 16:27
  • Thanks for your answers. I've applied a frequency translation, then a low pass filter and decimation to 64000 samples/second. But I also applied a second decimation to 1 symbol per second. The baudrate is 9600Bds. – pior Apr 18 '21 at 16:55
  • @IanJ what kind of algorithm can I implement for carrier and phase estimation with discreet signals ? I saw a lot of documents. But they mainly talk about real signals and not discreet signal with I/Q samples. – pior Apr 18 '21 at 17:02
  • To cancel out a carrier offset you can accumulate phase change with a IIR type filter and use this as feedback to the frequency that you are multiplying by. (Assuming that 1's and 0's are equally likely the phase should add up to zero after a long time). For the phase estimate convolve the poly-phase filter with the I/Qs and pick the phase in the middle of the "eye". – IanJ Apr 18 '21 at 19:55
  • @IanJ I think you may be confusing carrier recovery with timing recovery? To shift the sample to the middle of the eye is done with the timing recovery loop which is independent of a carrier recovery loop which removes carrier offsets between transmitter and receiver (and independent of sampling time offsets). Both are needed. – Dan Boschen Apr 18 '21 at 20:58
  • thank you for your help – pior Apr 20 '21 at 09:55
  • Hello, I have updated my question. – pior May 16 '21 at 18:08
  • @pior I don't see any hint. Could you provide an FFT plot of your signal at the input of your chain and another before the arctan? With frequencies on X axis would be great – gotchi85 May 17 '21 at 16:41

0 Answers0