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.
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
We can see then that Figure 1 is actually equivalent to the following while being more compact:
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
If \(s_I (t) = 0\) (i.e., the input is real) then this system corresponds to DSB-SC (Dual Sideband - Suppressed Carrier)
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.
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!
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.
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}\).
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.
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:
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]\).
equivalent to
which we now know is what our hardware will actually perform in lab.
Comments
If \(\operatorname{Im}\{a[n]\} = 0\), then all of this is equivalent to PAM followed by DSB-SC AM, which we’ve seen already.
\(\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 npimport matplotlib.pyplot as pltplt.figure(figsize=(10,3))for m in [2, 4, 8]: constellation = np.zeros(m, dtype=np.complex128)for i inrange(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")
3.1.2 MQAM
Code
import numpy as npimport matplotlib.pyplot as pltplt.figure(figsize=(10,3))for i, m inenumerate([4, 16, 64]): constellation = np.zeros(m, dtype=np.complex128) upper =int(np.sqrt(m)) lower =-1* upperfor j, x inenumerate(range(lower+1, upper+1, 2)):for k, y inenumerate(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")