Hey everyone! I'm currently developing a digital modem that's designed to be transmitted over HF/VHF amateur bands. My goal is to create a free, fast modem for emergency communications and general amateur use. However, I'm reaching out for some assistance. I'm coding this project in Rust and currently rely on my own calculations for both receiving and transmitting signals. The modem supports multiple modulation types including FSK, MFSK, (Q)PSK, QAM, and OFDM. I'm searching for libraries that can simplify the implementation of these modulations so I don't have to code everything from scratch. I've tried using GNU Radio, but I find it to be overly complex and it hasn't produced the results I need. Thanks for any help!
4 Answers
If you want to skip the implementation of DSP primitives while working in Rust, there are several libraries that might suit your needs, depending on how much control you want over the signal processing. Here are a few to check out:
1. **liquid-dsp** - It's well-liked in SDR projects and already includes many of the modulations you're interested in (like FSK, PSK, QAM, OFDM). It's written in C, but you can bind it in Rust using FFI.
2. **RustDSP / dasp ecosystem** - This is a collection of Rust-native DSP crates. It's a bit lower-level than liquid-dsp but works well within Rust projects, allowing you to create custom signal processing pipelines.
3. **SoapySDR** - While it focuses more on hardware abstraction, it works seamlessly with many SDR tools, simplifying radio interfacing.
4. **VOLK** - Even if you aren't using GNU Radio, VOLK provides useful SIMD-accelerated DSP functions.
In many SDR projects, developers use a combination of a C DSP library, like liquid-dsp, along with Rust for higher-level logic. If your goal is a speedy modem for HF/VHF, liquid-dsp might be the quickest way to get OFDM/QAM working without having to start from scratch.
Wait, did ChatGPT write this? Just wondering, lol.
Consider looking at DSP-focused Rust crates instead of starting everything from the ground up. Libraries like `rustfft` are excellent for FFT, which is crucial for both OFDM and general signal processing, plus there are SDR-related crates that provide useful components for modulation and demodulation. The RustDSP ecosystem is evolving and can save you a lot of work compared to manual implementations.
Another approach is to use existing C/C++ DSP libraries and call them from Rust via FFI. Most established radio and SDR tools are still in C, so wrapping these functions will allow you to utilize reliable algorithms for QAM or PSK without needing to redo all the math. Even if you end up coding some parts manually, having robust FFT, filtering, and buffer management libraries ready will make the whole process of building your modem smoother and easier to maintain.
Are you doing the modulation in software? What's the output like? A quantized signal, maybe? Have you considered using Software Defined Radio (SDR)?
I do use a FLEX 8600M SDR Transceiver! But the idea is to modulate the signal via audio for SSB radio transmission, so the output should be soundcard-based to work with the TNC across different transceivers.
Hey, don't forget about the growing libraries in the Rust space for signal processing. While developing your modem, having access to FFT and filtering libraries will definitely help in handling complex modulations without getting too bogged down in the math. Plus, it could lead to a more maintainable and quicker development cycle for your project.

LIQUID DSP YES!!!! I COMPLETELY FORGOT ABOUT THAT ONE!!! Thanks a ton, and have an awesome day!