Daniel Estévez

Daniel Estévez

@destevez.net

Everything space & RF. Amateur radio operator (EA4GPZ / M0HXM). PhD in Mathematics from Univ. Autónoma de Madrid. he/him

696 followers67 following373 posts

New blog post: A high sensitivity ADS-B receiver. I present a new ADS-B receiver written in Rust that outperforms existing open source receivers such as readsb: ~3x more messages in typical real world terrestrial scenarios and ~2000x more in simulated LEO scenarios.

View full thread

Additionally, I explain how I have used AI extensively during this project, not to write code, but to help me by reviewing my code, debugging failed unit tests, proposing new unit tests and doing online searches. The goal in using AI here is to write code better, not faster.

New blog post: A high sensitivity ADS-B receiver. I present a new ADS-B receiver written in Rust that outperforms existing open source receivers such as readsb: ~3x more messages in typical real world terrestrial scenarios and ~2000x more in simulated LEO scenarios.

View full thread

The project also has a signal simulator that can generate scenarios containing all the Mode-S and Mode-A/C SSR reply messages at 1090 MHz. This can be used to benchmark the receiver performance in scenarios with CN0 distributions typical of terrestrial and LEO receivers.

New blog post: A high sensitivity ADS-B receiver. I present a new ADS-B receiver written in Rust that outperforms existing open source receivers such as readsb: ~3x more messages in typical real world terrestrial scenarios and ~2000x more in simulated LEO scenarios.

I explain the ideas that went into the design of the DSP of this receiver. The key insight is treating the Mode-S PPM modulation as Manchester-coded phase modulation with residual carrier. This allows us to do FFT-based residual carrier detection and coherent demodulation.

New blog post: Decoding the Roman Space Telescope. On August 31 I observed the Roman telescope S-band telemetry with the Allen Telescope Array some time after launch. This post is a summary of the observation, including the telemetry decode and a preliminary analysis.

New blog post: On matched filtering in the presence of carrier frequency offset. In this short maths note I explain how to tweak a matched filter to improve the SNR when there is carrier frequency offset.

View full thread

I close with some remarks about usage in practice. When the frequency grid spacing is narrower than the inverse of the number of samples, the conventional matched filter performs quite well and the DPSS-windowing improvement is small. For larger spacings it provides a minor gain.

New blog post: On matched filtering in the presence of carrier frequency offset. In this short maths note I explain how to tweak a matched filter to improve the SNR when there is carrier frequency offset.

Concretely, I explain how to maximize the average SNR when a bank of filters spaced on a regular grid of frequencies is used and the carrier frequency offset is distributed uniformly.

New blog post: X-engine correlator on a Ryzen NPU. A few months ago I posted about the basics of NPUs in Ryzen AI chips. I wanted to tackle a real-world problem to get more experience, so I've implemented an X-engine correlator like the ones used in radio astronomy.

View full thread

Next I consider the data flow through the whole NPU array. This leads to a design of the Ethernet packets that the X-engine ingests. There is a tradeoff between having the data in the order that the X-engine prefers and having it in an order that is easy to generate in the PFBs.

New blog post: X-engine correlator on a Ryzen NPU. A few months ago I posted about the basics of NPUs in Ryzen AI chips. I wanted to tackle a real-world problem to get more experience, so I've implemented an X-engine correlator like the ones used in radio astronomy.

View full thread

In the blog post I go over all the details of the bottom-up design and implementation and all the challenges I found. I explain how to do some back-of-the-envelope calculations to estimate performance before we begin coding.

Then I implement and benchmark the C++ kernel that does the matrix multiplication (of some submatrices), and I discuss some factors that can cause performance loss, such as memory bank conflicts. Then I design how to use the compute tile memory and DMA data flows.

New blog post: X-engine correlator on a Ryzen NPU. A few months ago I posted about the basics of NPUs in Ryzen AI chips. I wanted to tackle a real-world problem to get more experience, so I've implemented an X-engine correlator like the ones used in radio astronomy.

View full thread

Testing this design on a Ryzen laptop is just for prototyping and learning. The X-engine ingests 65.5 GB/s and there is no way that I can input that amount of data from the outside world into a laptop (this Ryzen SoC has 16x PCIe 4.0, which would give 31.5 GB/s).

