Eric and my team at Virginia Tech just got
done creating a full differentially encoded QPSK transceiver. There’s
still a bit left to be done on it, but the basic building blocks should all be
checked in by now. For carrier synchronization of a QPSK waveform, we use the
classic fourth order Costas loop approach, a block you can find as
gr_costas_loop_cc. Set the alpha value somewhere around 0.005 – 0.05 to
get started (and play with it from there). The beta value should be about an
order of magnitude smaller (it’s been set to 0.25*alpha^2; I’m not
sure where that comes from, though). The next two arguments are the max and min
frequency deviation in terms of scaled frequency, so 0.05 and -0.05 work well.
The final value of the reference phase can just be set to 0. This block’s
been around for a bit of time and used in BPSK.
From here, you’ll need to worry
about symbol synchronization. We build a complex modified Mueller and Muller
clock recovery circuit for this called gr_clock_recovery_mm_cc (this file existed
already, but we modified it some). Set mu=0.05, omega is approximately the
samples per baud, gain_mu=0.05, gain_omega=0.25*mu^2, and omega_rel_limit=0.5.
These values will get you started.
There are other blocks available now to do
differential encoding and decoding to handle the phase ambiguity generated by
the Costas loop (the final constellation can be in any one of 4 rotations). In
the GMSK2 examples, I know the benchmark_xpsk_tx.py generates the
differentially encoded QPSK signal. If not there yet, soon the
benchmark_xpsk_rx.py should do the synchronization and differential
demodulation once a few more things are worked out.
[mailto:address@hidden On Behalf Of 2 1
Sent: Thursday, June 01, 2006 6:16
Question about carrier syncronization fordemodulating QPSK/BPSK signal.
The problem is HOWTO do carrier syncronization.
I am using two USRP with FLEX 2400, one for Tx, the other for Rx.
The RF of both Tx and Rx are tuned to 2.45GHz.
I generate and transmit a QPSK signal. At the receiver, an obvious
frequency deviation can be observed from the fft sink. And of course, nothing
can be demodulated. (using simple correlator to deframing, no seqno outputs).
So I adjust Tx RF a little bit, and I realy get some seqno from
simple_correlator, but they are uncontinuous and snatchy,
which means the manual freq adjustment is not so accuracy.
I think the linear bidimention mouduation such as BPSK/QPSK/16QAM
requires much more accurate syncronization of carrier than FSK does.
There are already some discusses on the archive about BPSK demod, but I
still have no idea about that.
I read the code and find that the author wrote a costas loop which
require sinusoid input. This scheme will produce higher speed baseband signal,
which cost much USB bandwidth. I wonder if only pure IQ complex at the speed of
QPSK symbol rate can do carrier sync and demodulation.
The following are the key src code of my QPSK mod/demod.
src = "" (gr.sizeof_char, filename, options.repeat)
framer = gr.simple_framer
bytes_to_syms = gr.bytes_to_syms ()
qpsk_mod = gr.float_to_complex()
interp = gr.interp_fir_filter_ccf (8, interp_taps)
...# usrp init
self.connect (src, framer, bytes_to_syms, qpsk_mod, interp, gain, u)
filter = gr.fir_filter_ccf (1, rx_taps)
c2f = gr.complex_to_float()
corr = gr.simple_correlator (payload_size)
filesink = gr.file_sink (gr.sizeof_char, options.filename)
self.connect (u, filter, c2f, corr, filesink)