I’m trying to demodulate P25 signals using GNURadio.
The specification says I should be able to use a single common DQPSK
receiver to recover either the 4 level FM (C4FM) or the CQPSK signals -
the difference being channel bandwidth (12.5KHz vs 6.25KHz) and that the
DQPSK is also amplitude as well as phase modulated. For my first attempt
I’ve used the GNURadio DQPSK block - here’s what I’ve done:
* Capture live data using usrp_rx_cfile.py (the sampling rate is 256KS/S so over 2MB for a short sample) [#1]. A screen capture of the FFT (peak hold) can be found at [#2]. * Extract a 12.5KHz channel the capture and write the complex baseband signal to file [#3]. So the spectrum now looks like [#4] and an oscope snapshot is shown in [#5]. The final display seems to show a phase-shifted signal so I am pretty confident this far is ok. * Wrote a program [#6] to take the complex baseband sample, resample it (so the sampling rate is an integer multiple of the symbol rate and at least 4x the highest possible component frequency of the signal), and demodulate it using the DQPSK block. The output is the dibit stream corresponding to the signals.
I am not convinced the output its right - I’m not finding the frame sync
sequence that should be present in the symbol stream. I’m thinking that
perhaps the standard block isn’t suitable for my use. Can anyone advise?
The other thing that causes me to think its not right is that according
the spec P25 uses a form of DQPSK where each successive symbol is
shifted in phase from its predecessor by 45 degrees (pi/4 radians). Yet
the spec also includes the following table which seems to shows a 90
shift between symbols. I am confused about the spec and unsure as to
what the DQPSK block expects.
CQPSK Phase Change (degrees)
C4FM Deviation (KHz)
So, is this really a pi/4 encoding or pi/2? Is the DQPSK block suitable
for demodulating P25? Am I using sensible values for the M&M clock
recovery/channel filter? Are there any other obvious mistakes?
On a related note, there’s a demodulator for a very similar system
(RD-LAP) described at http://radiorausch.googlepages.com. The author has
much more signal processing chops than I (the described code doesn’t use
the DQPSK demod block but a custom one). Sadly, there’s no code or
contact email there. If anyone knows the author perhaps they’ll point
them to me so I can beg or borrow that code.
 original signal
as capured by usrp_rx_cfile (2MB file)
 FFT peak values of original sampled signal
 complex baseband signal
 FFT peak values for baseband signal
 oscilloscope snapshot of part of the baseband signal
 Demodulator program demod_file_p25.py
(warning for svn trunk users: this code still uses gr.flow_graph!)