The right platform to deploy this kind of X-engine would be a Versal AI Edge Gen2 FPGA, which has an AIE-ML v2 engine that is very similar to this Ryzen NPU. However, ingesting such a high data rate on these Versal parts is also challenging (the large parts have 3x 100GbE MACs).

New blog post: X-engine correlator on a Ryzen NPU. A few months ago I posted about the basics of NPUs in Ryzen AI chips. I wanted to tackle a real-world problem to get more experience, so I've implemented an X-engine correlator like the ones used in radio astronomy.

NPUs are essentially arrays of vector processors intended to perform large matrix multiplications very fast, and an X-engine does just that: a large matrix product. However, getting the X-engine running right on the NPU is trickier than it sounds, due to many low-level factors.

My implementation handles 256 streams (which can be 128 dual polarization antennas) at 64 Msps IQ (aggregated rate over a number of PFB channels) in real time. The NPU uses 1W of power, and the whole Ryzen SoC uses 25W. It is amazing how much compute we get for that power.

As we're seeing more and more issues and PRs that use LLMs in some way, the gr-satellites project is considering adopting an AI policy to have clearer guidelines of what to expect and how to proceed. If you have strong thoughts, join the discussion in github.com/daniestevez/...

github.comRequest: Add an AI policy, maybe · Issue #849 · daniestevez/gr-satellitesPer the discussion in #846, it'd be helpful to have an AI usage policy for contributions in this repository.

This Sentinel-2 infrared image from yesterday shows the extent of the Madrid wildfires, which are now stable and do not show any smoke in satellite imagery. The false colour map shows two shortwave infrared bands (B12 and B11) in red and blue, and near infrared (B8) in green.

Burnt areas appear in dark red or purple, due to the dryness causing lower water absorption in shortwave infrared, and higher absorption in near infrared caused by soot. Healthy vegetation appears in green due to the high reflectance of leaf cellular structures in near infrared.

The Madrid "Sierra oeste" fire can be seen as a large purple region in the centre right of the image. On the upper left, the scar left by last year's Orense's fires can still be seen as lighter purple blotches. Smaller fires can be seen peppered across Spain and Portugal.

Muon Space is looking for an FPGA engineer for RF signal processing. Join a team of FPGA engineers and RF DSP engineers including myself to build state of the art RF instruments. Ability to access ITAR/EAR information required. DM me if you are interested or have questions.

New blog post: PLL coefficients for rate-only feedback. A couple years ago I wrote a post that extends a paper of Stephens and Thomas where they model PLLs in discrete time rather than transforming a continuous-time design.

I showed that the loop coefficients for an order 2 loop with supercritical damping and phase/phase-rate update have explicit formulas that are obtained by solving a cubic equation. Now I treat the rate-only update case, showing that it leads to a degree 6 equation.

Daniel Estévez reposted

Tianwen-2 at #Asteroid (469219) Kamoʻoalewa now transmitting at High Data Rate!! Receiving with the 20m #Bochum antenna on X-Band.

Daniel Estévez reposted

We think a Tianwen-2 manoever happened early 7 June, as expected. With the Bochum telescope (@amsat-dl.org) and the Dwingeloo telescope, we observe that a) Tianwen-2 is close to the asteroid on the sky and b) the change in the line-of-sight velocity (Doppler) now almost matches that of the asteroid.

Daniel Estévez reposted

Just a quick update on Tianwen-2. We saw several events before LOS- At 23:06:10 UTC the data rate was reduced, probably in preparation for some trajectory maneuvers.

New blog post: An update about Tianwen-2 telemetry. This is a quick update about Tianwen-2 telemetry decoding. First, I've figured out the format of the timestamps included in AOS frames. I explain what was confusing me yesterday.

More fun with the Ryzen AI NPU. I'm working on a more complex algorithm, and I'm seeing memory stalls that make me lose one cycle in each iteration. It turns out that the data memory of compute tiles is organized as 8x 256-bit wide 8 KiB memory banks.

Each bank supports one simultaneous access, and every two banks are interleaved to form a 512-bit wide 16 KiB virtual bank. The two load units of the processor can perform simultaneous 512-bit loads only if these target different 16 KiB banks.

This is somewhat hidden to the programmer because the linker script tries to place the buffers in different banks when possible. However, it's relevant when there are more buffers than banks or when trying to access multiple elements from the same buffer, which is what I ran into.