L7 Lab — AM and FM Receivers#

ECE 448 · Spring 2027

AM and FM Receivers

Receive a live FM broadcast and decode its RDS data.

L7 Lab · Module 3: Analog Modulation · Dr. Neil Rogers

Learning Objectives

  1. I can implement an FM receiver in GNU Radio, demodulate a live broadcast FM signal, and decode its RDS data.
  2. I can explain and demonstrate the trade-off between bandwidth and noise performance for AM vs. FM.

From Lesson to Bench

  • Pre-Lab: work out receiver settings for a capture, your receiver, and ATIS.

  • Bench: build the WBFM receiver; receive your L5 capture, live FM with RDS, and ATIS; turn up the noise.

  • Writeup: explain what you saw and heard.

Lesson 7 ran every receiver on simulated test files. Today you build the WBFM receiver yourself, then run the receivers on your own L5 capture and on the air. The lab packet has three parts, and you turn it in once, complete, before Lesson 8. Part 1, the Pre-Lab, is on your own before the period: the receiver settings for an example capture and your own, the rates and gain of the receiver you build, and a local ATIS. Part 2 is your own measurements and observations in class. Part 3, the Writeup, explains them.

Bring your PlutoSDR, its antenna, your fm_capture.cfile from the L5 Lab, and headphones.

Part 1: Before the Period

  • Work out the shifts, rates, and Quadrature Demod gain for your build.

  • Plan a local ATIS receiver.

  • Set up the files before class.

Do the Pre-Lab before you arrive. Question 1 asks for the shift for two captures, the rates and Quadrature Demod gain of the receiver you build at the bench, which decimates differently from the lesson’s, and the AM receiver’s settings for a local ATIS.

The setup also takes a few minutes, and some of it needs a network connection, which the lab room may not have. Put the six flowgraphs from the Lesson 7 page in one folder with fm_capture.cfile. Open L07-rds-rx.grc first and check that GRC reports no missing blocks: gr-rds comes with radioconda; if GRC reports the RDS blocks missing, run mamba install gnuradio-rds from the radioconda prompt. Then run L07-fm-test-tx.grc, which also uses an RDS block, and L07-am-test-tx.grc once each; they record the two test files as SigMF, 76.8 MB of samples each, into that folder and stop on their own. For Question 1(c), the FAA Chart Supplement and every sectional chart list an airport’s ATIS frequency.

Part 2: Build the WBFM Receiver

  1. Start GRC and choose File, New, QT GUI. Do not open L07-wbfm-rx.grc; build it yourself.

  2. Set samp_rate to 2.4e6. Add QT GUI Entries fc_mhz (100.0) and station_mhz (100.3), and a QT GUI Range vol from 0 to 1.

  3. Add a File Source on L07-fm-test.sigmf-data with Repeat on.

  4. Add a Low-pass Filter Taps variable chan_taps: cutoff 105 kHz, transition 30 kHz, at samp_rate. Use it in a Frequency Xlating FIR Filter with decimation 5 and center frequency (station_mhz - fc_mhz) * 1e6.

  5. Add a Quadrature Demod with the gain from Question 1(b).

  6. Add a Decimating FIR Filter, decimation 10, with taps firdes.low_pass(1, samp_rate/5, 15e3, 3e3).

  7. Finish with FM Deemphasis at 48 kHz and 75 μs, a Multiply Const vol, and an Audio Sink at 48 kHz, with a float QT GUI Frequency Sink on the de-emphasis output. Do not add a Throttle.

  8. Screenshot the canvas for Question 2(a). Run it with the volume low, and read the audio sink for Question 2(b).

  9. Type 99.5 into Station, listen, and answer Question 2(c).

Part 2: Your Capture

  1. Stop your receiver. Set the File Source’s file to fm_capture.cfile.

  2. Run it, type the center frequency you recorded at into SDR center, and set Station to the station you centered.

  3. Add a float QT GUI Frequency Sink on the Quadrature Demod output at samp_rate/5. Screenshot the demodulated multiplex and mark its parts for Question 3(a). Describe the audio for Question 3(b).

