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,
For each complex sample, I compute the instantaneous phase with arctan(Q/I) :
Then I perform phase unwrapping :
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 :
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 ?



