Introduction to Upconversion, Downconversion, and Modulation (Signals and Systems Review Part5)

This image is generated by Gemini 2.5 Pro

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. The Fourier transform can be converted to two δ functions

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. The inverse Fourier transform of δ function becomes an exponential term

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.

Fig. 1. The cosine wave in time and frequency domain

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):

Equ. 3. Using δ(f-f_c) and X(f) to change the frequency band

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:

Equ. 4. Y(f) calculation

The result is that in both the positive and negative side of frequency spectrum there exists baseband signal, with half of the original amplitude.

Fig. 2. Multiplication of baseband signal and carrier wave in time domain

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:

Fig. 3. A DSB modulator (Transmitter)

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.

Fig. 4. Double-sideband spectrum

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.)

Equ. 5. Complex conjugate

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:

Fig. 5. Passing DSB signal through a HPF

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:

Fig. 6. Architecture of a single-sideband modulation

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:

Equ. 6. Output of a SSB signal

To illustrate how one sideband is eliminated, let’s use a cos(2πf_mt) as input signal as an example

Equ. 7. Signals generated in two paths

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

Equ. 8. The output signal of DSB architecture

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).

Fig. 7. DSB demodulator (Receiver) architecture

Here’s the demodulation process

Equ. 9. Demodulation of DSB

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:

Equ. 10. Demodulation of SSB

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.

Fig. 8. IQ modulator (transmitter) architecture

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:

Equ. 11. IQ Modulation

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

Fig. 9. IQ demodulator (Receiver) architecture

Let’s calculate these two path, starting from the upper one

Equ. 12. Upper path

Equ. 12. utilized the conversion of sine square and 2sinθcosθ. Similarly, for the lower path

Equ. 13. 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

Equ. 14. The conjugate of a real-valued signal is still a real-valued signal

To prove

Equ. 15. The conjugate symmetry of real-valued signal
Equ. 16. The proof
#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()

Learn more about Introduction to Upconversion, Downconversion, and Modulation (Signals and Systems Review Part5)

Leave a Reply