Accelerating the pace of engineering and science

# pskdemod

Phase shift keying demodulation

## Syntax

z = pskdemod(y,M)
z = pskdemod(y,M,ini_phase)
z = pskdemod(y,M,ini_phase,symbol_order)

## Description

z = pskdemod(y,M) demodulates the complex envelope y of a PSK modulated signal. M is the alphabet size and must be an integer power of 2. The initial phase of the modulation is zero. If y is a matrix with multiple rows and columns, the function processes the columns independently.

z = pskdemod(y,M,ini_phase) specifies the initial phase of the modulation in radians.

z = pskdemod(y,M,ini_phase,symbol_order) specifies how the function assigns binary words to corresponding integers. If symbol_order is set to 'bin' (default), the function uses a natural binary-coded ordering. If symbol_order is set to 'gray', it uses a Gray-coded ordering.

## Examples

expand all

### Compare Phase Noise Effects on PSK and PAM Signals

This example shows how to compare PSK and PAM to demonstrate that PSK is more sensitive to phase noise. This is the expected result because the PSK constellation is circular while the PAM constellation is linear.

```len = 10000;                % Number of symbols
M = 16;                     % Modulation order
msg = randi([0 M-1],len,1); % Original signal
```

Modulate using both PSK and PAM to compare the two methods.

```txpsk = pskmod(msg,M);
txpam = pammod(msg,M);
```

Perturb the phase of the modulated signals by applying a random phase rotation.

```phasenoise = randn(len,1)*.015;
rxpsk = txpsk.*exp(2i*pi*phasenoise);
rxpam = txpam.*exp(2i*pi*phasenoise);
```

Create scatter plots of the received signals.

```scatterplot(rxpsk);
title('Noisy PSK Scatter Plot')
scatterplot(rxpam);
title('Noisy PAM Scatter Plot')
```

```recovpsk = pskdemod(rxpsk,M);
recovpam = pamdemod(rxpam,M);
```

Compute number of symbol errors in each case. You can see that the number of errors for the PSK signal is much greater than the number of errors for the PAM signal.

```numerrs_psk = symerr(msg,recovpsk);
numerrs_pam = symerr(msg,recovpam);
[numerrs_psk numerrs_pam]
```
```ans =

343     1

```