On Thu, Feb 5, 2009 at 3:42 AM, Einar T. [email protected]
signal symbol for symbol.
You will need to synchronize both to the transmitter carrier frequency
and phase, and as you mention, also to the bit timing. For BPSK, GNU
Radio has a ready made block to do each.
Carrier recovery/synchronization can be done with a Costas loop, which
will track out any residual carrier resulting from not being tuned to
exactly the center frequency of your passband. For symbol timing,
there is a resampling block implementing the Muller and Muller
algorithm. This will track the “center of the bit” and fractionally
resample to 1 sample per symbol. This is a common enough combination
that there is a combined block to do both with less CPU consumption
and better SNR (gr.mpsk_receiver_cc).
From there you can use a hard-decision slicer on the I channel, or
implement your own more sophisticated algorithm based on whether there
is error coding or some other known property of the transmit signal.
An example that implements all of the above (using separate Costas and
M&M blocks) may be found in the gnuradio-examples/python/digital-bert
directory. This implements a continuous BPSK transmitter using a
known, scrambled bit sequence. The receiver performs filtering,
synchronization, demodulation, retiming, bit slicing, and
descrambling, then measures the bit error rate and estimates the
receiver signal to noise ratio. These values, plus the current
frequency offset and timing offset, are displayed once per second.
A more sophisticated example is the digital packet radio that
interfaces with the Linux TCP/IP stack, which may be found in the
python/digital directory. This combines a configurable PHY later (bit
rate, modulation technique, etc.) with a (very) simple CSMA MAC. This
is harder to study, and the details of the DQPSK implementation are
buried in another directory, but it is full-fledged 2-way half-duplex
radio link using GNU Radio.
Welcome to GNU Radio!