News feed

  • Plotting RF spectrum with the LinHT

    RF spectrum is always a mesmerizing thing to stare at. Since the LinHT’s RF front-end is a full-blown SDR, and the display is so colorful, why not sprinkle it with a bit of DSP maths, generating a nice plot for us to enjoy?

    Let’s start with the baseband. The source, SX1255, offers a baseband stream over I2S at selectable rate. Each I2S sample carries two 16-bit values (real and imaginary parts – we deal with complex numbers, disguised as left and right audio channels). At 500k samples per second, the RF span is 500k (this does not violate Nyquist rule – again, we are dealing with complex numbers). Pretty impressive for a simple handheld.

    The baseband samples are collected by the System on Module’s (SoM) I2S receiver and handled by Alsa & friends. From there, they can be easily accessed (read) using the Audio Source GNU Radio block.

    Samples are converted from 16-bit signed integers to floats internally. That’s one less thing to worry about. Using a Float to Complex block is very handy here. At this point, we need to normalize the frequency response of the signal (equalize the sinc characteristic of the RF front end’s ADC). To do that, it is enough to design a simple, inverse-sinc FIR filter with to get a maximally flat response as a result. This can be done using Matlab (generating the taps) or a simple GNU Radio python block using scipy’s window method (firwin2: reference).

    When the frequency response is flat, it’s time to remove the DC residual with the Remove DC Spike block. I believe that these blocks (FIR and DC removal) can be swapped, so the order doesn’t really matter.

    ZMQ PUB Sink is used for debug purposes – it allows us to peek at the baseband using a PC connected to LinHT.

    Log Power FFT block is doing the DSP heavy lifting. Since the display’s width is 160 pixels, we set the FFT size to 256. Calculated FFT values are saved to a file (/tmp/fft) in a cyclic manner – overwriting the same 1024-byte chunk each time a new set of data is available. Unfortunately, the standard File Sink block can not be used for this purpose, and a custom-made python block is required.

    Contents of the resulting file have to be read and displayed repeatedly. This sample C code does exactly that. 256 FFT values have to be mapped onto 160 pixels. Let’s use a simple rounding method without interpolation, as the device is not a lab-grade measurement instrument:

    map_val[0] = val[0];
    map_val[159] = val[255];
    for(uint8_t i=1; i<RES_X-1; i++)
    {
    	map_val[i] = val[(uint8_t)roundf((i/159.0f)/(1.0f/255.0f))];
    }

    The SX1255 chip can be configured using sx1255-spi tool provided in the LinHT-utils repository. A sample command is as follows:

    sx1255-spi -E -s 500 -r 433475000 -l 18 -p 18 -R 1 -P

    Let’s analyze this command:
    -E resets the device
    -s sets the sample rate to 500kSa/s
    -r sets the receiver’s frequency (units: Hz)
    -l sets the LNA gain (dB)
    -p sets the PGA gain (dB)
    -R enables the receiver chain
    -P displays PLL lock statuses

    Now, the flowgraph can be “compiled” using built-in grcc tool and ran. Needless to say, the GUI C code has to be compiled and ran as well. Here’s a short video demonstrating LinHT’s RF plot capabilities, summarizing all the work described above:

    The RF signal was an M17 text message sent with a modified Nokia 3310, close to the receiver. The peak decay is caused by the GR’s DC spike removal IIR filter block.

    Happy hacking 🙂

  • LinHT – GUI preview

    Here’s a quick preview of a GUI based on Lollo‘s original design shared on our Discord some time ago.

  • LinHT – first GRF5604 RF amplifier tests

    GRF5604 test boards finally arrived. I tested one of them using an HP E4436B RF signal generator. The datasheet mentions gain value of 37.5dB at 460MHz and 5V supply, so I used 0dBm signal to find out if we can get anywhere close to the reference value.

    Right after measuring about 34dBm of CW power, I decided to take a look at the 10W 40dB attenuator used in the test setup. It turned out that its attenuation changes dramatically (5dB or so) upon applying mechanical stress (bending) to its SMA connectors. Since the attenuator is malfunctioning, I will have to perform the test again after getting a reliable, new part.

    For now, let’s focus on the amplified signals. Here’s a set of spectrum plots and eye diagrams for both M17 (4FSK) and TETRA (pi/4-DQPSK):

    The “step” effect at the sides of the TETRA signal will hopefully be mitigated by applying digital predistortion at GNU Radio level. Here’s a sample 2nd order polynomial DPD block for GNU Radio. There’s a good chance that the device will be able to apply predistortion in real-time, based on the measured output signal (feedback loop). A similar approach could be possibly used for IQ imbalance and DC offset correction.

  • LinHT demo: realtime TETRA reception

    Looks like our hardware is fast enough to handle TETRA and decode its ACELP codec in realtime. The system is not our main point of interest, but it was a very interesting experiment, testing our RF front end and signal processing capabilities.

  • Demo LinHT M17 decode

    I used my USRP B210 to transmit a reference M17 RF signal with the recently updated gr-m17. Here’s how LinHT decoded it. There is no signal parameter or RF front-end config display yet (receive/transmit frequencies, SRC and DST callsigns, etc.). For now, all of that data is available through SSH only.

    LinHT decoding M17 RF traffic
    LinHT accessed over SSH: gr-m17 decoder’s debug output

  • First LinHT tests

    The future is here: LinHT booted up successfully for the first time. We believe that Software Defined Transceivers will be the next big trend in amateur radio.

    LinHT is the most important hardware project in Amateur Radio today.
    Bruce Perens, K6BP

    https://perens.com/2025/08/12/whats-wrong-with-ardc/

    The test device has no RF amplifier (although we will include GRF5604 RF amplifier in the next revision, see this). The output power of this test setup is around 5dBm. Frequency range: 420-450MHz (UHF).

    While some doubted that such a design is even viable, we continued our work tirelessly. Big shout out to Vlastimil OK5VAS and Andreas OE3ANC. The project would not be possible without your help, guys.

    Quick, preliminary LinHT preview.

    The device is open source hardware. The PCB design is available here.

    Total cost for a prototype run:
    – $490 for PCB+assembly at PCBWay (5 pcs.)
    – Retevis C62 (donor)
    – $469 for SoM, 5pcs.

  • M17 Specification revision 2.0 release

    The Part I – Air Interface of the M17 Specification document series has been updated. We changed how positional data is encoded in the data stream. The protocol now uses metric units for altitude and speed. Utilization of the META field bits is more effective as well.

    M17 RF Protocol repository: https://github.com/M17-Project/M17_spec

  • Texting with M17 just got easier

    “Did you know you can send SMS via M17?” says the title of Michael DK1MI’s new blog entry:

    There are many possibilities to achieve this but the most convenient one is to use KD0OSS’s fork of OpenRTX on a Connect Systems CS7000, Tytera MD-380 or a Baofeng DM-1701. You can either compile it yourself or download the firmware (for the DM-1701) from my server.

    Below is a screenshot showing the new dashboard Michael is working on, with message display.

    There is one more cool functionality coming. We will keep you informed, so stay tuned.


    Both images courtesy of Michael DK1MI. Danke!

  • Web interface for the CC1200 hotspot

    Michael DK1MI just submitted a video demonstrating his updates expanding rpi-dashboard’s capabilities. His work is available in the “dev” branch.

    Under the hood, the Raspberry Pi runs Jim N1ADJ’s M17 gateway written in Go (based on rpi-interface). It remains the only software solution capable of handling M17 packets and text messages so far.

    Update: new video from Michael!

  • An update on LinHT (OpenHT v2) development process

    We’ve been busy with LinHT development recently, as the plan is to showcase its Proof of Concept at the upcoming M17 Conference 2025. Here’s a quick peek at what we have so far. Our printed circuit board is supposed to fit inside a Retevis C62, replacing its mainboard. We intend to use the radio’s original battery. PCB design by Vlastimil OK5VAS (work in progress).

    (more…)