element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products & Partners
    Products & Partners
    • Arduino
    • Avnet & Tria Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
    About the element14 Community
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Japan
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      •  Vietnam
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
RoadTests & Reviews
  • Products & Partners
  • More
RoadTests & Reviews
Review Blogs Raspberry Pi CM5 roadtest - USRP Bandwidth stress test
  • Blogs
  • Forum
  • Documents
  • RoadTests
  • Reviews
  • Polls
  • Files
  • Members
  • Sub-Groups
  • More
  • Cancel
  • New
Join RoadTests & Reviews to participate - click to join for free!
  • Share
  • More
  • Cancel
  • Author Author: gpolder
  • Date Created: 14 Nov 2026 4:22 PM Date Created
  • Views 31 views
  • Likes 2 likes
  • Comments 1 comment
Related
Recommended
  • RoadTest
  • software defined radio
  • Raspberry Pi CM5

Raspberry Pi CM5 roadtest - USRP Bandwidth stress test

gpolder
gpolder
14 Nov 2026
Raspberry Pi CM5 roadtest - USRP Bandwidth stress test

After getting the Ettus USRP B205mini-i working with SDR++ on the Raspberry Pi Compute Module 5, I wanted to investigate how the system behaves when pushing the receiver to higher bandwidths. In particular, I was interested in power consumption, CPU load and temperature, and whether the CM5 could maintain stable SDR operation when the processor was under heavy load.

For this test, I combined SDR++ with a CPU stress test and added some monitoring to keep track of what was happening inside the CM5.

Monitoring the CM5

To monitor the system during the experiments, I wrote a small Python script running on the CM5. It continuously reads three parameters:

  • CPU utilisation
  • CPU temperature
  • Fan speed

The measurements are transmitted over MQTT to my home automation system. On the receiving side, I use Node-RED to collect the incoming data and display it in a dashboard. This allows me to monitor the CM5 remotely while running SDR++ and the stress tests.

image

The Node-RED flow receiving the monitoring data from the CM5.

Note that the fan speed (rpm) is devided by 100, in order to be able to keep the range similar as cpu utilisation and temperature.

#!/usr/bin/env python3

import time
import json
import glob
import os
import paho.mqtt.client as mqtt

# MQTT configuration
#BROKER = "localhost"
BROKER = "remote.broker" # name or ip of your remote MQTT broker
PORT = 1883
TOPIC = "cm5/hardware"

INTERVAL = 5  # seconds

def read_cpu():
    with open("/proc/stat") as f:
        values = list(map(int, f.readline().split()[1:]))

    idle = values[3] + values[4]
    total = sum(values)

    return total, idle


def read_temperature():
    try:
        with open("/sys/class/thermal/thermal_zone0/temp") as f:
            return round(int(f.read()) / 1000, 1)
    except (OSError, ValueError):
        return None


def read_fan_speed():
    # Search for available hardware monitoring fan inputs
    for path in glob.glob("/sys/class/hwmon/hwmon*/fan*_input"):
        try:
            with open(path) as f:
                rpm = int(f.read().strip())
                return rpm
        except (OSError, ValueError):
            continue

    return None


def main():

    print("Connecting to MQTT broker:", BROKER)

    client = mqtt.Client()
    client.connect(BROKER, PORT, 60)
    client.loop_start()

    old_total, old_idle = read_cpu()

    print("CM5 monitoring started")

    try:
        while True:
            time.sleep(INTERVAL)

            new_total, new_idle = read_cpu()

            total_diff = new_total - old_total
            idle_diff = new_idle - old_idle

            if total_diff > 0:
                cpu_load = round(
                    100 * (total_diff - idle_diff) / total_diff, 1
                )
            else:
                cpu_load = 0.0

            old_total, old_idle = new_total, new_idle

            temperature = read_temperature()
            fan_rpm = read_fan_speed()

            data = {
                "cpu_load": cpu_load,
                "cpu_temp": temperature,
                "fan_rpm": fan_rpm
            }

            payload = json.dumps(data)

            if client.is_connected():
                client.publish(TOPIC, payload, qos=0)

            print(payload)

    except KeyboardInterrupt:
        print("\nMonitoring stopped")

    finally:
        client.loop_stop()
        client.disconnect()


if __name__ == "__main__":
    main()

The Python monitoring script running on the CM5. CPU utilisation, temperature and fan speed are periodically published over MQTT.

This setup proved quite useful during the tests, as I could observe the system behaviour without having to switch away from SDR++.

Power consumption measurements

For measuring the input power, I used a Ruideng UM25C USB power tester connected between the power supply and the CM5. I did not automate the power measurements or read them out electronically; instead, I simply observed the readings on the tester's display.

Before starting with SDR++, I first measured the power consumption with the system running normally. The idle consumption was approximately 5.2 W.

CPU stress test

As a baseline for the processor's maximum load, I first ran a CPU stress test using stress-ng:

stress-ng --cpu 0 --cpu-method fft

This command starts CPU workers on all available processor cores and uses FFT calculations as the workload.

During this test, the input power increased to approximately 9 W.

image

Monitoring results during the CPU stress test. The increase in CPU load, temperature and fan activity can be followed in Node-RED.

This provides a useful reference point for the subsequent SDR++ tests. It also gives an indication of the power required when all CPU cores are heavily occupied.

SDR++ bandwidth tests

Next, I started SDR++ with the Ettus USRP B205mini-i and measured the power consumption at different receiver bandwidth settings.

I used four bandwidth settings: 2, 4, 8 and 16 MHz. For each setting, I observed the input power on the UM25C.

The results are summarised below.

SDR++ configuration Input power
SDR++ off (idle system) 5.2 W
SDR++ - 2 MHz BW 6.6 W
SDR++ - 4 MHz BW 6.8 W
SDR++ - 8 MHz BW 7.5 W
SDR++ - 16 MHz BW 8.5 W

The measurements show a clear increase in power consumption as the receiver bandwidth increases. At 16 MHz, the system consumes approximately 8.5 W, which is already quite close to the 9 W measured during the CPU stress test.

This is not particularly surprising: processing a wider bandwidth requires more data to be transferred from the USRP and processed by the CM5. The additional processing load is reflected in the power consumption.

CPU load, temperature and fan speed during SDR++ operation

Besides measuring the power consumption, I also monitored CPU utilisation, temperature and fan speed at the different SDR++ bandwidth settings. The measurements were collected using the Python monitoring script and displayed in Node-RED.

image

CPU utilisation, temperature and fan speed at 2, 4, 8 and 16 MHz SDR++ bandwidth.

The graph provides a useful insight into how the CM5 responds to the increasing processing requirements. It also shows how the cooling system responds to the additional thermal load.

Combining SDR++ with a CPU stress test

The most interesting part of the experiment was combining the two workloads.

With SDR++ running at 16 MHz bandwidth, I started the same stress-ng CPU test in parallel. This puts the processor under considerable load while it is also handling the incoming USRP data and performing the SDR signal processing.

Under these conditions, the SDR++ audio output became disturbed. The receiver was no longer able to maintain uninterrupted audio which also could be observed in the waterfall.

image

SDR++ waterfall display during the combined bandwidth and CPU stress test. The receiver was operating at 16 MHz while stress-ng was running in the background.

This indicates that the available processing capacity is not sufficient to maintain completely smooth SDR operation when both workloads are running simultaneously.

It is worth pointing out that this is a deliberately demanding test. In normal operation, SDR++ would not usually compete with a CPU stress test consuming all available processor resources. Nevertheless, it gives a useful indication of the limits of the platform.

A note about the USB-C power supply

One additional observation concerns the power supply.

I am using the newer official Raspberry Pi 27W USB-C power supply. Apart from its 5.1 V output at up to 5 A, it also supports USB Power Delivery profiles of 9 V, 12 V and 15 V.

However, throughout my experiments, the CM5 operates at 5 V, even when the power consumption approaches 9 W.

This raises an interesting question: will a future Raspberry Pi Compute Module ever make use of the higher USB-C Power Delivery voltages, or will the 5 V architecture remain the standard?

The higher voltage profiles are useful for other USB-PD-compatible devices, but the current Raspberry Pi 5 and CM5 platforms do not request them. The CM5 IO Board is designed for 5 V operation, with a supply capability of up to 5 A.

There is also an interesting technical document from Raspberry Pi specifically discussing USB Power Delivery on the Raspberry Pi 5:

  • USB Power Delivery on Raspberry Pi 5 - technical whitepaper
  • Raspberry Pi 27W USB-C Power Supply specifications

For now, the additional voltage profiles remain unused by my CM5 setup. The important specification for this application is the ability to deliver a stable 5 V supply with sufficient current.

Bottom line

The bandwidth stress test shows that the Raspberry Pi CM5 is quite capable of running SDR++ with the Ettus USRP B205mini-i, even at a bandwidth of 16 MHz.

Power consumption increases from approximately 5.2 W with SDR++ switched off to 8.5 W at 16 MHz bandwidth. A full CPU stress test brings this to approximately 9 W.

When combining the maximum SDR++ bandwidth with a simultaneous CPU stress test, audio disturbances become noticeable. This suggests that the system is approaching its processing limits under these deliberately demanding conditions.

The MQTT monitoring setup also proved valuable. Being able to observe CPU utilisation, temperature and fan speed remotely through Node-RED provides a convenient way to assess the behaviour of the CM5 during extended tests.

Overall, the CM5 makes a very capable compact SDR platform, but as with any embedded system, there are limits when several demanding tasks compete for processing resources.

  • Sign in to reply
  • DAB
    DAB 5 hours ago

    Very interesting post.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • More
    • Cancel
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2026 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube