Warning
This code is still experimental and was only tested on very specific conditions.
- Network Source (UDP or TCP | Server or Client) ✅
- Terminal Sink (F32 or CF32) ✅
- FIR Filter (Decimating or Interpolating) ✅
- Polyphase FIR (Decimating or Interpolating) ✅ - "Faster" Polyphase implementation useful for resampling.
- FIR Taps Generator (Gaussian, Lowpass, Root Raised Cosine) ✅
- CIC Filter (Decimating or Interpolating)
⚠️
- AGC (Automatic Gain Control) ✅
- FM Modulator ✅
- FM Demodulator (Differentiate & Delay)
⚠️ - Constellation Mapper (Converts Bits to Symbols) ✅
- Constellation Demapper (Converts Symbols to Bits) ✅
- Carrier Recovery (Decision-Directed, ML) ✅
- Timing PLL (Decision-Directed Timing Recovery)
⚠️
- Wave File Writing (.wav) for debugging tests
Some blocks are [EXPERIMENTAL] and marked with the
-
Afsk Modulator (BELL 202 Like 1200Bd FSK Modulator)
-
Gmsk Modulator (GMSK 4800bd Modulator)
You will need a C++ Compiler with support for C++17 or greater, CMake and Make or Ninja...
1 - Clone the repo and cd into it:
git clone https://github.com/Paulo-D2000/PopoSDR.git
cd PopoSDR
2 - Now create a build folder and run cmake inside:
mkdir build
cd build
cmake ..
3 - Then run make OR ninja:
make
ninja
4 - Try some examples :)
-
AFSK Test ✅ - Generates AFSK Packets and demodulates them writing some debug Wave files.
-
GMSK Test ✅ - Generates GMSK Packets with CCSDS Syncword and demodulates them printing the detected syncwords, also writes debugging Wave files.
-
Main Test
⚠️ - This is just some general testing code, ignore it please.
-
WFM Mono UDP ✅ - Reads S16-LE IQ samples at 1 MHz SampleRate from one local UDP client on port 1234 feeds them to one WFM (Wide FM Station) demodulates the Mono chanel and writes one 48KHz S16-LE audio stream on stdout.
-
GMSK Rx
⚠️ - Reads S16-LE IQ samples at 1MHz SampleRate from one local TCP server on port 1234 feeds them to a 1200Bd GMSK BT=0.5 demodulator that searches for the0x1ACFFC1D
Syncword and prints their data to stderr. It also outputs one S16LE 4800Hz stream on stdout for debugging. -
QAM RX
⚠️ - Reads S16-LE IQ samples at 48KHz SampleRate from one local TCP and feeds them to the experimental 16-QAM Demodulator outputting the synchronized IQ symbols via stdout as one 6000Hz IQ S16-LE stream... This is still on the testing phase!
- S16-LE - 16 bit signed integer
- IQ - Quadrature signal, 2 channels, Real & Imaginary
- The TimingPLL Block has 2 variants, Real (F32) and Complex (CF32), the first one was inspired on DireWolf's AFSK PLL while the second one uses a Maximum Likelyhood (ML-TED) with a Polyphase FIR Bank Interpolator. The Interpolator can set to (MMSE) 'Minimum Mean Square Error' having 128 arms or to (PFB) 'Matched Polyphase FIR Bank' with a variable number of filter arms.
- ✅ Upload code.
- ✅ Get a modem example working.
- ✅ Fix the modulator code to generate the GMSK waveform again - AFSK1200 right now...
- ✅ Split the lib and modem code
- ⬜ Refactor modulator code.
- ⬜ Make the demodulator class & cleanup main
- ⬜ Make a modem class.
- ✅ Move main code to examples
- ✅ Setup CMake to build the lib / modems / examples
- ⬜ Refactor the TimingPLL class.
- ⬜ Add one build guide.
- ⬜ Document some of the API.
- ⬜ Add more blocks.
- ✅ Implement AFSK modulator
- ✅ Implement one PSK modulator
- ⬜ Implement one Burst PSK demodulator (FFT-based)
- ✅ Implement one Decision directed synchronizer (a * conj(â))
- ⬜ Add SoapySDR ?
- ⬜ Add one Example with Real Harware + SDR Modem
- ⬜ Implement more advanced synchronizers
- ⬜ Complete GMSK modem
- ⬜ Complete FSK / AFSK modems
- ⬜ Complete M-PSK / QAM / APSK modems
- ⬜ Add OFDM ?
- ⬜ Add DSSS / CDMA ?