I created a simple MPX power meter using GNU Radio software. It was a quite enjoyable task to create a block diagram of a stereo WFM receiver together with a bit more advanced deviation meter with GNU Radio Companion environment. In order to obtain reasonable results, the measured signal must be perfectly clear and strong.
ITU-R SM.1268 provides detailed information about required conditions for measurements. The signal level should be at least −47 dBm (73 dBf) together with SINR (signal to interference and noise ratio) of 50 dB or more. Also, there should be no multipath interference, so a directional antenna is probably the only option.
Generally, if the peak deviation exceeds ±80 kHz during measurement and the station is unlikely over-deviating, it is certain that signal quality is not sufficient. Measurements are also unreliable with stations spaced less than 300 kHz apart, because of very wide filters involved.
This project is dedicated for Airspy HF+ SDR device, so the input sample rate is fixed at 768 kHz. It can be easily adapted for other SDRs using additional interpolation and decimation operations through Rational Resampler block. The bandwidth is adjustable, with default value of 280 kHz, which is optimal for ±80 kHz peak deviation and subcarriers up to ±60 kHz (i.e. including RDS). The maximum bandwidth is limited to 320 kHz due to DC offset at the center of the frequency range, so only one side of available spectrum is used (the right one).
The measurement session can be saved as raw I/Q file by enabling the File Sink block. Consequently, in order to playback the recorded session, enable both File Source and Throttle blocks and disable the osmocom Source block. The path to a file should be also modified.
According to ITU-R BS.412, the average modulation power over any interval of 60 s cannot exceed power of a single sinusoidal tone which causes a peak deviation of ±19 kHz. Instead of measuring real signal, there is also other mode available, which can be used as a reference for mpx power magnitude. Enable the Signal Source and Frequency Mod blocks and disable all blocks starting from other sources. The gen_dev
variable can be modified, which is the peak deviation of a continuous sinusoidal tone.
MPX power | Deviation |
0 dBr | ±19 kHz |
3 dBr | ±27 kHz |
6 dBr | ±38 kHz |
10 dBr | ±60 kHz |
To measure the deviation, the FM signal is being demodulated and then the peak value of some samples is taken. In order to measure MPX power, the RMS deviation is calculated.
Important note: The MPX power output is based on last 60 seconds of measurement.
Both stereo pilot and RDS deviation measurement is provided as-is. Some filter refinement (order, width) may be necessary for accurate results.
The peak deviation (20 samples per second) and MPX power (1 sample per second) data in raw float32 format can be exported to a file. Enable the following blocks and modify the path to a file to turn this feature on.
The RDS decoder requires gr-rds module. If it is not available, disable last two rows of blocks to start this project, as follows.
The signal level meter can be calibrated by modifying the rssi_ref
variable. I calibrated my unit to 75 Ω dBf signal unit.
I measured my local stations and I recorded their I/Q samples. Here are the results from February 14, 2019 using directional antennas (Körner 19.3 H and 2×9-el Yagi V). Short video snippets of the mpx power monitor are also available. They contain the peak of each measurement, regarding the mpx power value. Click on a station name to watch the video.
Freq | Station | Location | ERP | Signal | MPX | Dev ± |
88.1h | RPL FM | Płock – Radziwie | 0.25 kW | 75 dBf | 6.0 dBr | 82 kHz |
90.4v | VOX FM | Płock – Kochanowskiego | 0.5 kW | 86 dBf | 3.0 dBr | 73 kHz |
92.2h | PR 1 | Sierpc – Rachocin | 60 kW | 85 dBf | 1.3 dBr | 78 kHz |
93.1v | RMF Classic | Płock – Radziwie | 0.25 kW | 80 dBf | 3.0 dBr | 73 kHz |
94.3h | RMF FM | Sierpc – Rachocin | 60 kW | 86 dBf | 2.4 dBr | 74 kHz |
95.2v | Eska Płock | Płock – Kochanowskiego | 0.1 kW | 83 dBf | 3.0 dBr | 72 kHz |
96.1h | PR 3 | Sierpc – Rachocin | 60 kW | 86 dBf | 0.7 dBr | 78 kHz |
97.3h | Radio Zet | Sierpc – Rachocin | 60 kW | 87 dBf | 2.5 dBr | 74 kHz |
98.1h | PR 2 | Sierpc – Rachocin | 2.5 kW | 74 dBf | 0.4 dBr | 77 kHz |
101.2v | TOK FM | Płock – Radziwie | 1 kW | 88 dBf | 1.6 dBr | 71 kHz |
101.9h | RDC | Sierpc – Rachocin | 60 kW | 87 dBf | 3.0 dBr | 74 kHz |
104.3v | KRDP | Płock – Orlen (h160) | 1 kW | 96 dBf | 3.0 dBr | 75 kHz |
106.3h | Radio Maryja | Sierpc – Rachocin | 60 kW | 85 dBf | 0.7 dBr | 74 kHz |
I did not compare my measurements, as I don’t have any devices for that. Nevertheless, the results seem to be reliable. According to ITU-R SM.1268, the instrument accuracy for deviation measurements should be within ±2 kHz for ≤ 80 kHz and ±5% for > 80 kHz.
Download the FM MPX power monitor on Github: https://github.com/kkonradpl/mpx-power
Update: Recently I have created a gnuplot script for deviation histogram and mpx power graph plotting. It can be executed periodically during the measurement to obtain a nice real-time view.
Other sample measurements are available at: https://fmdx.pl/2019/05/pomiary-stacji-ukf-fm-mpx-power/.