The EMDRC Talking FM Deviation Monitor*
What Is It?
The Talking FM Deviation Monitor is an automatic, voice-announcing information service permanently installed by the Eastern and Mountain District Radio Club, for use by all Melbourne radio amateurs. It continuously monitors the 2-metre frequency of 145.250MHz and measures the FM deviation of every transmission it receives, then announces the result back in plain speech, immediately after you finish transmitting.
This means anyone can check their radio’s FM deviation without needing specialised test equipment, simply by making a brief transmission and listening for the verbal result.
The system is built around Espressif ESP32-S3 computer hardware and is interfaced directly to the discriminator output and squelch line of an Icom IC-F110 transceiver. All firmware and voice announcements were created entirely using Generative AI, demonstrating that capable, real-world radio infrastructure tools can now be built from the ground up with AI assistance.
How to Use the Deviation Monitor
Using the deviation monitor is completely passive, meaning there is nothing special you need to do to activate it. Simply transmit on 145.250MHz with a 91.5Hz CTCSS tone as you normally would, with your microphone audio, a tone, or any audio source you wish to measure.
- Key up and speak for at least three seconds.
- Unkey your radio.
- The monitor will announce your result over the air.
That’s it. No DTMF codes, no special sequences required!
Understanding the Voice Announcement
After each transmission, the monitor speaks a brief result directly. The assessment message is one of four:
“Too Short”: Your transmission was not long enough to evaluate. Try again.
“Good”: Deviation is between 4.1 and 5.1 kHz. Correct for narrowband FM
“Low”: Deviation is below 4.1 kHz. Your audio level or microphone gain is too low
“High” Deviation is above 5.1 kHz. Your audio level or microphone gain is too high
What Deviation Should I Aim For?
The 2-metre band plan in Australia uses narrowband FM (NBFM) with a maximum deviation of ±5 kHz (usually). The monitor’s “good” zone of 4.1–5.1 kHz represents well-set deviation for most amateur radio operation; loud enough to be clearly heard, but not overdriving the channel. Most well-adjusted FM radios will read in this range.
If your radio consistently reads low, try increasing the microphone gain, speaking more closely to the microphone, or having the radio serviced. If it consistently reads too high, reduce the microphone gain or audio drive level.
Tips for a Good Test
- Make your test transmission at least 3 seconds long. The monitor needs a moment to stabilise after your signal opens the squelch before it begins measuring.
- Speak at your normal conversational level; do not shout or whisper. The monitor measures your typical deviation.
- The monitor measures Peak deviation across your entire transmission, so if your voice or audio peaks high at any point, that will be the reported figure.
- Ensure your signal is received by the monitor strong, clear and ‘full quieting’. Any noise present on your signal will significantly distort the measurement and return an unusually high measurement. If you continually get unusually high measurements, your signal is probably not strong enough to be accurately measured.
How It Works
System Architecture
The monitor is built on an ESP32-S3 MCU running at 240 MHz, programmed via the Arduino framework. It is connected to the IC-F110 transceiver at three points:
- FM discriminator output: Provides the raw audio waveform whose amplitude is proportional to instantaneous FM deviation.
- Squelch line: Tells the monitor when a valid signal is being received, triggering measurement.
- PTT input: Allows the monitor to key the transmitter to announce results.
Audio is played back through a PCM5102A I2S DAC; a high-quality 32-bit digital-to-analogue converter which drives the transmitter’s audio input via a 600-ohm isolation transformer. This gives the voice announcements clean, high-fidelity audio output.
Signal Processing Pipeline
When a signal opens the squelch, the following processing chain runs in real time:
- ADC Sampling: The ESP32-S3’s built-in 12-bit analogue-to-digital converter samples the discriminator output at 8,000 samples per second (8 kHz). The discriminator output is DC-biased to the ADC’s midpoint via a resistor divider network.
- DC Centre Removal: The known DC midpoint (measured and calibrated at startup) is subtracted from each sample, yielding a signed audio waveform centred on zero.
- De-emphasis Filtering: A single-pole IIR (infinite impulse response) low-pass filter with a 300 microsecond time constant (corner frequency ~530 Hz) is applied to every sample. This is the standard NBFM de-emphasis characteristic, which compensates for the pre-emphasis applied by transmitters and flattens the audio frequency response for accurate level measurement.
- Squelch Guard Timing: The first 150ms of each transmission is discarded. This prevents the brief burst of noise generated as the squelch opens from corrupting the measurement. Similarly, the final 150ms before the squelch closes is excluded, rejecting the squelch tail noise artifact. This is implemented as a ring buffer that delays the commit of samples by the guard interval.
- Peak Tracking: The deviation meter tracks the maximum excursion from the DC centre across all committed samples. At 8 kHz with 12-bit resolution, it has ample precision for the 0–7 kHz range of interest.
- Running Average: A running average is maintained using a lightweight algorithm (avg = avg/2 + sample/2) that prevents arithmetic overflow across arbitrarily long transmissions.
Deviation Calculation
Raw ADC amplitude is converted to kilohertz of deviation using a calibration factor established by injecting known deviation signals from a calibrated signal generator (in this case, an Agilent E8285A).
- A piecewise linear correction table (8 calibration points from 0 to 7 kHz) compensates for the measured non-linearity of the IC-F110 discriminator output. The discriminator was found to compress significantly above 5 kHz, so the correction table accurately maps the operating range of 0–5 kHz.
- The calibration was performed in February 2026 using an E8285A signal generator at 1 kHz steps, with three measurement runs per step to establish stable median values.
Voice Announcement
At the end of each transmission (when the squelch closes), the calculated peak deviation is converted to a spoken announcement by concatenating pre-recorded audio clips stored in on-board flash memory. Individual clips for digits (0–9), words (“point”, “kilohertz”, “peak”, “good”, “low”, “high”), and phrases are assembled in the correct order and played sequentially through the I2S DAC.
The PTT line is keyed before playback begins and released after a brief post-delay, so the announcement is transmitted in the normal way.
All voice clips were generated using AI text-to-speech synthesis. The resulting audio files are stored in a FAT filesystem partition on the ESP32-S3’s internal flash. The deviation monitor features a built-in web-based Audio File Manager that allows authorised maintainers to upload, test, and manage the voice audio clips stored inside the unit — without opening the enclosure or removing any hardware. The interface is accessed using a web browser.
Safety and Reliability Features
The system includes several features to ensure reliable and safe unattended computer-controlled operation:
- Watchdog Timer: A hardware watchdog resets the processor automatically if the firmware hangs for more than 30 seconds.
- Transmit Timeout Protection: If the PTT line is held keyed for more than 60 seconds (for example, due to a runaway audio file), it is forcibly released. The IC-F110 also has a 60-second transmit timeout for even further redundancy. This prevents the monitor from blocking the radio channel.
- Power-On Self-Test (POST): At each startup, the firmware verifies that all modules are initialised correctly, that the required audio files are all present and intact, checks the ADC DC centre point, and confirms the flash filesystem is healthy. If POST fails, the welcome announcement is suppressed and a warning is logged.
- Reset Reason Logging: The cause of any reset (power-on, watchdog, software panic, brownout, etc.) is logged to the serial debug port to aid maintenance.
- Status LED: An on-board RGB LED provides continuous visual status:
- Green flash (once per second): system idle and healthy
- Blue: receiving and measuring a transmission
- Red: transmitting a voice announcement
- Audio Retry Logic: If an audio file fails to play, the system automatically retries up to two times before moving on.
- Squelch Debounce: The squelch input is debounced in software (20 ms stable window) to prevent spurious triggers from brief noise events.

ABOVE: The Computer Control Hardware is assembled on a custom PCB
Computer Control Summary
Computer Control: Espressif ESP32-S3, 240 MHz, Xtensa LX7 dual-core
ADC: Built-in 12-bit SAR ADC, 8 kHz sample rate
Audio DAC: PCM5102A I2S DAC (32-bit, 192 kHz capable)
Audio storage: Internal flash, FAT filesystem, ~2 MB partition
Squelch input: GPIO, voltage-divided from 4.6 V to 3.0 V
PTT output: GPIO via NPN open-collector transistor
Status LED: WS2812B RGB LED
Firmware: Arduino framework, ESP-IDF 5.x (ESP32 Core 3.3.7)
De-emphasis: 300 µs time constant IIR filter (NBFM standard)
Measurement window: Full transmission duration, 150 ms guard each end
Deviation thresholds: Low < 4.1 kHz, Good 4.1–5.1 kHz, High > 5.1 kHz
Measurement Precision: Within100Hz from 1kHz to 5kHz, calibrated against an Agilent E8285A comms test set

ABOVE: The Icom IC-F110 VHF commercial land mobile transceiver used by the system
Radio System Summary
Frequency: 145.250 MHz (Why this frequency? It is the frequency suggested by the WIA for information services)
Tone Required: Yes, a 91.5Hz is needed
RF Filter: External 4-stage helical bandpass
RF Transmit power: 10W
Antenna: Diamond V5000A 6/8-Wave Length C-Load with ruggedized fiberglass radome (4.5dB gain), elevated by 40-metre tower
Antenna Feedline: 43-metres of LDF4-50A ½” corrugated HELIAX®
TX Timeout period: 60 seconds
Advertisement interval: A short EMDRC voice announcement is broadcast every 30 minutes
AC Supply: 230v AC mains to IMARK 5000 series PSU with 240AH 13.8v battery backup
Thermal: Constant low-RPM active fan cooling
Total Consumption: 5W DC during receive, 50W DC during transmit

ABOVE: A 4-stage helical filter attenuates strong out-of-band signals, preventing receiver overload and intermodulation, thereby lowering the effective noise floor within the 2m band.
A Note on AI-Assisted Development
This project is an example of what can be achieved with modern generative AI tools in amateur radio. Every line of firmware; the signal processing, the deviation algorithm, the calibration routines, the safety systems, and the audio engine, was all written using an AI interactive agent called Claude Sonnet 4.6 Large Language Model (LLM), made by Anthropic PBC and specifically tailored to help with software engineering tasks. The voice announcements were also generated entirely by AI text-to-speech (Google Gemini TTS), without recording a human speaker.
The resulting system is production-quality, calibrated against traceable signal generator references, and has been operating reliably. It demonstrates that AI has become a practical tool for building real, working radio infrastructure.
*Talking FM Deviation Monitor v1.1 — System conceived and installed March 6, 2026 by Ralph Parkhurst VK3LL, c/o Eastern and Mountain District Radio Club.



