Phase error detector for BPSK / M-ASK (squaring loop) and M-PSK ( loop)

Séquence d'appel

ped = ped_init(tp,M[,tc])



Type of phase detector (can be 'psk', 'costa', 'psk-atan', 'psk-map', or 'ask')


Number of possible symbols ( with being the number of bits per symbol)


Time constant for coarse RSSI estimation (expressed in number of samples)


Phase error detector object. Fields are: ped.process: processing function of form [ped,dphi] = process(ped,z), with dphi: phase error, and z: input sample, other fields are private.


This is a basic phase error detector for M-PSK (or M-ASK). Different type of detectors are supported:

  • tp = 'psk' The signal is exponentiated by M so as to remove the modulation, the RSSI is coarsly estimated (first order IIR filter), and then the phase error is estimated as: . This detector is less sensible to noise as the naive atan detector.

  • tp = 'psk-atan' Arc-tangent phase detector for PSK modulation (also called 'tan-loop'), computed as: . Be carefull, this detector can be very unreliable at low SNR or when clock recovery is not yet done (very high artificial phase error when the signal magnitude is near 0).

  • tp = 'psk-costa' Use a costa loop (works only with BPSK or QPSK).

  • tp = 'ask' If M=2, then use a squaring loop (as for BPSK), otherwise, use a tan-loop.


// Default PED for BPSK (squaring loop)
ped = ped_init('psk',2);
n = 100;
// Test signal : varying phase error from -%pi to +%pi
phase = linspace(-%pi,%pi,n)';
z = exp(%i*phase);
// Use the PED on the signal "z"
detected_phase = ped.process(ped, z);
// Notice phase ambiguity due to the squaring
clf(); plot(phase,detected_phase);

Example of phase error detection (here squaring loop, e.g. M=2). Note the phase ambiguity of .