Part 2: Live FM and RDS

  1. Connect the antenna to the PlutoSDR’s RX port. Run L05-fm-spectrum.grc, find a strong station between 88 and 108 MHz, and stop it; only one flowgraph can stream from the Pluto at a time.

  2. Open L07-wbfm-rx.grc. Disable the File Source, enable the PlutoSDR Source, and run it with SDR center about 300 kHz below the station and Station set to it. Listen, and record the frequency, the call sign the station announces (or the FCC lists for it), and whether the 19 kHz pilot shows on the multiplex sink, for Question 4(a). Stop it.

  3. Open L07-rds-rx.grc. Right-click the File Source and choose Disable; right-click the PlutoSDR Source and choose Enable.

  4. Run it. Type an SDR center about 300 kHz below the station you found, set Station to its frequency, and set RF gain from your L5 gain table.

  5. Wait for the station name and compare it with the call sign. Fill in the rest of the table for Question 4(b); the panel shows the PI code under “Program Type” and the program type under “PI”.

  6. Screenshot the constellation and the panel for Question 4(c).

  7. Stop and restart the flowgraph three times, and time how long the name takes to appear, for Question 4(d).

Part 2: ATIS

  1. Open L07-am-rx.grc and run it on L07-am-test.sigmf-data. The audio is the L6 two-tone message.

  2. Stop it. Disable the File Source, enable the PlutoSDR Source, and run it again.

  3. Enter the SDR center and Station from Question 1(c), and set RF gain to 50 dB to start.

  4. Screenshot the receiver and record the information letter and the altimeter setting for Question 5(a).

  5. Lower RF gain until the voice is hard to understand, and describe it for Question 5(b).

Part 2: AM and FM in the Same Noise

  1. Open and run L07-am-vs-fm.grc. It needs no hardware.

  2. Set FM deviation to 25 kHz and Input SNR to 30 dB. Record both output SNR meters for Question 6(a).

  3. Choose FM under Listen To. Turn the noise up: lower Input SNR slowly until you first hear clicks, and record the slider value. Keep going to 10 dB and describe what you hear for Question 6(b).

  4. Repeat step 3 at 5 kHz and at 50 kHz deviation, and record the FM meter at 30 dB for each.

No Signal?

If the station name, the ATIS, or the PlutoSDR does not work

  • No station name: check that Station matches the frequency you heard the station on. Otherwise choose a stronger station, or raise RF gain until the RDS constellation shows two clusters. RDS needs more signal than the audio does.

  • No ATIS: aircraft band stations need line of sight. If it plays but sounds muffled, the Pluto’s frequency may be a few kilohertz off; nudge Station by 1 to 3 kHz. Try a window, a higher floor, or the airport’s other frequency, and say in the packet what you tried. If none works, answer Question 5 from the test file and say so.

  • No PlutoSDR: pair with a classmate whose PlutoSDR works for Questions 4 and 5, take turns at their laptop, and record your own numbers. Questions 2, 3, and 6 need no hardware.

  • Audio error: an Audio Sink that cannot open your sound card stops the flowgraph. Plug in your headphones and run it again, as in the L6 Lab.

Part 3: After the Lab

  • Explain why a mono receiver plays a stereo station correctly.

  • Describe what a wider FM deviation buys and what it costs.

  • Explain why aircraft use AM and broadcasters use wideband FM.

The Writeup is three questions. The first uses your multiplex screenshot to explain why a mono receiver plays a stereo station correctly. The second uses your Question 6 table to say, in words, what a wider FM deviation buys and what it costs. The third connects your ATIS and FM listening to the reasons each service chose its modulation.

Looking Ahead

  • Lesson 8 sends bits as FSK: FM with a two-valued message.

  • Keep your WBFM receiver; its Quadrature Demod reappears in the FSK receiver.

Keep your receivers. Lesson 8 moves to digital modulation, starting with frequency-shift keying, which switches the carrier between two frequencies. Its receiver uses the same Quadrature Demod you used today, after a channel filter, and follows it with a decision on each bit instead of a speaker.