Lecture 13 - Quadrature Amplitude Modulation (QAM)

In this lecture we will begin to consider complex valued samples as an input into our system. We will explore how to integrate complex values with our existing framework and why doing so might be worth the extra complexity.

1 Quadrature Modulation

Let’s begin by reconsidering what we learned with [amplitude modulation], this time adding a quadrature component. This means that our input signal is no longer real-valued, but complex-valued.

1.1 Time Domain

Before we begin, consider the old (real-valued) story. We took some baseband signal \(s(t)\) and shift it up in frequency by multiplying by a complex exponential. The trouble was that the resulting frequency shifted signal would be complex as a result of that multiplication. To rectify that issue, we simply took the real part of the signal.

Figure 1: Block diagram for modulating a signal with a complex exponential. Note the \(\sqrt{2}\) for energy normalization.

Now, let the input signal be complex-valued baseband waveform with max frequency \(B\) Hz. We can work through the same block diagram.

\[ s(t) = s_r (t) + j s_I (t) \]

From the multiplication of \(s(t)\) and the complex exponential we can write

\[ z(t) = \sqrt 2 \operatorname{Re} \{s(t)e^{j 2 \pi f_c t}\} \]

Recall that

\[ \operatorname{Re} \{z\} = \frac{z + z^*}{2} \]

so we can rewrite \(z\) as the following:

\[ z(t) = \frac{\sqrt 2}{2} [s(t)e^{j 2 \pi f_c t} + s^* (t) e^{-j 2 \pi f_c t}] \]

This can be further simplified to

\[ z(t) = \frac{\sqrt 2}{2} [ (s_R (t) + j s_I (t)) (\cos (2 \pi f_c t) + j \sin (2 \pi f_c t)) + (s_R (t) - j s_I (t)) (\cos (2 \pi f_c t) - j \sin (2 \pi f_c t)) ] \]

and then reduced to

\[ z(t) = \sqrt{2} [s_R (t) \cos (2 \pi f_c t) - s_I (t) \sin (2 \pi f_c t)] \]

We can see then that Figure 1 is actually equivalent to the following while being more compact:

Figure 2: Block diagram for modulating a signal with sine and cosine. Note the \(\sqrt{2}\)s for energy normalization.

Conceptually, we can think of a complex input signal as 2 separate real signals modulated onto the same frequency but with a \(90^\circ\) phase shift. In fact, this is the way that modulation of complex signals is done in practice – see the datasheet for our upconverter, the ADL5375.

Comments
  1. If \(s_I (t) = 0\) (i.e., the input is real) then this system corresponds to DSB-SC (Dual Sideband - Suppressed Carrier)
  2. The factor of \(\sqrt 2\) is normalization for energy (this can vary based on textbook - we’ll use \(\sqrt 2\) but others might use 2 or 1). This ensures that energy in the system is conserved, which is important when dealing with real-life systems.
  3. With this system we can send two baseband signals, each with baseband bandwidth \(B\), using a passband bandwidth of \(2B\). This is more bandwidth efficient than PAM, which has one signal of baseband bandwidth \(B\) using a passband bandwidth of \(2B\). We can send twice as much data in the same bandwidth. In wireless situations where bandwidth is limited by regulations (cellular, WiFi, etc.) this is extremely useful!

1.2 Frequency Domain

Recall that

\[ x(t) \longleftrightarrow \mathbb{X} (f) \]

implies that

\[ x^*(t) \longleftrightarrow \mathbb{X} (-f) \]

and that

\[ e^{j 2 \pi f_c t} \longleftrightarrow \delta (f - f_c) \]

We can then say that for \(z\) given by

\[ z(t) = \frac{\sqrt 2}{2} [s(t)e^{j 2 \pi f_c t} + s^* (t) e^{-j 2 \pi f_c t}] \]

we have the fourier transform of \(z\), \(Z\), which is given by

\[ Z(f) = \frac{\sqrt 2}{2} [S(f - f_c) + S(-(f + f_c))] \]

Note

Recall that multiplying by a complex exponential in the time domain simply causes a shift in the frequency domain.

Geometrically, the term \(S(f - f_c)\) indicates that \(S\) should be shifted right along the frequency axis to \(f_c\), while the term \(S(-(f+f_c))\) indicates that \(S\) should be shifted left along the frequency axis to \(-f_c\) and then flipped. The height of the waveform will change according to the normalization factor. See below.

Figure 3: The relationship between \(S(f)\) and \(Z(f)\).

Note that the magnitude of \(Z\) is even while the phase of \(Z\) is odd (i.e., \(z(t)\) is real-valued), even though \(s(t)\) is complex. This proves that our system takes a complex input signal and produces a real output signal.

2 Quadrature Demodulation

To recover the original baseband signals, we must first demodulate the passband signal by multiplying it with the negative complex exponential \(e^{-j 2 \pi f_c t}\).

Figure 4: Demodulation with complex exponential.

We can equivalently demodulate separately with the sine and cosine to recover the real and imaginary parts \(s_R (t)\) and \(s_I (t)\) separately.

Figure 5: Demodulation with sine and cosine.

This separated demodulation is what is more akin to how real hardware does the demodulation – our down-converter chip, the ADL5380 does this. Mathematically, the complex valued notation is simpler so we will continue to use it.

Note

The recovery here works because the product of sine and cosine has a frequency that will fall outside of the LPF. Recall the identity for the product of sine and cosine:

