Decoding SCA with your SDR

This is one I’m excited about; it was the one thing I knew I could do with SDR, but was disappointed when there was no direct way of doing it.

I’m talking about decoding the SCA (subsidary communications authority) subcarrier contained in some FM transmissions. Historically, it was used by Muzak to provide music to it’s subscribers; as well as audio return for remote broadcasts, telemetry data from the transmitter, reading services for the blind; and just about anything else. After 1983, the FCC deregulated these and they became available for just about any use a station owner could come up with.

SCA2Now, it’s not that difficult to pick these things up; you just need a radio capable of doing it. None were ever sold on the general market to general consumers, ever. Most built were a special purpose; they often were fixed to a frequency and a specific SCA carrier frequency. Hobbyists could build them if they wanted; and there are many plans online. But, I knew there was a way to do it with SDR.

The topic had been discussed before; and there were a couple ways of doing it. One suggestion was to send your demodulated baseband signal (the 100khz demodulated FM signal) in to MATLab; and I saw a video doing it. But MATLab is complicated. The other solution talked about using one copy of SDR#, set to NFM mode with 150khz bandwidth; to send the demodulated baseband in to a second copy of SDR#, then tell it to use the sound card input; from there you could tune the SCA on 67khz. But there was a problem with this; SDR# no longer allows you to use 150khz for NFM mode; and WFM mode filters the audio so it’s no longer baseband.

But let me explain exactly what’s going on here and what I mean by FM baseband. FM baseband essentially means a demodulated FM signal; and not in the same way we get stereo. FM stations in the US are 200khz apart; and are able to transmit within 100khz of bandwidth. This allows them to carry more information since they only use the first 15khz of this for audio. Stereo is the result of this; the audio is converted in to a mid/side (sum/difference) matrix; the sum is used as the main audio program, the difference is modulated in to a double-side-band supressed-carrier signal and inserted 38khz in to the baseband; along with a 19khz pilot tone/carrier. Further up at 57khz; you have the RDS data, which is also a DSB-SC signal. When you tune to the signal; the 100khz wide FM signal is demodulated in to it’s baseband; which contains analog audio for the first 15khz; and the rest of your carriers. I know it sounds crazy to think about carriers and signals inside an audio signal; but it is entirely possible. In fact; you can generate a Stereo MPX signal with RDS using a program called StereoTool and a 192khz sound card. StereoTool generates the matrix, pilot, does all the required processing; then gerates a 192khz audio-stream that contains the main audio and the DSB-SC signals. You feed that in to a Mr Microphone and you’ve got stereo!

So, how can you do it? Well, I’ll go over how I did it and what I used; if you have other ideas, I’d be happy to play with them and add them to this list. So, let’s go over the software you’ll need:

  • HDSDR (not really needed anymore; you just need the FM MPX plugin)
  • VB Audio Cable HiFi or Virtual Audio Cable (not regular VB Audio Cable)
  • SDR#

As I said, we’ll need to be able to get the baseband audio/signal from the FM station; and SDR# will not work for this (Update: SDR# will work for this; I just haven’t been able to get it on my machine. See end of article). It only gives you a wide enough IF in WFM mode; and it’s WFM mode is specifically set up for listening to FM broadcasts; it will filter the audio down to a 16khz audio signal. SDR-Console may work; but the license expired and I’m not going to go through the hassle of updating it just because a developer wants to control his software to some tight degree.

VB Audio Cable is well known program that mimics functionality we *used* to have before, for some reason, it stopped working (Stereo Mix). It’s a great free alternative to Virtual Audio Cable, but it has a major issue; it does not support 192khz sampling rate. Due to the fact we’re looking for a 67khz signal; we cannot get by with a 96khz sampling rate; which will get you up to 48khz. Unless VB Audio Cable adds 192khz at some point; I’m not entirely sure if there’s a way around this.  VB Audio Cable HiFi is a separate product from VB Audio Cable; same donationware but supports up to 24-bit/384khz.

SDR# just happens to be my SDR program of choice; so I use it to actually receive the SCA carrier.

In HDSDR, you’ll want to set the bandwidth to 192000 and set your Virtual Audio Cable as the audio output. Clicking on the FM button; you should then be able to adjust the bandwidth to 192000; you need at least 150khz, but it won’t hurt to use 192000. Once you have the bandwidths set, tune around your FM stations; it helps if you know which stations have SCA to begin with. You can identify them easily in the HDSDR IF waterfall; not all FM stations have them though however, so just look for what looks like a second FM signal within the  IF up near 70khz. You’ll see what I’m talking about in the pictures below (click to make it full size).



(FM Spectrum: 1. 19khz pilot tone – 2. 38khz MPX difference – 3. RDS – 4. 67khz SCA)



HDSDR & SDR# playing back a 67khz FM SCA

Now that you’ve found a station with an SCA carrier; boot up your second copy of SDR# and place it in to “Other (sound card)” mode. Make sure you put the rate at 192000 (as well, make sure both recording and playback devices for virtual audio cable are set to 192khz in device properties; as well as in the virtual audio cable control panel. Press play to start SDR and you will now see the FM baseband in the waterfall; with the signals mirrored at “DC”. If you select USB (or LSB) mode with the frequency set to dead 0, you will hear the main audio of the FM station. All you need to do is pick NFM mode in SDR# and tune to the SCA carrer, which should be at 67khz (or 92khz). If your station is not broadcasting stereo; it may have SCA carriers in other locations; but usually you have a DSB-SC signal centered at 38khz for MPX. It’s a wide signal that will look like a typical AM broadcast, without a carrier. Once you’re tuned to the SCA; you should start getting demodulated SCA audio.

It sounds more complicated than it is; but getting unfiltered baseband in to SDR# so you can tune the subcarriers tends to be tricky; this is the easiest and least complicated method I’ve done. I will probably make a video demonstrating exactly how to set this all up; but I did make one showing it in action.

Update (8/11/2015): As you know, I have said goodbye to the world of RTL-SDR as well as this blog; however, I did want to give a final note for those who stumble on this page. Over at; there is an “FM MPX” output plugin. This will allow you to pipe the unfiltered wideband-FM baseband audio to a second sound device; so you no longer need HDSDR…or fiddling around with the config to get 192khz ouput. You can load this plugin and it makes life much easier. You can also use it as a second audio output for other modes besides FM MPX; like piping RTTY or other HF modes to your software using a virtual cable; without having to reconfigure SDR# every time.

Update (1/25/2015): I was talking with a fellow RTL-SDR user, friend, and ham radio operator Frank (K2NCC) about the SCA decoding; he was asking more detailed information about what I was actually doing in the article. He was able to get SDR# to output a wide enough signal by modifying an entry in the SDRSharp.exe.config file. Even when using his exact settings; I was getting sample rate errors…even when trying to run on actual hardware. He was, however, able to get two copies of SDR# to do the job; and has uploaded a video demonstrating this. So, it’s possible; I just have to figure out why my computer configuration is so wonky.