Skip to content

Paulo-D2000/PopoSDR

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PopoSDR

Warning

This code is still experimental and was only tested on very specific conditions.

C/C++ Based SDR library with multithreaded pipelined DSP blocks

Available Blocks:

Sources:
  • Network Source (UDP or TCP | Server or Client) ✅
Sinks:
  • Terminal Sink (F32 or CF32) ✅
Filters:
  • 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) ⚠️
General:
  • AGC (Automatic Gain Control) ✅
  • FM Modulator ✅
  • FM Demodulator (Differentiate & Delay) ⚠️
  • Constellation Mapper (Converts Bits to Symbols) ✅
  • Constellation Demapper (Converts Symbols to Bits) ✅
Synchronizers:
  • Carrier Recovery (Decision-Directed, ML) ✅
  • Timing PLL (Decision-Directed Timing Recovery) ⚠️
Utils:
  • Wave File Writing (.wav) for debugging tests

Some blocks are [EXPERIMENTAL] and marked with the ⚠️ this means they have some strange behaivour in some cases or just haven't been tested enough.

Modems (STILL IN DEV)

  • Afsk Modulator (BELL 202 Like 1200Bd FSK Modulator)

  • Gmsk Modulator (GMSK 4800bd Modulator)

Little Build Guide:

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 :)

Examples (EXPERIMENTAL)

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

Network sources:
  • 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 the 0x1ACFFC1D 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!

Info:

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

// TODO

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

// Future plans / Goals

  • ✅ 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 ?

About

C/C++ Based SDR Library with dsp blocks

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published