📡 Radio From Scratch

Building an AM Broadcast Receiver

In this article we’ll use GNU Radio Companion (GRC) to process
an AM broadcast signal to extract the audio data within it. This will help you better understand how AM radio works.


AM Limitations with SDR

Most SDR devices, including the RTLSDR our team uses, cannot actually tune to the low frequencies required by AM Broadcast Radio. In order to work around this, we have generated a waveform that represents some song playing over AM radio. You’ll be able to build your AM demodulation pipeline and listen to the resulting audio. The same pipeline could have been used on a real AM broadcast, with the exception of the initial source.

Here is the combined signal. Save this file somewhere you can access it easily.

About the file signal

The provided file corresponds with AM signal sampled at 44.1 Khz. The samples are complex values, and it is the magnitude of this complex value that corresponds with the amplitude of the wave.

To use this within GRC, you’ll want to use a “File Source”. Drop it into your pipeline, then double click it to configure the path. Point it to the file you downloaded from above.

If you’d like to challenge yourself, you can stop here and revisit the amplitude modulation article and attempt to build your pipeline. The goal is to decode the signal and determine the song in the audio.

Keep reading to see instructions for building an AM demodulation pipeline.

Building the AM Demodulator

First, lets take a listen to our raw data. It won’t sound clear, but you might be able to make our some song in the data.

You’ll need a “Complex to Mag” block, in order to convert the complex value samples into floating point numbers to be used by the “audio sink” block. This also accomplishes the value of extracting the values along the top of the curve. With this, we’re actually nearly done.

You can inspect the wave with an FFT plot, and try listening to the new data. It may sound distored during various sections. This is because our complex valued data has magnitude greater than 1 in some parts, while the audio sink expects values from [-1 to 1].

Remember in the amplitude modulation article that the carrier wave is multiplied by (1+data magnitude). To get back the original data, we just now just need to subtract one. You can do this with the “add const” block.

Give that resulting signal a listen and you should be able to clearly hear the song. Your final pipeline should look like:

am receiver pipeline in GNU Radio

And to reassure you that a real AM broadcast really is this simple, you can use the built in “AM Demod” block in place of your “complex to mag” and “add const” blocks. You should still hear the same audio extracted from the modulated data.


Note that our generated “broadcast” recording is slightly idealized compared to what you might pick up with a real antenna. Our generated has no noise from interferring stations, and had a very strong signal to start with.

In practice, you would also need to amplify the signal, and perform some filtering to remove noise. However, this is true of most radio signals, and not limited to AM. We will cover this “signal conditioning” in a future article.

Like this post? Join our email newsletter to get notified when new content is available. ~1 email a week, and you can unsubscribe at any time.

If you found this useful, please consider sharing to help support the site.