(A very detailed writeup on how to make a digital trunking scanner)
This article is meant to go with my video, but the video I have is older than the steps I show here. Follow this tutorial, but use my video if you want to know how specific programs work. (don’t follow the video, just watch it)
Note: Lots of things are changing rapidly in the areas of SDR, especially the $9 RTL-SDR’s So What I say today, could change tomorrow. That said, I will provide as much detail as I can, and will list the versions of software I use.
- Intel 2nd generation Core i5 or better (AMD processors have been untested)
- 4GB RAM
- 500MB free HDD space
- A RadioReference Premium account (not required, but makes setup much easier)
- 2 RTL-SDR dongles, NooElec TV28t preferred
- An 800MHz antenna if the system you are trying to listen to is far away. (Look for Nextel Yagi’s, they’re cheap now)
- Willing to tinker with settings
You need to at least somewhat know how to work SDR# and UniTrunker. I suggest you play with some analog stuff and get familiar with the UI before getting into advanced things, or else you’ll tear your hair out.
Rick (Developer of UniTrunker) has implemented RTL-SDR INTO his program, so we don’t have to use this setup in theory, The latest preview build of Unitrunker has RTLSDR tuning support built in (no need for SDR#) but audio decoding isn’t too great, I still suggest using the tutorial below.
Virtual Audio Cable uses lots of CPU resources, even if it doesn’t seem like it. It seems VAC works well on some machines, and bad on others. My latest videos show decoding being done on a desktop with a core i5 4670K. I know this setup works with my hardware, and you can replicate my build for ~$300(used). Decoding varies a lot from PC to PC, and is generally not recommended on PC’s older than 2008.
You have 2 USB Dongles with a (special)driver loaded that allows you to communicate directly with the chip inside the dongle. The chip controls the frequency at which you listen to. If you tune it to 100MHz for example, you’ll see the end of the FM broadcast band (87-108MHz)
SDRSharp and UniTrunker can utilize this driver to feed audio into their programs. When you listen to trunked audio, you have to have at least 2 receivers. One receiver is dedicated to listening to the control channel, the other listens to the voice channel. In this setup UniTrunker will listen to the control channel from SDR#1. Control Channels send data like, who’s talking, who joined the network, what the frequencies of the channels are, and how many channels there are. Control channels usually transmit 24/7, so they are easy to pick out in a waterfall display. Unitrunker reads this information into a nice window like this.
Now lets talk about DSD. All DSD does is listen to Virtual Audio Cable for audio it can decode. Think of Virtual Audio Cable as the pipes that send audio from one program to another.
SDRSharp gets its orders from a plugin “Zefie’s Mod”
Zefie’s Mod is a 2 part plugin, it requires the installation of VC++ REDIST. Part one emulates a radio interface in UniTrunker. This is shown here
Part 1 is also known as remote.dll
Part 2 is a plugin for SDRSharp, It takes orders from remote.dll via a file called sdrsharptrunking.log. Sdrsharptrunking.log contains the current channel you should be listening to.
This is what the plugin looks like
Unitrunker tells the debug receiver to listen to a channel, the debug receiver writes the file called sdrsharptrunking.log, Zefie’s Mod SDRSharp plugin listens for that file, and tells SDRSharp to change its frequency based on the file.
This is currently the only way to listen to the voice channel. In analog trunked systems, you can directly listen to the output audio without the use of DSD. But if your system uses P25 CAI you will need to decode the audio, otherwise you’ll just hear weird noises any time someone talks.
DSD is a program that decodes a number of digital voice protocols. It’s still experimental and has bugs. As of version 160 it does not support P25 Phase II, but support is currently being worked on here. By default, DSD is not very good at decoding audio, It tries to guess what type of signal it is receiving and sometimes its guesses cause the audio to break up. Command line switches are used to specify what type of signal it should be listening to. This will be discussed further, later on. DSD requires some DLL’s to work, and can only utilize the “default” audio in and output for Windows. The audio you hear out of DSD should be words that we can understand.
- Go and grab SDRSharp from here.
- This contains a batch file that will download some components required for the program.
- When the batch finishes, go into the folder that contains zadig.exe, and rename the folder to “VOICE“. Make another folder to contain your voice folder called “SDR“
- Go ahead and right click “zadig.exe“, and run as Administrator
Loading the WinUSB driver
- See my video: https://www.youtube.com/watch?v=qGMXG8e70-M @15:05-15:47
- Select ‘Options>List all devices’
- Look for a device called “Bulk-In, Interface (Interface 0)” There may be two
- Select WinUSB as the target, and click “Install Driver“
- If the driver install fails (usually on Windows 8), Select “Edit Name“, Rename the device to “Interface” and try the install again.
- Driver installation should be successful, Check the second Bulk-In and make sure the second device has its drivers installed too.
- You may close zadig now.
Installing Virtual Audio Cable
- You can purchase, or find an alternative to “Virtual Audio Cable”
- Go through the setup for VAC
and open the “Control Panel” (blue icon with yellow cables) Under “Cable Parameters” set “SR” to “22050 … 192000” and “NC” to “1 … 1“ We are lowering the fidelity of the cable to save CPU usage. Click the “set” button You may close Control Panel now.
- Crossed out steps above have been found to be un-necessary.
Configuring Windows Sound
- Right click on the speaker icon in the system tray
- Click on “Playback Devices“
- click on the “Recording” tab
- Double click on “Virtual Audio Cable”
- In the “Advanced” tab, set the fidelity to “48,000hz , mono“
- Set the default recording device to “Virtual Audio Cable”
- Click on the “Playback” tab
- Double click on “Virtual Audio Cable”
- In the “Advanced” tab, set the fidelity to “48,000hz , mono”
Using SDR# for the first time
- RTL-SDR Dongles have a warm up period of 5-10 minutes. During this time there may be a frequency shift of 5PPM or more.
- Please open SDR# and select RTL-SDR/USB
- Press “Play” in the main window
- Feel free to play with SDR# to become accustomed to the user interface.
- You can change frequency by dragging on the FFT/Waterfall, by clicking on the top or bottom of numbers, or by putting your mouse cursor over the numbers, and typing a frequency in. Look for FM radio stations, or Weather radio stations nearby and see if you can listen to them, set your mode accordingly WFM for FM radio, NFM for everything else.
- If you feel like you might mess up the software, feel free to make a copy and run that one instead.
- Once you’re back- Calibration can be set by going into “Configure“
- Take note of how some settings may be locked, this is because you are currently running
- Press “Stop” in the main window
- “Device” selects which RTL dongle you will use
- “Sample Rate” selects the amount of spectrum you will be able to see. Note that 2.8+ MSPS is not recommended due to audio cutouts, 0.25 is not recommended either due to interference.
- Set this value to 0.900001 for optimal performance during trunking. Doing so will show 0.9MHz per fully zoomed out screen. Take note of how this correlates to the MSPS.
- “Tuner AGC” can help in situations where you need the best signal possible for long range listening, however it is not recommended for nearby systems due to the possibility of overloading the SDR and causing harmonics in the FFT/Waterfall.
- “RF Gain“ should be set to a maximum of 32.8dB to avoid overloading.
- Under “Frequency Correction” you can set the amount of correction needed. If you don’t set this properly, your decodes will not sound as good as they should, or not come in at all.
- The PPM varies by unit. Generally around 55-65 in R820T based dongles
- To calibrate your tuner you can find a control channel on radioreference, and tune to it inside SDR#. (you can also calibrate using a known NOAA weather frequency)
- Notice how changing the PPM slightly changes the frequency, zoom in to get a better look.
- Do this for both SDR’s, switch using the “device” drop down menu
- Be sure to remember your number, It will be needed for UniTrunker.
- See my video: https://www.youtube.com/watch?v=qGMXG8e70-M @11:38-12:10
- Download UniTrunker beta 18.104.22.168 here
- Install it into the “SDR” folder, for “Just Me“
- Now go into the SDR# “VOICE” folder, and copy every .dll file that does not begin with “SDRSharp.“. That means libusb0, rtlsdr, etc.
- Unitrunker is a program named uniform.exe, We will open it later.
Installing Zefie’s Mod
- See my video: https://www.youtube.com/watch?v=qGMXG8e70-M @12:10-13:40
- Download Zefie’s Mod
herehere(updated to work with new build of SDR#)
- move “remote.dll” into the “UniTrunker” folder, contained in the “SDR” folder
- Move “SDRSharp.Trunker.dll” into the “VOICE” folder, contained in the “SDR” folder
- Read the README, and add the following line to “SDRSharp.exe.Config” after the”sharpPlugins” tag
<add key="Trunker" value="SDRSharp.Trunker.TrunkerPlugin, SDRSharp.Trunker" />
- Save the file
- Download dsd160.exe from here
- Rename dsd160.exe to dsd.exe
- DSD depends on cygwin1.dll to run. Download the file here
- Put cygwin1.dll and dsd.exe into the same folder
- Name that folder DSD
- Put the DSD folder into your SDR folder
Tour of UniTrunker
- Open “uniform.exe“
- Select “First time install” and press “Ok”
- Take note of the interface, this is the main window
- Tabs at the bottom help you navigate
- The tab labeled “Options” controls options for the entire program
- The tab labeled “Receivers” lists the input/output devices you have for listening, or controlling. When configured properly, you will have 2 receivers. A “Signal” and a “Voice“
- The tab labeled “Systems” will show all radio systems detected by the RTL-SDR
- Double clicking on the system will bring up a window that lists all RadioIDs, Talkgroups, frequency channels, transmitter sites, patches, as well as options for the specific system only.
Installing prereq’s for Zefie’s plugin
- See my video: https://www.youtube.com/watch?v=qGMXG8e70-M @32:30-36:21
- Zefie’s plugin depends on the Visual C++ Redistributable
- Please download and install the following files (both x86 and x64)
Adding a RTL device to UniTrunker (no video)
- In the “Receivers” tab of the main window
- Click the Icon.
- Select RTL2832
- Note: In practice, UniTrunker must always be opened before opening SDRSharp or the RTL device will not show up. If you currently have SDRSharp running, please close both UniTrunker, and SDRSharp, then open UniTrunker only.
- Double clicking on the receiver will open the setting panel for the corresponding device.
- In the “info” tab set the “RTL Device” to the second device on the list.
- Set your “correction” to the PPM you had set from SDR# (e.g. 57.00000)
- set “gain” to 300
- checkmark “Auto Gain“,
- Set your park frequency to the control channel frequency (e.g. 854.16250)
- Start the receiver
- If your dongle successfully found a control channel, a new window should pop up.
Troubleshooting the control channel (no video)
- If you do not see a system pop up, follow these instructions
- Go into the scope tab and look at the signal coming in.
- If it is random and not uniform, you have not found a control channel
- P25 Control channel example scope image
- Static, no signal scope image (seen at 21:35)
- A way you can detect if you found a control channel is in the info tab
- This indicates a P25 signal, with a health of 99/100 was found, and is being decoded.
- If you still see no systems, go into radioreference and try typing alternate control channels into the park frequency text box. See pic
- If you still can not find a control channel, try a different system, try a better antenna, or go close UniTrunker, Open SDR#, and manually browse for a control channel visually.
- This is what a control channel looks like, move your cursor over that frequency and try that the next time you open UniTrunker
Downloading RadioReference Data
- See my video: https://www.youtube.com/watch?v=qGMXG8e70-M @22:00-22:15
- Now that you have detected a system in UniTrunker you can begin filling out, or downloading radioreference data.
- This is the download button, if you are a premium radioreference subscriber, you can enter your username and password, and UniTrunker will fetch the latest system info, system name, talkgroup names, etc.
- Your frequency list should populate with channels like this.
- If it does not, stop the R820T receiver, close the system window. and Start the receiver again.
Adding our debug receiver
- See my video: https://www.youtube.com/watch?v=qGMXG8e70-M @31:30-32:24
- UniTrunker can decode the control channel, we must now add a second receiver that will allow us to follow voice channels.
- In the main UniTrunker Window, Add a Debug receiver (the video shows a bit differently, follow this step instead)
- Check the box which corresponds with the type of audio you want to listen to (P25/VSELP/ProVoice)
- Now for some math. Take the average of your lowest and highest frequency channel. This is done to ensure that the time it takes for the SDR to switch channels is even. SDRs do take a few ms to change their frequency, and you want to have the lowest latency possible. This will vary by radio system, and needs to be changed when you want to listen to a new radio system.
- For example: My highest frequency is 856.16250, and lowest is 854.1375. The average is 855.15. So I would put 855.15 into the box.
- In the main window under options enable listen
- Press play on the debug receiver.
- A new file should be created in ./SDR/UniTrunker called sdrsharptrunking.log
- This is the file SDRSharp will read and follow, so we can get voice out of the program.
- If you do not see sdrsharptrunking.log, you have not properly installed Visual C++ redist.
Following the Voice channel in SDR#(no video)
- Now open SDRSharp in the SDR folder named VOICE
- Press Start and duplicate my settings
- Now we can configure the plugin
- On the bottom of the left settings panel in SDRSharp there is a plugin called “Trunker (Plugin)“
- Click set and find the UniTrunker install directory.
- Also set Single log file output to that same directory.
- Click on show options and in the log style box, type %t %s
- Set the Parked Str as NOCALL
- Click save
- Check both “enable” boxes
- Your VFO should match the parked frequency (if there is no call)
- Now, when a call appears, UniTrunker will direct the plugin to write sdrsharptrunking.log, which will get read by SDRSharp, and the audio coming out of SDRSharp can be listened to (on analog systems), or for digital, there will be just one more step.
Configuring and optimizing DSD
- See my video: https://www.youtube.com/watch?v=qGMXG8e70-M @41:45-4:18
- This is the final mandatory step in decoding P25 voice.
- Download this batch file, and put it into the same folder with dsd.exe and cygwin1.dll
- It will start DSD without having to open command prompt
- Make sure your default audio output is still your sound card, and your input is the virtual audio cable
- In most cases, this should work without problem
- If you want to see what options are available in dsd.exe (to get better decodes) open a command prompt, navigate to the dsd folder, and type in ‘dsd.exe –help‘
- Personally I use ‘dsd.exe -l -f1 -mc -u 9‘. But it varies by system.
That’s it! You should be hearing audio coming from DSD.
Don’t forget you can set call priority and lockout in UniTrunker
Here are a couple extras
Programs for Streaming
I advise you to make only unlisted streams. I know I can’t stop you from making public streams, but If you like what you hear, and don’t want to lose it. Stay far away from streaming services that allow criminals to tune in. This is the number one reason why cities are going encrypted.
Programs for recording
- Audacity – has a voice activated recording mode to save silence
- Log Recorder – based on SOX, written in batch. Puts each conversation into a folder based upon the date, year, in chronological order. Outputs mp3′s named by their TG and RID. Highly configurable
CTCSS is an acronym for Continuous Tone-Coded Squelch System and is a system that is used in shared two way radio systems. It is common for a single radio channel to be shared over a number of user groups for frequency use efficiency. CTCSS uses a special tone to identify each group of users, and this tone is used to prevent a group hearing radio chatter from another group sharing the channel.
Over on the SDR# Yahoo Groups forum, a CTCSS detector plugin for SDR# has been posted. The plugin can detect CTCSS tones and provide a squelch for the desired tone. The latest version of the plugin can be downloaded from this link.
LevelMeter is a plugin for SDR#
There are three modes to monitor the rx power
- rx power of VFO frequency
- average rx power in Bandwith
- peak rx power in Bandwith