Random Quote Board

Making a "Soft" Tuner & Receiver in Gnu Radio

Gary Schafer, Janurary 2025

When you look the spectrum from one of your SDR programs, you may see several signals at the same time.

Screenshot of the program GQRX showing the spectrum around 91.9 MHz, within the FM broadcast band. The top of the image shows a spectral trace with five signals present, and half of a sixth on the higher frequency end of the trace. The spectrogram shows the same signals over several seconds. Along the left edge are several controls.
Screenshot of the program GQXR. The SDR, a RTL-SDR, is centered at 91.9 MHz with a 2.4 MHz span. There are five, complete signals visible in both the spectral trace (top) and spectrogram (bottom).

In the days of analog receivers, you could only demodulate and listen (or view) the signal at the center. And just one signal. To understand why that is, you have to understand the general flow for receiving a signal. Tuning to that signal is just the first step. The signal also has to be filtered (to remove all other signals and the ever-present noise), then demodulated (to extract the actual information from the RF signal). With analog systems, this was all done in hardware. You literally needed components, typically in the form of transistors, resistors, capacitors and inductors, for the tuning, filtering and demodulation.

Fast forward to today. Maybe you've used GQRX, shown above, or one of the other programs, such as SDR#, SDRconsole, HDSDR, SDR++, or CubicSDR, and seen a similar spectrum. With these programs, you were able to literally click on any of the signals you see in the spectrum and, VIOLA! You heard audio. Have you ever wondered how these various programs were able to do that? How were they able to demodulate a signal that wasn't centered?

Screenshot of the program SDRsharp. The program shows a spectral trace and spectrogram of a portion of the FM broadcast band. The software also shows that the demodulator is tuned to a signal that is not centered on the spectrum, but is shifted slightly higher in the spectrum.
Airspy SDR# screen capture showing how a signal that is not centered on the spectrum is still being demodulated. The actual SDR hardware, a RTL-SDR in this case, is centered at 90.9 MHz, while the software is tuned to 91.5 MHz.
Screenshot of the program HDSDR. The screenshot shows a spectrogram at the top, a spectral trace just below it, some controls in the lower, left, a demodulated spectogram in the lower, right, and a spectral trace just below the spectrogram. The screenshot also shows a software tuner tuned to a station near the upper frequency limit of the spectrum.
HDSDR program showing software tuning. The software is tuned to 91.9 MHz while the hardware is tuned to 90.9 MHz.
Screenshot of the freeware program SDR++. The screenshot shows a list of various controls along the left side, a spectral trace at the top, right, and a spectrogram taking up most of the screen just below the spectral trace. A software tuner is tuned near the lower frequency limit of the spectrum.
SDR++ showing the spectrum where the hardware is tuned to 91.9 MHz and the software is tuned to 90.9 MHz.
Screenshot of the program CubicSDR. The left edge of the screen shows a set of various controls, such as the gain, demodulation type and a list of saved frequencies. Along the top of the screen are a spectral trace of the station being demodulated with a spectrogram just below it, and a time-domain trace of the demodulated output of the station at the top right of the screen. The center of the screen shows a spectral trace of the entire captured spectrum with a spectogram just below it.
CubicSDR showing software tuning, again with the hardware tuned to 90.9 MHz and software tuned to 91.5 MHz.

The answer is software tuning. We use software to tune, filter and demodulate the signal. This means we're not hardware limited; we're only limited by what the software can do and the amount of processing available.

Why Do Software Tuning?

There are several reasons why we might want or need software tuning. Let's go through some of those reasons.

IQ Files

The first reason is based on the question, "What if we are playing back an IQ file? And the desired signal is not already centered?" If you have a file, you don't have a SDR to tune. You just have a file of samples. Much as a captured thermal image cannot change the "FORD" (focus, thermal range, distance), a collected IQ file cannot change the center frequency at which it was recorded nor the various settings of the SDR itself, such as the gain or filtered bandwidth. The only way in which you can tune in this way is with software tuning.

Networked Systems

This is similar to reading samples from an IQ file. But instead of the samples coming from a file, they come from the network. The software receivers cannot change the SDR hardware parameters, including the center frequency, so they have to use software to tune and process the samples.

Listen to Multiple Stations at Once

Another possibility is that you want to listen to two radio stations at one time, just as the singer Tom Waits does. If you didn't have two SDRs to run at the same time, then this, too, would require the use of a software tuner. This is demonstrated quite nicely by the Youtube channel "Ham Radio DX" in which he uses the software "SDRconsole" to receive multiple stations at the same time.

Avoiding the LO Feedthrough

Several SDRs, especially the less expensive ones, will have a spike at 0 Hz (DC). This is due (primarily) to the analog RF front end of these systems. The local oscillators and mixers together perform analog frequency tuning. The tuning process creates a large signal at DC, which then becomes part of the digitized spectrum. As complex signal processing is centered at DC, this could create problems for some signal processing. By offtuning from the signal being captured, the system can use software tuning to shift the signal back to DC for processing.

Spectral display of a HackRF SDR with nothing connected to the antenna. The display shows a spike at DC, which is due to the LO feedthrough.
This is a spectral display of a HackRF SDR without anything connected to the antenna. The large spike in the center is due to LO feedthrough.

Recover Baseband Subchannels

Many analog signals have subchannels, typically called "subcarriers", on them. For example, FM broadcast stations carry stereo, RDS and sometimes SCA signals. NOAA APT signals use a subcarrier to convey the video information. These, too, can use a software tuner to recover this information.

Spectral display showing the baseband composite signals from a FM broadcast station. This display shows the left and right channels combined from 0 - 15 kHz, a pilot tone at 19 kHz, and RBDS signal at 57 kHz, and a narrowband FM audio signal at 67 kHz.
Baseband spectrum of a FM broadcast station. This is a typical station transmitting stereo audio. The spectrum from 0 - 15 kHz is both left (L) and right (R) channels combined. At 19 kHz, there is a pilot tone. This tone serves multiple purposes. First, its appearance tells your radio that it is receiving a stereo signal. Its second purpose is to demodulate the "L-R Audio", also called the "stereo signal", at 38 kHz (second harmonic) followed by the "RBDS" signal at 57 kHz (third harmonic). The last signal is a "SCA" or "Subsidiary Communications Authority". It's purpose is typically to provide a secondary audio signal.

We'll go through a couple of different methods to make software tuners using Gnu Radio Companion.

How Frequency Conversion Works

The gist is this. When you multiply (mix) a sinewave with another signal, the frequency of that signal is shifted by the frequency of the sinewave.

There are already a lot of different websites, especially Youtube videos, explaining how frequency conversion works. The gist is this. When you multiply (mix) a sinewave with another signal, the frequency of that signal is shifted by the frequency of the sinewave. In other words, the frequency of the sinewave is added to the frequency of the signal. This is where some confusion may occur. I said "frequencies add". But there's also a difference frequency, meaning that the sinewave's frequency is also subtracted from the signal frequency. Why is that?

All signals have both a negative and positive frequency component. Real signals (as opposed to complex signals) always have both a negative and positive frequency component. Certain complex signals, specifically analytic signals, have only a negative or positive frequency component. If we look at the double-sided spectrum of a sinusoid and a signal, we'll see both negative and positive components.

Gnu Radio Companion block diagram showing a block connecting a WAV file to a block that will upsample to 2 MHz. This is followed by a block that frequency modulates the WAV file, followed by a multiply block that will mix the FM signal with a sinusoid so that it is centered at 500 kHz. This 500 kHz signal is converted from complex to real, then input to a spectral display block. Also input to a second input on the spectral display block is a sinewave running at 200 kHz.
Gnu Radio Companion flowgraph creating a FM audio signal centered at 500 kHz and a sinewave at 200 kHz. As both are real signals (the FM signal starts as a complex, is frequency shifted, then converted to real), the final double-sided spectrum shows the positive and negative frequencies of both signals.
Spectral display showing a double-sided spectrum. Four signals are present, a FM signal at +/-500 kHz and a sinewave at +/-200 kHz. Annotation at the top states that the left half of the spectrum is negative frequency, while the right half is positive frequency.
Spectral display showing the double-sided spectrum of a real FM audio signal (at 500 kHz) and a real sinewave (at 200 kHz). Note that there are both positive and negative frequency components of each.
Block diagram of the Gnu Radio flowgraph that multiplies a FM audio signal at 500 kHz with a 200 kHz sinewave.
Gnu Radio Companion flowgraph similar to the previous one, but with the exception that the FM audio signal and sinusoid are mixed (multiplied) together at the end. The final frequency sink (spectral display) will show the double-sided spectrum.
Double-sided spectrum of frequency-shifted FM audio signal. The original signal, which was real (vs complex), was multiplied (mixed) with a real sinusoid. Therefore, it has both a positive and negative frequency shift.
Double-sided spectrum of the frequency-shifted FM audio signal. The original signal was at 500 kHz. The sinusoid was at 200 kHz. By adding the frequencies (positive and negative) of the FM signal to both frequencies (positive and negative) of the sinusoid, you wind up with signals at the sums of each of these four components (-700 kHz, -300 kHz, +300 kHz, +700 kHz).

