The constellation is likely oversampled (many samples per symbol) so that we see the desired symbols as they would be on the unit circle (for a PSK or phase shift keying modulation) as well as the transition samples between symbols. Further under condition of carrier offset, the entire constellation will rotate at the offset frequency. In addition, the waveform as transmitted will often be dispersed from the ideal constellation point due inter-symbol interference (ISI) as the ideal pulse shaping filter that has no ISI is typically split between transmitter and receiver to implement a "matched filter" in the receiver. Finally it is possible that the samples as received are offset in time from the correct sampling location (time offset). A typical receiver will address all these "offsets" using recovery loops (timing recovery, carrier recovery, etc). One approach to carrier recover that I demonstrate here with an implementation block diagram which occurs after timing recovery (with the samples down-sampled to be one sample per symbol at the expected time location within each sample), is to measure the phase rotation from symbol to symbol, and use that to correct the frequency offset in a classical control loop.
For a quick post processing study, an easy way to determine the carrier offset on the current waveform as sampled is to raise the waveform to the Mth power for an M-PSK waveform. After doing this taking the FFT will reveal a stronger tone at four times the carrier offset. I demonstrate these concepts below with an example 8-PSK waveform:
The constellation for the 8PSK waveform as transmitted, without any carrier offset is shown below. I have plotted all samples in blue, and every 8th sample in orange (the waveform was oversampled 8 samples per symbol). We see the effect of intersymbol interference since the pulse shaping filter is split between transmitter and receiver :
Passing this waveform through a second pulse shaping filter (in the receiver), with no time or frequency offset results in the following:
However, if there was a frequency offset, the entire constellation would rotate, with a small frequency offset introduced, the first constellation now appears as:
Raising this waveform to the 8th power (M=8) and looking at the spectrum reveals a strong tone at 8x the actual frequency offset:
This is one simple approach to determine if a frequency offset exists, and can be used as part of a recovery loop. More efficient approaches that operate sample by sample are detailed in the linked post above.



