<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <title>PA2IX</title>
    <link href="https://pa2ix.vanling.net/feed.xml" rel="self" />
    <link href="https://pa2ix.vanling.net" />
    <updated>2026-09-20T13:41:04+02:00</updated>
    <author>
        <name>Ivo van Ling</name>
    </author>
    <id>https://pa2ix.vanling.net</id>

    <entry>
        <title>SDR-SLC: A systems architecture approach to low-cost SDR</title>
        <author>
            <name>Ivo van Ling</name>
        </author>
        <link href="https://pa2ix.vanling.net/sdr-slc-a-systems-architecture-approach-to-low-cost-sdr.html"/>
        <id>https://pa2ix.vanling.net/sdr-slc-a-systems-architecture-approach-to-low-cost-sdr.html</id>

        <updated>2026-09-17T19:06:33+02:00</updated>
            <summary type="html">
                <![CDATA[
                    Software-defined radio hardware has become technically impressive, but increasingly closed, expensive, and&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <p>Software-defined radio hardware has become technically impressive, but increasingly closed, expensive, and difficult to experiment with. SDR-SLC is an attempt to move in the opposite direction: an open protocol suite for super-low-cost networked SDR hardware that can be implemented on everything from an STM32 microcontroller to a Linux daemon connected to an RTL-SDR dongle.</p><h2 id="an-open-networked-sdr-platform-for-ham-radio-experimenters">An open networked SDR platform for HAM radio experimenters</h2>
<p>Over the past year I have been working on a personal SDR project that has gradually grown into something much larger than I originally intended. What started as experiments with STM32 microcontrollers, Tayloe detectors, Ethernet streaming, and DSP on the MacBook has evolved into a complete open protocol suite and SDR ecosystem, published under the name <strong>SDR-SLC</strong>.</p><p>The project is still under active development and many parts are not yet finished, polished, or documented to the level I would like. Nevertheless, enough pieces are now working together that it makes sense to publish the architecture, specifications, software, and hardware designs so that other HAM radio experimenters can follow along and eventually build on top of it themselves.</p><p>The central idea behind SDR-SLC is relatively simple:</p><blockquote>
<p>Keep the radio hardware simple. Push the DSP processing to the host computer.</p></blockquote>
<p>Modern laptops have enormous processing capability available for FFTs, filtering, demodulation, waterfall rendering, digital modes, and signal analysis. Instead of embedding all DSP functionality into expensive FPGA-based hardware, SDR-SLC moves as much processing as possible into software running on the host system.</p><p>The radio hardware itself therefore mainly becomes an RF frontend, I/Q sampling, Ethernet transport, and timing and synchronization. Everything else happens on the client.</p><h2 id="sdr-slc-protocol-suite">SDR-SLC protocol suite</h2>
<p>The first part is the protocol suite itself. This defines how all components interoperate: device discovery, control plane, stream lifecycle management, VITA-49 I/Q transport, and timing and synchronization. It is intentionally designed to be implementable on relatively small hardware platforms such as STM32 microcontrollers and Raspberry Pi systems.</p><p>The specifications cover the overall architecture, service discovery, the control plane, and VITA-49 transport. The protocols are open and intended for experimentation and interoperability. See the <a href="/static/specifications.html">Specifications</a> page for the current documents.</p><h2 id="stm32-based-sdr-transceiver-hardware">STM32-based SDR transceiver hardware</h2>
<p>The second component is the SDR transceiver hardware. The current prototype consists of an STM32H753 Nucleo board, a Tayloe quadrature detector, several analogue op-amp stages, and an SI5351 clock generator. The goal is not to build the smallest possible SDR, but rather something that is understandable, hackable, and reproducible by experimenters.</p><p>The STM32 firmware is written in C and handles Ethernet networking, SDR-SLC discovery, control-plane processing, VITA-49 packet generation, ADC sample handling, and stream transport. This hardware continues to evolve as the RF and firmware experiments continue. See <a href="/hardware.html">HF transceiver</a> for schematics and firmware.</p><!-- [IMAGE: client screenshot — re-upload and insert here] -->

<h2 id="native-macos-sdr-client">Native macOS SDR client</h2>
<p>The third component is a native SDR client written in Swift for macOS. It implements automatic SDR-SLC device discovery, control-plane communication, VITA-49 reception, waterfall and spectrum display, and host-side DSP processing.</p><p>The client is already capable of communicating with working SDR-SLC devices, displaying live spectrum and waterfall data, and decoding SSB, AM, FM, WFM and CW. See <a href="/client.html">the client</a> for the current release.</p><h2 id="optional-ptpv2gps-clock">Optional PTPv2/GPS clock</h2>
<p>One optional component in the network is a realtime PTPv2 clock, currently implemented using a Raspberry Pi, a uBlox GPS receiver, and Linux PTP software. The purpose is to experiment with precise network timing, synchronized SDR receivers, accurate timestamps, and future distributed SDR experiments. This component is entirely optional but forms part of the larger architectural vision.</p><h2 id="rtl-sdr-reference-implementation">RTL-SDR reference implementation</h2>
<p>To make experimentation easier, I have also written a Linux daemon that lets a standard low-cost RTL-SDR USB dongle, connected to a Raspberry Pi or Linux machine, appear as a fully networked SDR-SLC device. It implements SDR-SLC discovery, the control plane, VITA-49 streaming, and RTL-SDR tuner integration.</p><p>This means experimenters can already start testing the SDR-SLC ecosystem without requiring custom hardware. See <a href="/software.html">Daemons</a> for the current reference implementations.</p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Testing Ideas with Hardware</title>
        <author>
            <name>Ivo van Ling</name>
        </author>
        <link href="https://pa2ix.vanling.net/testing-ideas-with-hardware.html"/>
        <id>https://pa2ix.vanling.net/testing-ideas-with-hardware.html</id>

        <updated>2026-09-17T19:05:32+02:00</updated>
            <summary type="html">
                <![CDATA[
                    There has always been something about Software Defined Radio that I never&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <p>There has always been something about Software Defined Radio that I never quite understood.</p><p>Everybody seems to agree that SDR moves signal processing into software, yet when you look at many designs they still contain an impressive amount of analogue hardware. More filters, more gain stages, more switching, more AGC, more… well… hardware. That made me wonder whether we were actually solving the right problem.</p><p>Instead of asking <em>“what hardware do I need to build an SDR?”</em> I started asking a different question.</p><blockquote>
<p>What is the absolute minimum amount of hardware I need before software becomes the better place to solve the problem?</p></blockquote>
<p>Those are two completely different questions. The first usually ends with another schematic. The second forces you to justify every component. I honestly didn’t know whether that approach would work. There was only one sensible thing to do.</p><p>I built the simplest receiver I could think of.</p><figure class="slc-float"><img loading="lazy" src="/media/files/SDR-SLC-proto-1-trans.png" alt="The first SDR-SLC prototype, a breadboard receiver" data-is-external-image="true"><figcaption>The first prototype, built to answer a question, not to be a radio.</figcaption></figure>

<p>Looking back at this prototype now, it looks unfinished. That’s because it was. I wasn’t trying to build a radio. I was trying to answer a question.</p><blockquote>
<p>Could I receive a piece of HF spectrum, generate I/Q signals, send those samples over Ethernet to a MacBook and let the computer do the rest?</p></blockquote>
<p>If the answer turned out to be “no”, there would be very little point in designing a proper PCB. Fortunately, the answer was “yes”.</p><p>The architecture worked almost immediately. The STM32 streamed the I/Q samples over Ethernet, the MacBook received them and all further signal processing happened in software. That was actually the most important result of the entire prototype. It meant I could stop worrying about the overall concept and start looking at the details. Those turned out to be far more interesting.</p><p>The first thing I discovered was that I had been a little too optimistic about the analogue gain before the Tayloe detector. My reasoning had been simple enough: once the signal reached the computer, software would take care of the rest. Reality turned out to be less forgiving.</p><blockquote>
<p>If there isn’t enough signal before the detector, there simply isn’t enough information left for the DSP to work with.</p></blockquote>
<p>Software can’t recover information that never reached the ADC. Looking back, that sounds almost embarrassingly obvious. It certainly wasn’t obvious before I built the prototype.</p><p>The second lesson came from the I/Q outputs. I had deliberately kept the circuitry after the Tayloe detector extremely simple, just a basic instrumentation amplifier and very little filtering. Again, that wasn’t because I believed this would be the final design. I simply wanted to discover how much analogue circuitry was actually necessary.</p><p>The answer was: <strong>more than this.</strong></p><p>Strong stations outside the receive bandwidth still found their way into the sampled spectrum. The software faithfully processed everything it received, including signals that should never have been there in the first place. That was another useful lesson.</p><p>Some problems really do belong in hardware. Not because software isn’t capable enough, but because preventing unwanted signals before they reach the ADC is fundamentally easier than trying to remove them afterwards.</p><p>By then I had learned everything I needed from this prototype. Interestingly, none of those lessons changed the overall architecture.</p><ul>
<li>The Ethernet interface stayed.</li>
<li>The STM32 stayed.</li>
<li>The Tayloe detector stayed.</li>
</ul>
<blockquote>
<p>The idea of moving as much functionality as possible into software stayed.</p></blockquote>
<p>What changed was the implementation. The next prototype added considerably more gain ahead of the Tayloe detector, proper low-pass filtering for the I and Q channels and, finally, transmit capability.</p><figure class="slc-figure"><img loading="lazy" src="/media/files/SDR-SLC-proto-2-trans.png" alt="The first SDR-SLC prototype, an unfinished breadboard receiver" data-is-external-image="true"><figcaption>The second prototype, an unfinished breadboard receiver.</figcaption></figure>

<p>This second prototype looked much more like the radio I originally had in mind. Not because I had redesigned the architecture, but because I had stopped guessing. The first prototype had already answered the architectural questions, so the second one could focus entirely on engineering.</p><p>Only after those experiments did it make sense to draw a proper <a href="/media/files/SDR-SLC-HFtransceiver_1.0_9July2026.pdf" target="_blank" rel="noopener">schematic</a>.</p><figure class="slc-float"><a href="/media/files/SDR-SLC-HFtransceiver_1.0_9July2026.pdf" target="_blank" rel="noopener"><img loading="lazy" src="/media/files/SDR-SLC-HFtransceiver_partial.png" alt="The first SDR-SLC prototype schematic" data-is-external-image="true"></a><figcaption>The first prototype, drawn as a KiCad schematic. <a href="/media/files/SDR-SLC-HFtransceiver_1.0_9July2026.pdf" target="_blank" rel="noopener">View the full schematic (PDF)</a>.</figcaption></figure>

<p>Looking at the schematic today, I don’t really see a radio. I see three fairly independent building blocks:</p><ul>
<li>An RF front-end.</li>
<li>An analogue I/Q processing stage.</li>
<li>A digital processing platform.</li>
</ul>
<p>That separation was intentional from the very beginning. Once the interfaces between those blocks were defined properly, improving one block no longer meant redesigning the entire system. I like architectures that behave like that.</p><p>What I find interesting is that this project taught me very little about radio. It taught me much more about engineering. The first prototype wasn’t a failed radio. It was a successful experiment. It answered exactly the questions it was supposed to answer, and no schematic or simulation could have done that.</p><p>Whenever I start a new project, I still catch myself asking the same question.</p><blockquote>
<p>What is the simplest thing I can build that answers the question I actually have?</p></blockquote>
<p>Because that’s really what prototypes are for. Not to prove that you’re right, but to discover where you’re wrong.</p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>The First Design Decision Had Nothing to Do with Radio</title>
        <author>
            <name>Ivo van Ling</name>
        </author>
        <link href="https://pa2ix.vanling.net/the-first-design-decision-had-nothing-to-do-with-radio.html"/>
        <id>https://pa2ix.vanling.net/the-first-design-decision-had-nothing-to-do-with-radio.html</id>

        <updated>2026-09-17T19:04:02+02:00</updated>
            <summary type="html">
                <![CDATA[
                    When I started thinking about this project, I wasn’t looking at mixers,&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <p>When I started thinking about this project, I wasn’t looking at mixers, filters or ADCs. I was trying to answer a much simpler question.</p><p><strong>What exactly is the radio?</strong></p><p>That may sound like a strange place to start, but I have found over the years that many engineering problems become much easier once you decide where the system boundaries are. Before choosing components, I wanted to understand what responsibilities belonged inside the radio, and just as importantly, which ones didn’t.</p><blockquote>
<p>Architecture starts by deciding where responsibilities belong.</p></blockquote>
<p>At first glance this may seem like an odd question. After all, a software-defined radio receives RF signals, processes them and presents them to the user. That’s what every SDR does. The interesting question is <em>where</em> those functions actually take place.</p><p>Many commercially available SDRs perform most of the signal processing inside the radio itself. The client application running on the PC is largely responsible for presenting the results. That’s a perfectly sensible architecture. It creates a self-contained appliance with predictable behaviour, regardless of which computer is connected to it. It’s clearly optimised for a very different set of design goals than mine.</p><p>My goal wasn’t to build a commercial appliance. My goal was to understand how little intelligence actually needed to live inside the radio.</p><blockquote>
<p>I already had a powerful computer on my desk. Why would I build another one inside the radio?</p></blockquote>
<p>That question changed almost every design decision that followed.</p><p>Instead of designing a sophisticated SDR, I started thinking about a very simple network appliance. Its job would be limited to interacting with the analogue world: receive RF signals, generate I/Q samples, accept I/Q samples for transmission, and put those samples onto the network. Nothing more.</p><p>Everything else would happen on the computer, the DSP, the user interface, the waterfall display, recording, and experimenting with new algorithms. Those things all benefit from fast processors, plenty of memory and a mature software environment. A modern desktop computer already provides all of that. It seemed unnecessary to duplicate those capabilities inside the radio.</p><p>Once I had reached that conclusion, something interesting happened. The discussion was no longer about Ethernet versus USB. It was about what kind of system I was building.</p><p>A USB SDR is, by definition, a peripheral. It extends a computer with radio functionality. There is absolutely nothing wrong with that model; in fact, it has made SDR accessible to thousands of radio amateurs. It simply wasn’t the system I wanted to build.</p><p>I wanted the radio to become an independent appliance that provided a service over the network. The computer became just another client. Today that client might be a MacBook. Tomorrow it could be a Linux workstation, another computer elsewhere in the house, or perhaps something that doesn’t even exist yet. The radio shouldn’t care.</p><blockquote>
<p>USB connects a device to a computer. Ethernet connects independent systems.</p></blockquote>
<p>Once I looked at it that way, Ethernet wasn’t really a technology choice anymore. It became the natural consequence of the architecture.</p><p>Only then did I start looking for hardware.</p><p>Interestingly, finding the right processor turned out to be much harder than I expected. I wasn’t looking for the fastest CPU or the most impressive benchmark numbers. I wasn’t planning to run sophisticated DSP algorithms inside the radio, so raw processing power wasn’t particularly interesting. What I needed was something much more mundane: a processor that could reliably move I/Q data between the analogue hardware, memory and an Ethernet interface without getting in the way.</p><p>Eventually I settled on the STM32H753, using ST’s Nucleo development board. Not because it was the “best” processor, but because it matched the responsibilities I had already assigned to it. The processor didn’t have to be clever. It had to be dependable.</p><blockquote>
<p>I didn’t choose the processor because of what it could calculate. I chose it because of what it didn’t have to calculate.</p></blockquote>
<p>Looking back, I think that first architectural decision has survived almost every hardware revision that followed. The analogue circuitry changed. The filtering improved. Transmit capability was added. The PCB layout became considerably cleaner. But the system boundary never really moved.</p><p>The little box next to the antenna still has exactly the same responsibility as it had in the very first sketch: interact with the analogue world, and leave everything else to the machine that is already much better equipped to deal with complexity.</p><p>The next question, of course, was whether that idea would actually work. There was only one way to find out. <a href="/testing-ideas-with-hardware.html">I built the simplest prototype I could think of.</a></p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Why SDR-SLC exists</title>
        <author>
            <name>Ivo van Ling</name>
        </author>
        <link href="https://pa2ix.vanling.net/why-sdr-slc-exists.html"/>
        <id>https://pa2ix.vanling.net/why-sdr-slc-exists.html</id>

        <updated>2026-09-17T19:02:38+02:00</updated>
            <summary type="html">
                <![CDATA[
                    Systems, radio &amp; architecture: exploring engineering through software-defined radio, embedded systems and&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <p><strong>Systems, radio &amp; architecture: exploring engineering through software-defined radio, embedded systems and communication systems.</strong></p><p>My name is <a href="https://www.linkedin.com/in/ivovanling">Ivo van Ling (PA2IX)</a>. I have spent more than 30 years designing communication systems, telecom platforms and critical infrastructure. Amateur radio has been my playground for almost as long. This project brings those two worlds together.</p><p>Over the past few years I have been designing an open Software Defined Radio ecosystem. It includes RF hardware, embedded firmware, desktop software and, perhaps most importantly, the communication protocols that allow those building blocks to work together.</p><p>The hardware is only one part of the system. Long before designing PCBs, I spent a considerable amount of time thinking about the interfaces between those components. If those interfaces are designed well, the hardware, firmware and software can evolve independently without breaking the overall architecture.</p><p>That philosophy runs throughout the project. Rather than inventing proprietary solutions, the SDR ecosystem builds on established technologies wherever possible. I/Q samples are transported using the VITA-49 standard. Radio discovery uses mDNS. Control and status information are exchanged using simple JSON messages over TCP/IP. The goal is not to create yet another SDR protocol, but to define a system that is easy to understand, extend and integrate.</p><blockquote>
<p>Open systems begin with open interfaces.</p></blockquote>
<p>The complete <a href="https://github.com/pa2ix/sdr-slc">protocol specifications</a>, hardware designs, firmware and software are published openly. They are not included merely as documentation of this project, they are intended to be used. Whether you want to build compatible hardware, experiment with your own DSP software or simply understand how the system fits together, everything starts with clearly defined interfaces.</p><p>The articles that follow tell the story behind those design decisions. They are not build logs. They explain why the architecture looks the way it does, why certain responsibilities ended up where they did and, just as importantly, why others didn’t.</p><p>If you’re interested in the engineering decisions that shaped the architecture, start with <a href="/the-first-design-decision-had-nothing-to-do-with-radio.html">The First Design Decision Had Nothing to Do with Radio</a>.</p>
            ]]>
        </content>
    </entry>
</feed>