This is one of the key concepts for receiver operation. It's called heterodyning. The definition of "heterodyning" is to mix two signals together in a nonlinear device. I prefer to think of heterodyning as "mix two signals together". And by mixing, we're talking "multiply". Which works perfectly for digital signals. The two signals that are mixed are typically a modulated signal at some radio frequency (RF), while the other is a sinusoid called a "local oscillator" or "LO". The output will be the RF signal shifted by the frequency of the LO. You effectively shift the frequency of the signal by the frequency of the sinusoid. Combined with this concept is the concept of superheterodyning. Superheterodyning, or "superhet" for short, means to shift the frequency of a signal to a fixed, intermediate frequency or "IF". The purpose for shifting to this fixed frequency is so that all of the follow-on processing, such as filtering and demodulation, can be designed for one frequency. This makes designing and building such circuits much easier.

The Limits of Software Tuning

Software tuning will only work on signals within +/-1/2 of the sample rate of the SDR.

Software tuning has one limitation. It only works on those signals within the instantaneous bandwidth of the SDR. In other words, it will only work on signals within +/-1/2 of the sample rate of the SDR.

Using Complex Sinusoids

But now we can add something that is difficult to do in the analog world. We can use complex sinusoids. Such a signal can have only a positive component (an analytical signal) or only a negative component (whatever that is called). With Gnu Radio, there are several ways we can create such signals. The simplest is using a Signal Source block with the "Output Type" set to "complex" and the "Waveform" set to either "Cosine" (the default) or "Sine".

Gnu Radio Companion block diagram showing a complex signal source block connected to a throttle, then to a frequency sink spectral display.
GRC flowgraph of a basic Signal Source outputting a complex sinusoid and input to a frequency sink (spectral display). The signal source is set to a positive frequency, so the spectral display should only show a spectral line at that frequency.
Spectral display of a complex sinusoid. The signal only shows a single spectral line.
Spectral display of the complex sinusoid. The signal source is set to +100 kHz, and the spectral display only shows a single spectral line at that frequency.

We can also create such sinusoids in one of two ways. The first way is to create a real cosine and a real sine and use them as the real and imaginary components of a complex sinusoid, respectively. The second way is to create a real sinusoid, then filter out the negative frequency component using the Hilbert transform.

