This is the 5th article in the series of Signals and Systems Review.
We introduced how antenna works in The Revolution of Antenna Technology. The transmitter can convert electricity to electromagnetic wave, and the receiver can convert the electromagnetic wave back to electricity. One important characteristic of antenna is that the size of it is proportional to the wavelength of waves it radiates. To send a long wavelength (low frequency) wave, a big antenna is required. Therefore, we like to “move” signal to high frequency part to send it out. This process is called modulation. When the signal is received on the other side, it is “move” back to the low frequency band. This process is called demodulation.
To realize modulation, the original signal is multiplied with a high frequency signal. The original signal is called baseband signal, and the high frequency signal to multiply is called carrier wave.
This article views from the perspective of signals and systems, to see how to move frequency up (upconversion) and down (downconversion) can be realized.
How to move the signal to different frequency band?
To move to different frequency band, we have to multiply it with a high frequency wave, let’s say it’s a cosine wave cos(2πf_ct). We’ve proved in Understanding Signal Sampling and Sampling Theorem that multiplication in time domain equals the convolution in frequency domain. Therefore, it equals the convolution of X(f) and F{cos(2πf_ct)}, where F{cos(2πf_ct)} stands for the Fourier transform of cos(2πf_ct).
Let’s firstly calculate F{cos(2πf_ct)}:
Equ. 1. uses Euler’s formula to decompose cosine wave into two exponential terms. The third equal sign, however, might be a bit confusing. How come the Fourier transform of exponential term is a δ function?
δ(f) is a function that only contains non-zero value at f=0, and for the other parts the value is 0. Shifting this function by f_c, we obtain f(f-f_c), meaning that this function contains non-zero value at f=f_c, and for the other parts the value is 0. This means when this function is in integral, the upper bound and lower bound “shrinks” to a single point. For example, calculate the integral of multiplication between δ(f-f_c) and e^j2πft (which is basically the inverse Fourier transform of δ(f-f_c)).
Equ. 2. tells us that the inverse Fourier transform of a δ function is an exponential term. Therefore, the last equal sign in Equ. 1. means the Fourier transform of exponential, and it’s a δ function.
Now we know the Fourier transform of a cosine function is two δ functions.
Let’s assume y(t) is the multiplication of x(t) and the carrier wave, which is actually the convolution of X(f) and 1/2[ δ(f-f_c)+ δ(f+f_c)]. Let’s first see the convolution of X(f) and δ(f-f_c):
Note that convolution has commutative property, so δ(f-f_c) convolves X(f) is the same as X(f) convolves δ(f-f_c). As we can see, it means changing the frequency from f to f-f_c.
Therefore, to calculate:
The result is that in both the positive and negative side of frequency spectrum there exists baseband signal, with half of the original amplitude.
Upconversion
So far we already know how to convert the signal from low frequency to high frequency, just by a mulitplication of a carrier wave. A mixer can easily do that, generating a signal with double-sideband. This is called a double-sideband (DSB) signal.
A circuit architecture to generate DSB signal is as follows:
The upper sideband (USB) is on the right side of frequency f_c, it was originally at the right side of 0Hz. The lower sideband (LSB) is on the left side of frequency f_c, it was originally at the left side of 0Hz.
In fact, for real-valued signals, USB and LSB are always symmetrical. This is because the Fourier Transform of any real-valued signal results in a frequency spectrum that is symmetric about the origin. Upconversion merely shifts this signal from the origin to a higher frequency, but it still retains its property of being symmetric about that new center frequency. This property is called Conjugate Symmetry. Conjugate symmetry implies two things: (1). The amplitude spectrum is even symmetric. (2). The phase spectrum is odd symmetric. (The amplitude spectrum and phase spectrum are introduced in How do filters work and how to simulate them.)
The proof of this property is given in Note 1.
This implies that we can obtain the LSB by mirroring the USB. From an engineering perspective, transmitting information that can be directly inferred at the receiver end consumes bandwidth, which is a waste of bandwidth resources. Fig. 2. can be used to calculate the bandwidth of this signal. For a real-valued signal, bandwidth calculation only needs to consider the positive frequency half. Therefore, the bandwidth consumed by the modulated signal becomes twice the bandwidth of the original signal.
So, how can we eliminate one half of the signal? Readers who have gone through How do filters work and how to simulate them will certainly think of using a filter. We can design a high-pass filter to block the signal below f_c, as shown in the following figure:
But we also mentioned in the same article that this is practically hard.
So is there a way to eliminate the LSB automatically through a good design?
Single sideband modulation can do that:
In Fig. 6., the circular wavy symbol represents the Local Oscillator (LO), and its function is to generate the carrier wave. The carrier wave cos(2πf_ct) is multiplied by 1/2 m(t) in the upper path. In the lower path, the carrier undergoes a π/2 phase shift and is multiplied by 1/2 m_hat(t). The final step determines whether to add or subtract the signals from the two paths; this result determines whether the system outputs the upper sideband or the lower sideband.
The H_h(f) in Fig. 6. is a Hilbert Transformer, which is capable of performing a Hilbert transform on the input signal. The significance of the Hilbert transform is that it can shift the phase of the entire signal by 90 degrees. We specifically distinguish between a π/2 phase shifter and a Hilbert Transformer because the π/2 phase shifter processes a single-frequency signal (in this diagram, the cos(2πf_ct) generated by the oscillator), whereas the Hilbert Transformer can process a multi-frequency signal. To avoid digressing, we will not delve deeply into the Hilbert transform in this article.
Assuming the signals from the two paths are subtracted in the final step, the SSB signal output by the system is as follows:
To illustrate how one sideband is eliminated, let’s use a cos(2πf_mt) as input signal as an example
Equ. 7. shows that the signals generated in the upper and lower paths, cos(2π(f_c-f_m)t) and cos(2π(f_c+f_m)t), are the lower sideband (LSB) and upper sideband (USB) components, respectively. Therefore, by adding or subtracting these two paths at the output, we can generate a signal with only the upper sideband or only the lower sideband. In this way, we have eliminated one of the sidebands
The transmitter uses a carrier wave to increase the signal’s frequency, and the receiver must then find a way to bring the signal’s frequency back down. This process of lowering the frequency back down is called downconversion. Next, let’s look at the architecture for downconversion.
Downconversion
Fig.3. introduced the DSB (Double-Sideband) transmitter. Now, let’s introduce how the DSB receiver restores the signal m(t).
Here’s the demodulation process
Next, to obtain m(t), we pass the signal through an LPF (Low-Pass Filter). The cos(4πf_ct) term is a high-frequency component and will be blocked by the filter. The signal remaining after passing through the filter is only m(t)/2, and the demodulation is complete.
The difficulty with this modulation method is that it must be ensured that the two oscillators (at the transmitter and receiver) generate carriers with the exact same frequency and phase. The technique of using a synchronized carrier for demodulation is called Coherent Demodulation. If the receiver’s oscillator produces a signal with a different frequency or phase, Equ. 8. will no longer hold true.
For Single-Sideband (SSB) modulation, the demodulation method is exactly the same. The demodulator architecture is identical to Fig. 7. Taking the addition of the two paths in Equ. 7. as an example, let’s calculate the process of the signal being multiplied by the mixer:
After passing this signal through an LPF, we can see that only cos(2πf_mt)/2 remains, which means we have successfully restored the signal.
I/Q Modulation
In addition to the two methods mentioned above, we will introduce another modulation technique called Quadrature Modulation.
Common sense suggests that only one set of signals can be transmitted on a single carrier, but I/Q modulation overturns this limitation. The core concept of I/Q modulation is to transmit two independent streams of information on the same carrier. Why can one carrier transmit two independent streams of information? Let’s first look at the architectural design of I/Q modulation and then prove step-by-step that the two signals will not interfere with each other.
The two input signals are q(t) and i(t), the carrier wave in one path goes through a π/2 and multiply with q(t), the other carrier wave with i(t), these two paths are added and output:
The way to determine if the two signals interfere with each other is to see if i(t) and q(t) can be recovered at the receiver end. Fig. 6. shows the receiver design for IQ modulation. By multiplying with a carrier of the same frequency, and then using a filter, the original two signals can be recovered
Let’s calculate these two path, starting from the upper one
Equ. 12. utilized the conversion of sine square and 2sinθcosθ. Similarly, for the lower path
From this, we know that the signals from both the upper and lower paths can be recovered at the receiver end.
Conclusion
This article uses modulation techniques as an opportunity to introduce signal upconversion and downconversion. These two techniques are essentially the same, both accomplished by multiplying the original signal with a carrier wave. There is a lot that can be discussed regarding modulation techniques, but doing so would deviate from the main topic of Signals and Systems. In the future, we will introduce modulation techniques separately in a series on Communication Systems.
Note1: The proof of conjugate symmetric of real-valued signal
To prove
#Fig. 1.
import numpy as np
import matplotlib.pyplot as plt
# --- 1. Parameters ---
fc = 10    # Carrier Frequency in Hz
A = 1.0    # Amplitude
T = 0.5    # Duration of simulation in seconds
# --- 2. Create the Time-Domain Signal ---
# Create a high-resolution time axis
t = np.linspace(0, T, 1000, endpoint=False)
# Create the cosine wave signal
cosine_wave = A * np.cos(2 * np.pi * fc * t)
# --- 3. Create the Frequency-Domain Signal ---
# Create a frequency axis
f = np.linspace(-fc * 2, fc * 2, 2000)
# The spectrum of a cosine wave consists of two impulses at +fc and -fc,
# each with an amplitude of A/2.
# For visualization, we use stems to represent the impulses.
# --- 4. Plotting ---
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
fig.suptitle('Fourier Transform of a Cosine Wave', fontsize=16)
# --- Subplot 1: Time Domain ---
ax1.plot(t, cosine_wave, 'b', linewidth=2)
ax1.set_title('Time Domain')
ax1.set_xlabel('Time (s)')
ax1.set_ylabel('Amplitude')
ax1.grid(True)
ax1.axhline(0, color='black', linewidth=0.5)
# --- Subplot 2: Frequency Domain ---
# Use a stem plot to represent the discrete frequency impulses
markerline, stemlines, baseline = ax2.stem([-fc, fc], [A/2, A/2], linefmt='r-', markerfmt='ro', basefmt=' ')
plt.setp(stemlines, 'linewidth', 2)
ax2.set_title('Frequency Domain')
ax2.set_xlabel('Frequency (Hz)')
ax2.set_ylabel('Amplitude')
ax2.grid(True)
ax2.set_ylim(0, A/2 * 1.5)
ax2.set_xlim(-fc * 2, fc * 2)
# Display the mathematical formula on the plot
formula = r'$\mathcal{F}\{A \cos(2\pi f_c t)\} = \frac{A}{2}[\delta(f - f_c) + \delta(f + f_c)]$'
ax2.text(0, A/2 * 1.1, formula, fontsize=14, ha='center')
plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()
# Fig. 2.
import numpy as np
import matplotlib.pyplot as plt
# --- Parameters ---
B = 20      # Baseband signal bandwidth (Hz)
fc = 100    # Carrier frequency (Hz)
# Create the frequency axis
f = np.linspace(-150, 150, 2000)
# --- 1. Create the Baseband Signal Spectrum (Triangle) ---
# This represents the Fourier Transform X(f) of our hypothetical signal x(t)
X_f = np.maximum(0, 1 - np.abs(f) / B)
# --- 2. Create the Upconverted Signal Spectrum ---
# Based on the formula: Y(f) = 0.5 * [X(f - fc) + X(f + fc)]
# Create the spectrum shifted to the right
X_f_shifted_right = np.maximum(0, 1 - np.abs(f - fc) / B)
# Create the spectrum shifted to the left
X_f_shifted_left = np.maximum(0, 1 - np.abs(f + fc) / B)
# Add them together and halve the amplitude
Y_f = 0.5 * (X_f_shifted_left + X_f_shifted_right)
# --- Plotting ---
# The font settings for Chinese characters are no longer needed.
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True, sharey=True)
fig.suptitle('Frequency Domain Effect of Time Domain Multiplication: Frequency Shifting', fontsize=16)
# Plot 1: Original Baseband Signal Spectrum
ax1.plot(f, X_f, 'b', linewidth=2, label='Original Baseband Spectrum $X(f)$')
ax1.set_title('1. Original Signal (Before Multiplication with Carrier)')
ax1.set_ylabel('Amplitude')
ax1.grid(True)
ax1.legend()
ax1.text(B, -0.1, f'{B}', ha='center')
ax1.text(-B, -0.1, f'{-B}', ha='center')
# Plot 2: Upconverted Signal Spectrum
ax2.plot(f, Y_f, 'r', linewidth=2, label='Upconverted Signal Spectrum $Y(f)$')
ax2.set_title('2. Signal After Multiplication with Carrier')
ax2.set_xlabel('Frequency (Hz)')
ax2.set_ylabel('Amplitude')
ax2.grid(True)
ax2.legend()
ax2.text(fc, -0.1, r'$f_c$', ha='center')
ax2.text(-fc, -0.1, r'$-f_c$', ha='center')
plt.ylim(-0.2, 1.2)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()
# Fig. 4.
import numpy as np
import matplotlib.pyplot as plt
# --- Parameters ---
B = 20      # Baseband signal bandwidth (Hz)
fc = 100    # Carrier frequency (Hz)
# Create the frequency axis
f = np.linspace(-150, 150, 2000)
# --- Create the Upconverted Signal Spectrum ---
# Based on the formula: Y(f) = 0.5 * [X(f - fc) + X(f + fc)]
# Create a baseband spectrum shape (Triangle) to be shifted
X_base_f = np.maximum(0, 1 - np.abs(f) / B)
X_f_shifted_right = np.maximum(0, 1 - np.abs(f - fc) / B)
X_f_shifted_left = np.maximum(0, 1 - np.abs(f + fc) / B)
# The final modulated spectrum is the sum of the shifted versions
Y_f = 0.5 * (X_f_shifted_left + X_f_shifted_right)
# --- Plotting ---
fig, ax = plt.subplots(1, 1, figsize=(12, 6))
fig.suptitle('Spectrum of a Double-Sideband (DSB) Modulated Signal', fontsize=16)
# --- Plot the Upconverted Signal Spectrum with Sideband Annotations ---
ax.plot(f, Y_f, 'r', linewidth=2, label='Modulated Spectrum $Y(f)$')
# --- Annotate sidebands on the POSITIVE frequency side ---
# Color the Lower Sideband (LSB)
lsb_pos_condition = (f >= fc - B) & (f < fc)
ax.fill_between(f, 0, Y_f, where=lsb_pos_condition, color='skyblue', alpha=0.7, label='Lower Sideband (LSB)')
# Color the Upper Sideband (USB)
usb_pos_condition = (f >= fc) & (f <= fc + B)
ax.fill_between(f, 0, Y_f, where=usb_pos_condition, color='lightgreen', alpha=0.7, label='Upper Sideband (USB)')
# Add text labels
ax.text(fc - B/2, 0.2, 'LSB', ha='center', fontsize=12)
ax.text(fc + B/2, 0.2, 'USB', ha='center', fontsize=12)
# --- Final Plot Formatting ---
ax.set_title('Signal After Modulation (Showing Sidebands)')
ax.set_xlabel('Frequency (Hz)')
ax.set_ylabel('Amplitude')
ax.grid(True)
ax.legend()
ax.text(fc, -0.1, r'$f_c$', ha='center')
ax.text(-fc, -0.1, r'$-f_c$', ha='center')
plt.ylim(-0.2, 0.7)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()