\[ \sin \alpha \cos \beta = \frac{\sin (\alpha + \beta)+\sin (\alpha - \beta)}{2} \]

In our case, \(\alpha = \beta\) because the demodulating sine and cosine’s frequency is the same magnitude as the input signal. Therefore,

\[ \sin f_c \cos f_c = \frac{\sin (2f_c)+\sin (0)}{2} = \frac{\sin (2f_c)}{2} \]

and for a reasonable LPF (i.e., \(W << f_c\)), any frequencies twice the center frequency will be filtered out.

3 Quadrature Amplitude Modulation (QAM)

Warning

Some textbooks will call it Quadrature Pulse Amplitude Modulation while others will just call it Quadrature Amplitude Modulation.

Now that we’ve covered the analog part of the quadrature system, we must consider the digital part.

Let \((a_0 [n], a_1 [n])\) denote a sequence of constellation points in 2 dimensions (i.e., a vector).

Let \(s_R(t) = \sum^\infty_{n=-\infty} a_0[n] p(t - nTs)\) and \(s_I (t) = \sum^\infty_{n=-\infty} a_1[n] p(t - nTs)\). This is an analog signal that results from applying a pulse shaping filter to the digital input.

Finally, let \(s(t) = s_R(t) + j s_I(t)\).

Here we are using 2 pulse amplitude modulators – one to create the real part of the signal \(s_R\) and one to create the imaginary part \(s_I\).

We will assume in the following calculations that \(p(t)\) is real-valued and used for both the real and imaginary parts of \(s(t)\).

Note

In theory we could use a different pulse shaping filter for \(s_R(t)\) and \(s_I(t)\), but in practice they are almost always the same. Additionally, while \(p(t)\) could in theory be complex-valued, it is almost always real-valued in practice.

\(s(t)\) can be written as \(s(t) = \sum^\infty_{n=-\infty} (a_0[n] + j a_1[n]) p(t - nTs)\). Notice that our input, \(a_0[n] + j a_1[n]\), looks like a complex number. We think of these complex numbers as points in a symbol constellation (See Section 3.1).

We can then think about our modulator using only one pulse amplitude modulator that modulates complex valued signals (\(a_0[n] + j a_1[n]\)), instead of two modulators dealing with separate real signals (\(a_0[n]\) and \(a_1[n]\)). We denote this complex sequence simply \(a[n]\).

Figure 6: A full system from digital input to analog output using a complex exponential modulator.

equivalent to

Figure 7: A full system from digital input to analog output using separate sine and cosine modulators.

which we now know is what our hardware will actually perform in lab.

Comments
  1. If \(\operatorname{Im}\{a[n]\} = 0\), then all of this is equivalent to PAM followed by DSB-SC AM, which we’ve seen already.

  2. Signal space spanned by waveforms

    \[ \sqrt 2 p(t) \cos (2 \pi f_c t), \sqrt 2 p(t-T_s) \cos (2 \pi f_c t), ..., \sqrt 2 p(t-nTs) \cos (2 \pi f_c t) \]

    \[ \sqrt 2 p(t) \sin (2 \pi f_c t), \sqrt 2 p(t-T_s) \sin (2 \pi f_c t), ..., \sqrt 2 p(t-nTs) \sin (2 \pi f_c t) \]

  3. We have some new terminology:

    \(\operatorname{Re}\{a[n]\}, \operatorname{Re}\{s(t)\}\) are called in-phase component, or I component, and \(\operatorname{Im}\{a[n]\}, \operatorname{Im}\{s(t)\}\) are called quadrature component, or Q component. The lab kit contains an I/Q demodulator, which indicates its ability to handle both of these components.

    Because we now have the potential for complex-valued symbol constellations, there is a lot more flexibility in the structure of these constellations. See Section 3.1.

3.1 Constellations

Here are a few constellations that are now possible using complex numbers, as seen in the complex plane.

3.1.1 MPSK

Code
import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(10,3))

for m in [2, 4, 8]:
    constellation = np.zeros(m, dtype=np.complex128)
    for i in range(m):
        angle = 2*np.pi * i/m
        constellation[i] = np.cos(angle) + 1j*np.sin(angle)

    plt.subplot(1, 3, int(np.log2(m)))
    plt.scatter(constellation.real, constellation.imag, s=12)
    plt.axhline(0, color='k', linewidth=.8), plt.axvline(0, color='k', linewidth=.8)
    plt.xticks([]), plt.yticks([])
    plt.xlim([-1.1, 1.1]), plt.ylim([-1.1, 1.1])
    plt.title(f"{m}PSK")

Figure 8: Square MPSK constellations for M=2, M=4, and M=8.

3.1.2 MQAM

Code
import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(10,3))

for i, m in enumerate([4, 16, 64]):
    constellation = np.zeros(m, dtype=np.complex128)
    upper = int(np.sqrt(m))
    lower = -1 * upper
    for j, x in enumerate(range(lower+1, upper+1, 2)):
        for k, y in enumerate(range(lower+1, upper+1, 2)):
            constellation[upper*j+k] = x + 1j*y

    plt.subplot(1, 3, i+1)
    plt.scatter(constellation.real, constellation.imag, s=12)
    plt.axhline(0, color='k', linewidth=.8), plt.axvline(0, color='k', linewidth=.8)
    plt.xticks([]), plt.yticks([])
    plt.title(f"{m}QAM")

Figure 9: Square MQAM constellations for M=4, M=16, and M=64.