Screenshot of a block diagram showing two sinewave generators, a cosine and a sine. Descriptive text below each block explains that the cosine is the real part of a complex sinusoid, while the sine is the imaginary part of a complex sinusoid. They both feed into a block that converts the two real signals into a single complex signal. This block multiplies the imaginary part by the imaginary operator, j. This block feeds into a spectral display.
GRC flowgraph showing how two sinusoids, a cosinewave and a sinewave, can be combined mathematically to create a single complex sinusoid. The sinewave is multiplied by the imaginary operator, j (or "i" if you're a mathematician). The frequency display will show that this complex sinusoid only has power at one frequency.
Spectral display of a complex sinusoid. It shows a spectral line at only one frequency.
Spectral display of a complex sinusoid. The sample rate is 1 MHz, and the sinusoid is at 100 kHz. Since it is an analytic signal, it only has a frequency at a positive frequency.
Screenshot of a block diagram for a Hilbert transform of a sinusoid. The first block creates a vector of an impulse (a bunch of zeros with one positive value) that is fed into the Hilbert transform block. The output of the transform feeds into a spectral display.
GRC flowgraph to create an impulse response for a Hilbert transform. The first block is a vector source that is a vector of 0s, but with a single, positive value in the center. That is fed into the Hilbert transform, which is really nothing more than a complex filter. This feeds into a frequency sink (spectral display) to show the spectrum of the impulse response.
Spectral display showing the impulse response of the Hilbert transform. For these particular values, the entire negative frequency portion of the spectrum has been filtered out, while the positive frequency portion is unaffected.
Spectral display of the impulse response of the Hilbert transform. Note that (almost) the entire negative frequency portion of the spectrum has been filtered out, while the positive frequency portion is unaffected. The Hilbert transform is really nothing more than a complex filter, and it is affected by the number of taps (just as with any filter) and the window type (Blackman-harris, in this case).
Gnu Radio Companion block diagram showing a block that generates a real sinusoid going into a Hilbert transform. The output goes through a throttle block then into a spectral display (frequency sink).
GRC flowgraph of a real sinusoid (the Signal Source block) passing through the Hilbert transform block. This removes the negative frequency component and makes it an analytical signal. The Frequency Sink block creates a spectral display showing that the sinusoid only has power at one frequency (as opposed to two components for a real signal).
Spectral display of complex sinusoid created using the Hilbert transform. The display only shows a component at the positive frequency; the negative frequency is empty.
Spectral display from the Frequency Sink of the sinusoid after passing through the Hilbert transform. This display only shows a component at one frequency.

The Complex Frequency Shift

Regardless of how the single-sided sinusoid is created, it's useful for one thing in particular. It can be used to shift the frequency of a complex signal by simply multiplying the signal with the complex sinusoid. It is the most straightforward method for software tuning in Gnu Radio Companion. Just combine a Multiply block with a Signal Source block, with both blocks set for "complex" samples. This is a straightforward frequency shifter. This is what we discussed in the previous section.

Gnu Radio Companion flowgraph showing a File Source block going into a Throttle block. The output of the Throttle block goes into a Multiply block. A Signal Source block feeds the second input of the Multiply block. The output of the Multiply block goes into a Frequency Sink block.
Gnu Radio Companion showing a complex frequency shifter. The shifter consists of a "Multiply" block (the mixer) and a "Signal Source" block (the local oscillator). The Signal Source block is using complex samples, and the output will be a complex sinusoid. By multiplying the incoming signal with the complex sinusoid, the entire input spectrum can be shifted higher or lower in frequency.
Spectral display of a portion of the FM broadcast band. Several signals are present, with a roll-off at the ends due to filtering.
Spectral display showing a portion of the FM broadcast band. This is from a IQ file captured using a RTL-SDR. A broad filter was added to remove any "Atari effect" from the ends of the spectrum. This is how the spectrum appears with no shift.
Spectral display showing a portion of the FM broadcast band. The ends of the original spectrum were filtered, showing a steep rolloff. This spectrum has been shifted to the right, so that the rolled-off ends are now near the center of the spectrum. There are still five signals visible in this spectrum.
Spectral display of the same spectrum as previously, except that it has been shifted by +900 kHz. The general rule-of-thumb is that a positive frequency will shift the spectrum to the right, while a negative shift will shift it to the left.

And that is how software tuning is performed, typically. Multiply by a complex sinusoid to shift the desired signal higher or lower in frequency until it is centered, then perform the processing.

An Example

This is a basic receiver for the United States NOAA Weather Radio system. It uses a RTL-SDR, but the SDR is set to a fixed frequency. The "tuning" is all done in software. With the SDR set to the center channel (162.475 MHz) and the channel spacing of 25 kHz, the system only needs ~170 kHz of bandwidth to cover all of the channels (to include the bandwidth of the end channels due to modulation). However, I've set the RTL-SDR sample rate to 1.2 MHz. The reason is that, based on my experience, the lower sample rates (225 kHz - 300 kHz) don't tend to work as well as the higher ones. This could just be the quantization noise, or something else. Regardless, I've set the sample rate to 1.2 MHz initially, then filtered and decimated afterwards. I've used a lowpass filter set to a bandwidth of 100 kHz to provide the spectrum for tuning. Further, I've used a relatively high transition width in order to keep the amount of required processing down. The "Signal Source" block provides the complex sinusoid to tune in the desired signal. The rest is the standard processing (filtering, demodulation, sample rate adjustment, audio output). I used a "QT GUI Chooser" block to select one of the seven available channels. The QT GUI Chooser selects a frequency offset (+/-75 kHz in 25 kHz steps), which controls the Signal Source block.

Gnu Radio Companion block diagram showing a block for a RTL-SDR going into blocks for filtering, frequency conversion, demodulation, resampling, and an audio output. Four blocks spread horizontally across the top of the block diagram set the sample rate, general options, the channel frequency, and display the tuned frequency.
Gnu Radio Companion flowgraph for using software tuning to listen to NOAA Weather Radio (NWR). The RTL-SDR is fixed at the center frequency of the seven available channels (162.475 MHz). The first lowpass filter after the RTL-SDR block removes everything above and below the seven NWR channels. The Multiply block combined with the Signal Source block provide the complex frequency conversion to allow the tuning of the seven channels. The second lowpass filter removes everything except for the desired channel, which is followed by the Quadrature Demod block (actually a polar discriminator) for demodulation, resampling to one of the available audio sample rates, then the audio sink for output to the speakers or headphones.
Box containing the options for a Gnu Radio Companion Signal Source. Several lines of windows show options for the type of samples (set to &quote;complex&quote;), sample rate, waveform type (set to &quote;Cosine&quote;), and frequency (set to the math function &quote;channel*1000&quote;). Follow-on lines set the amplitude, offset and initial phase.
GRC Options window for the "Signal Source" block. The frequency is set by the variable provided by the QT GUI Chooser block, which is the frequency adjustment from the center, in kHz. Since it is in kHz and the Signal Source frequency must be in Hz, the value is multiplied by 1000.
Box containing the options for the Gnu Radio Companion QT GUI Chooser. Several option windows show parameters such as the label, the sample type, the number of options, the options list, the labels list and the default option.
GRC Options window for the "QT GUI Chooser" block. The maximum number of options using the dropdown list is 5, so the "Num Option" has been set to "List". This allows for lists with more than 5 options. The "Options" list provides the actual numbers used to set the frequency. The "Labels" list provides the user-readable options to select the appropriate value in the "Options" list. Note that both the "Options" and "Labels" list must have the same number of entries.
Spectral display showing a relatively low noise floor that is sloped at each end, but offset towards the left end. The spectum has several signals present, with a large signal on the left end of the noise floor centered on the spectrum.
Spectrum of the NOAA Weather Radio (NWR) signals. The lowest frequency signal, 162.4 MHz, is centered on the spectrum. This is the one that will be heard from the speakers.
Spectral display showing a relatively low noise floor that is sloped at each end, but offset towards the left end. The spectum has several signals present, with a large signal on the left end of the noise floor centered on the spectrum.
Spectrum of the NOAA Weather Radio (NWR) signals. One of the center frequency signals, centered at 162.5 MHz, is centered on the spectrum. This is the one that will be heard from the speakers.

Other Software Receivers

The Bandpass Filter with Complex Taps

Here's another method for creating a software receiver that doesn't really "tune". By "tune", I mean to perform frequency conversion. Instead, it uses complex filter taps to create a bandpass filter. Instead of shifting the signal to the filter, this shifts the filter to the signal.

A bandpass filter that uses complex taps can operate on signals either just positive or negative in frequency. A bandpass filter that uses real taps must work equally on the positive and negative frequencies. The use of a complex tap bandpass filter means that all but one signal can be filtered out. Further, because it is an FM signal, we can frequency demodulate the signal with a polar discriminator (the improperly-named "Quadrature Demod" block), except it will have a large DC offset. The DC offset can be calculated, then removed with a "Add Const" block. While this is an interesting, in my opinion, this requires more processing than the complex frequency shift flowgraph from above. This particular flowgraph is not much more processing than the one using the complex frequency shift. Based on the use of a "Null Source" block to replace the RTL-SDR, and a "Probe Rate" and "Message Debug" block to replace the "Audio Sink", the complex frequency shift provided a maximum of 10.0 MSps, while this flowgraph provided 9.5 MSps.

Gnu Radio Companion block diagram. This shows a block controlling a RTL-SDR, followed by two filter blocks, a demodulator block, and blocks to process the samples for the system speakers or headphones.
GRC flowgraph for a NOAA Weather Radio receiver that uses a bandpass filter processing complex taps. The first filter removes all but the NOAA signals. The second filter passes only the desired signal. The Quadrature Demodulator demodulates the signal which, due to the frequency offset, has a large DC offset. The "Add Const" block removes the DC offset. The "Rational Resampler" changes the sample rate to that which the "Audio Sink" can handle.
Spectral display showing several signals, with a strong signal on the left highlighted in red.
Spectral display of the output of the complex bandpass filter system. The black shows the full spectrum; the red shows the filtered spectrum after passing through the complex bandpass filter. A benefit of this flowgraph is that it clearly shows which signal is being demodulated.
Spectral display showing several signals, with a signal near the center highlighted in red.
Spectral display of the output of the complex bandpass filter. The highlighted red signal has been changed, but the full spectrum has not shifted. This shows how the filter will shift, but not the spectrum, in order to process the desired signal.

Software Tuning with the Polyphase Channelizer

Here's yet another software tuner. The difference of this one is that it doesn't process just one signal; if done properly, it does them all. For this example, I've tuned a RTL-SDR to a portion of the FM broadcast band. This flowgraph makes use of the "Polyphase Channelizer" block. This makes use of a polyphase filter bank that both filters and frequency shifts the signal down to 0 Hz. Which means that every signal within the instantaneous bandwidth of the RTL-SDR can be filtered, frequency shifted, and output. The only question is "Now what?" Sure, you can demodulate and further process one station (or, again, two if you're Tom Waits), but what about the rest? One possibility is that each channel is output to a network, where other systems can process each station. Or record each station. Or record the information contained in the broadcast.

