Due: Sunday, June 7, 2026 at 11:59 PM via Gradescope

Throughout this lab and future ones, you may reference the tutorial on this page as needed.

Lab Objectives
  • Observe the effect of intersymbol interference (ISI) in a frequency-selective channel.
  • Implement multi-tap least-squares channel estimation.
  • Observe the impulse response of a frequency-selective channel.
  • Implement multi-tap least-squares channel equalization and compare the performance to a single-tap equalizer.


Introduction

In this lab, you will be extending your implementation in Lab 3 by adding multi-tap channel estimation and equalization.

In Lab 3, you implemented an end-to-end digital communication system using the SDRs, and in Lab 4, you addressed real-world synchronization constraints. This lab will investigate another characteristic of high-rate systems which can be detrimental if not accounted for: frequency selectivity.

In the previous labs, you performed narrowband, or single-tap, channel estimation and equalization. This works well at low symbol rates in a lab environment, but is often insufficient for real deployments. As discussed in class, there are multiple ways to account for frequency selectivity; in this lab, we consider a time-domain approach, with frequency-domain approaches to be examined in the (optional) Lab 6.

Since the focus of this lab is estimating and equalizing channels with strong multipath components, we have created such a setup on new loopback SDRs (listed as devices 9 and 10), which you should use for this lab’s experiments. You will be transmitting and receiving with either device 9 OR device 10, as these are loopback devices, not OTA devices. You are, of course, welcome to use the other devices for debugging as you see fit.

Like the others, in completing this lab, it is advised that you do as much development and testing without the SDRs as possible, synthesizing or capturing received signals for offline processing and debugging prior to running the entire pipeline online. As with all labs, you are permitted and encouraged to employ creative liberty in conducting this exercise, especially where you feel the provided instructions are not complete or exhaustive.

You will likely want to begin this lab by beginning with the Python script that you created for Lab 3, which should import your ece230b Python library via the following.

from ece230b import *

Put together a lab report with your results from this lab and attach your code. Provide any commentary and explanation where you see fit. Upload your lab report as a PDF to Gradescope.

It is recommended that you read through this entire set of instructions before getting started, so you know where things are going and do not have to refactor your code as much as you complete each step.

Part I: Preliminaries

Implement all the core components of Lab 3, so that you are transmitting pilots followed by M-QAM symbols using a root raised cosine pulse shape. For your pulse shape, use a rolloff factor of and make sure it has unit energy. Start by transmitting around 300 pilots and 5,000 16-QAM symbols; decrease this during initial development of your code, if you want. Your transmitted frame of symbols should look like this.

┌──────────┬────────────────────────┐
│  Pilots  │          Data          │
└──────────┴────────────────────────┘

Use the following parameters for your SDR:

  • A sampling rate of 1e6 (You will soon increase this to 60e6, the maximum supported by the SDRs).
  • A transmit gain of -15 dB. Feel free to bump this up to -10 dB if you feel you are being noise-limited.
  • A receive gain of 40 dB.
  • An RX buffer size of 500e3.
  • Set your TX buffer to be cyclic, as usual.

Use the following parameters for your signal:

  • An sps of 5.
  • A span of at least 8.
  • Modulation order M of 16 (i.e., 16-QAM).

Transmit your pulse-shaped waveform from the Pluto at a carrier frequency of your choice between 900–930 MHz using sdr.tx(). Fetch some receive samples using sdr.rx(). Then, pass your received signal through a matched filter, and perform single-tap channel estimation, single-tap channel equalization, and symbol detection, just as you did in Lab 3. Plot the real and imaginary components of each received symbol on the complex plane after single-tap equalization, and then overlay the originally transmitted symbols. Report your symbol-error rate (SER) in the title of your plot. At this symbol rate, the ISI effect of the channel should be minimal, so it should be possible to obtain a low SER just as you did in Lab 3.

Part II: Observing the effect of ISI

Increase your sampling rate to 60e6, and repeat the experiment in Part I. At this higher rate, the channel should introduce considerably more ISI. Just as before, plot the real and imaginary components of each received symbol on the complex plane after single-tap equalization, overlay the originally transmitted symbols, perform maximum likelihood symbol detection, and report your symbol-error rate (SER) in the title of your plot.

Repeat this with QPSK (M = 4), include the corresponding plot and SER, and describe the visual impact of ISI. It should look different than just AWGN. If you only see noise, feel free to increase your transmit gain slightly to see if you can observe the effect.

Part III: Channel Estimation

In Lab 3, you estimated a single complex value, representing the path gain of the channel. In this lab, you will extend this to a a discrete-time impulse response with L taps.

Implement least squares channel estimation, as discussed in class. Use a channel length of L = 10 (feel free to tune this as you see fit). As a hint, you will need to create a Toeplitz matrix using your pilot symbols, as discussed in class.

Plot the magnitude of the discrete-time channel impulse response obtained with your estimator. How many prominent multipath components do you see?

Part IV: Channel Equalization

Now that you have an estimate of your channel, you must perform equalization to mitigate ISI and successfully recover your symbols. Implement least squares channel equalization, as discussed in class. Start with an equalizer with at least 20 taps (feel free to tune this as you see fit). Iterate through multiple delays and choose the one that yields the cleanest effective channel, just discussed and shown in class.

Plot the absolute value of the effective channel impulse response obtained by your equalizer, which can be obtained by convolving your estimated channel with your equalizer. If everything has gone according to plan, you should expect to see a single delta, i.e., the effective channel becomes a single tap (frequency-flat).

Plot the real and imaginary components of each received symbol on the complex plane after multi-tap equalization, and then overlay the originally transmitted symbols. Perform maximum likelihood symbol detection and report your symbol-error rate (SER) in the title of your plot. Please do this with 16-QAM symbols, although it may be easier to use QPSK when you are debugging.