News feed

  • LinHT at OpenAlt 2025

    Vlastimil OK5VAS will be presenting LinHT at OpenAlt 2025 in Brno on Sunday, November 2, at noon.

    Update:
    Vlastimil’s talk was streamed live:

    (direct YouTube link)

  • LinHT – GRF5604 RF amplifier tests – part II

    After receiving a new 10W 40dB attenuator, I decided to give the GRF5604 a spin again. I connected it to my LinHT prototype (Revision A hardware, for the record) and supplied with 5.1V. I’ve set the SX1255’s DAC gain to 0dB and mixer gain to -13.5dB, to prevent the power amplifier from saturating.

    Here’s a spectrum plot showing harmonics with the fundamental at 36dBm (M17 signal at 433.475MHz):

    Harmonics are below -60dBc, which I would call a good result (the output filter is a MiniCircuits LFCN-490+). The peak to the left is the PLL reference leakthrough (32MHz).

    Stay tuned for more news.

  • LinHT – CQ DL cover article

    We are making headlines again, this time with the LinHT – our revolutionary, open-source handheld radio running Linux. Make sure to grab CQ DL issue 11-2025 🙂

    Please donate to keep our projects alive: https://www.paypal.com/donate/?hosted_button_id=4HTHZCS8UYPU6

    Thank you!

  • libm17 1.1.1 is out

    This release adds a new function, sq_eucl_norm, and fixes the unterminated-string-initialization warning.

    The squared Euclidean norm (fancy name for a simple sum of squared differences) offers some more robustness, as it doesn’t use sqrtf, which might be computationally expensive. Calculating pure L2 norm is not always required, as the similarity between two vectors can be estimated without using square roots.

    libm17 GitHub repository

  • LinHT – “does it run doom?” act II

    Of course it does. We knew that a while ago!

    While I’m trying to marry M17 text message decoder with SQLite database and Vlastimil OK5VAS is preparing a test PCB for the upcoming Revision B, Andreas OE3ANC prepared a nice fbDOOM demo. This is an important step, demonstrating the SoM’s capabilities. Stay tuned for more news regarding M17 support in our amazing device.


    Extra: quick teaser – M17 message preview. This is not the final design.

  • OpenRTX 0.4.2 is out

    Changes include GPS and RTC improvements along with some code clean-up.

    See the GitHub release page for full changelog: https://github.com/OpenRTX/OpenRTX/releases/tag/v0.4.2

  • GRF5604 RF amplifier boards are now available at PCBWay

    We designed a universal amplifier block for the 70cm band, that can be used with virtually any mode out there (including M17, of course). Thanks to GRF5604’s good linearity, high PAPR modulations, including SSB, QAM, and OFDM, shouldn’t cause much trouble.

    The board should be supplied with 5V. Maximum useful power output (CW) is about 6W. See the chip’s datasheet for more details.

    Note: an adequate heat sink is required. The boards do not come with SMA connectors. PCB’s thickness is 1mm. Output lowpass filter is included.

    Our “Shared Project”: https://www.pcbway.com/project/shareproject/LinHT_RF_amplifier_ff94e9ca.html

    Enjoy!

  • LinHT – SoM thermal management

    Recently, Jacek SQ5BPF performed a very nice experiment. The question that we had was this: how does the SoM behave, thermal-wise, under heavy CPU loads? Is any form of cooling required?

    Jacek plotted a temperature vs. time graph after logging its values for a while, using a simple bash script. It read the CPU’s thermal sensor at a fixed interval, while the machine was stressed with sysbench1:

    #!/bin/bash
    #just get the temp from linht --sq5bpf
    while : ; do
    echo -n "$SECONDS  "
    echo "scale=2;`cat /sys/devices/virtual/thermal/thermal_zone0/temp`/1000" | bc
    sleep 1

    The values were used as-is (the sensor is not calibrated). CPU stress was relieved after 10 minutes. Two test setups were examined: without thermal pads and with pads applied. Thermal conductivity reported by the manufacturer is 6 W/m⋅K.

    1.5mm pads, shaped to even up the bottom of the chassis with the protrusion.
    2mm pads added on top.

    The results are shown below.

    CPU stress was stopped at around 600 seconds mark.

    The CPU clearly runs at much lower temperatures with the pads applied. The test has been conducted at ambient temperature of about 22°C. The CPU idles at 36.5°C with pads applied, which is over 5°C cooler than the baseline.

    Thank you a lot for performing this experiment!

    1. sysbench --time=600 --threads=2 cpu run ↩︎

  • 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.