One part that must be understood in order for this to work is that the sample rate must be the channel spacing (200 kHz, in this example) multiplied by the number of channels (12). That is why the overall sample rate is set to 2.4 MHz. This could also work with other sample rates, so long as the sample rate is an integer multiple of the channel spacing.

Gnu Radio Companion block diagram showing blocks needed to create a polyphase channelizer for a portion of the FM broadcast band. A block on the left controls a RTL-SDR, which is followed by the polyphase channelizer block, then a 12 port selector block to select one of 12 stations. After the selector block, one station is selected for demodulation and audio output.
GRC flowgraph that shows how a "Polyphase Channelizer" can be used to simultaneously filter out every FM broadcast station within a 2.4 MHz instantaneous bandwidth. For this to work, the sample rate (2.4 MHz, in this example) divided by the number of channels (12) must divide to the bandwidth between channels (200 kHz). Otherwise, it doesn't work.
Spectral displays for the full instantaneous bandwidth of the RTL-SDR and the output of the selected channel. They are stacked one on top of the other. There's a small dropdown arrow along the top to select the desired channel. The full spectrum shows several, available analog FM broadcast signals.
Spectral displays of the full instantaneous bandwidth (top) along with the spectrum of the selected channel (bottom). The top dropdown arrow allows for the selection of the desired channel.

Software Tuning Baseband Signals

This is something I've already covered in several posts, most recently with my post on the best RDS demodulator and decoder circuit. Those flowgraphs show a complex frequency shift for the baseband spectrum in order to tune to the 57 kHz RDS / RBDS signal.

Gnu Radio Companion block diagram of a FM broadcast demodulator and Radio Data System demodulator and decoder. The block diagram is complicated, with many blocks for filtering, frequency shifting, demodulating and decoding the signal.
GRC flowgraph for a RDS decoder. The "Multiply" block along with the "Signal Source" block create a complex frequency shift circuit. By converting the real samples at the output of the first frequency demodulator (the Quadrature Demod block) to complex samples, the circuit will shift the RDS signal so that it is centered around 0 Hz. All of the blocks after that are for sychronizing with the digital symbols, demodulation and decoding of the digital data.

If we were to put a "Frequency Sink" block both before and after the "Multiply" block, we would see the spectrum first unshifted (before) and shifted down by 57 kHz (after).

Spectral display of the demodulated output of a FM broadcast station. This spectral display shows all of the signals modulated onto a typical FM broadcast station. The spectrum also shows the mirror image (negative frequencies), and is centered on the 0 Hz.
Spectral display of the double-sided spectrum of a typical FM broadcast station. This shows the L+R audio signal stretching from -15 kHz to +15 kHz, the pilot tone at +/-19 kHz, the stereo signal from 23 kHz - 53 kHz, the RDS signal at 57 kHz, and a SCA at 67 kHz.
Spectral display of the demodulated output of a FM broadcast station that has been shifted down in frequency by 57 kHz. This spectral display shows all of the signals modulated onto a typical FM broadcast station. The spectrum also shows the mirror image (negative frequencies), and is centered on the 57 kHz RDS signal.
Spectral display of the double-sided spectrum of a typical FM broadcast station, except now it is shifted down in frequency by 57 kHz. The spectrum is now centered on the +57 kHz RDS signal.

Summary

This hopefully gives you an idea of the many different options for performing software tuning. There are several possible options for each of these, along with things I didn't have time to cover. For example, one thing I didn't cover was the use of a "Vector Source" block to replace the "Signal Source" block. This is possible when it's possible to calculate the values of the complex sinusoids beforehand. This will save on the processing required as the "Signal Source" block calculates its values on-the-fly. If they can be calculated before the flowgraph runs, this saves on the processing.

Til next time!

Here's a Random Fact...