https://github.com/dernasherbrezon/jradio
Software radio decoding
https://github.com/dernasherbrezon/jradio
decoder dsp gnuradio java radio satellite telemetry
Last synced: 12 months ago
JSON representation
Software radio decoding
- Host: GitHub
- URL: https://github.com/dernasherbrezon/jradio
- Owner: dernasherbrezon
- License: apache-2.0
- Created: 2017-03-31T20:44:11.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2025-03-24T23:00:11.000Z (12 months ago)
- Last Synced: 2025-04-09T21:18:14.154Z (12 months ago)
- Topics: decoder, dsp, gnuradio, java, radio, satellite, telemetry
- Language: Java
- Size: 21.1 MB
- Stars: 63
- Watchers: 11
- Forks: 10
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
[](https://github.com/dernasherbrezon/jradio/actions/workflows/build.yml) [](https://sonarcloud.io/dashboard?id=ru.r2cloud%3Ajradio)
## About
Software radio decoding written in Java. The idea of this project is to get blocks from the [gnuradio](https://github.com/gnuradio) and implement them in Java. This gives the following:
* No need for tooling. You could use [gnuradio-companion](https://wiki.gnuradio.org/index.php/HowToUse) to build a working pipeline, then use the same blocks to build the pipeline in Java.
* All Java benefits: run same binaries on multiple platforms without compilation. Single programming language instead of Python and C++. Better tooling like IDE, profilers and memory analyzers.
## Demodulators
jradio supports high-level generic demodulators. They convert [I/Q signal](https://en.wikipedia.org/wiki/In-phase_and_quadrature_components) into the stream of [soft bits](https://dsp.stackexchange.com/a/27482) (0-255).
* [FSK](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/demod/FskDemodulator.java)
* [AFSK](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/demod/AfskDemodulator.java)
* [BPSK](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/demod/BpskDemodulator.java)
* [QPSK](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/demod/QpskDemodulator.java)
## Modulators
Some generic modulators. They take hard bits and produce I/Q signal.
* [GFSK](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/blocks/GfskModulator.java)
* [BPSK/QPSK](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/blocks/ConstellationModulator.java)
* [FSK](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/blocks/FskModulator.java)
## De-framers
De-framer is a component that converts soft stream of bits into the frames of specific protocol.
* [AX.25](https://en.wikipedia.org/wiki/AX.25) - [Ax25BeaconSource](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/Ax25BeaconSource.java)
* [AX.25](https://en.wikipedia.org/wiki/AX.25) with G3ruh scrambler - [Ax25G3ruhBeaconSource](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/Ax25G3ruhBeaconSource.java)
* [AX100](https://gomspace.com/UserFiles/Subsystems/datasheet/gs-ds-nanocom-ax100-33.pdf) - [Ax100BeaconSource](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/Ax100BeaconSource.java)
* [cc11xx](http://www.ti.com/product/CC1101/description) - [Cc11xxReceiver](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/cc11xx/Cc11xxReceiver.java)
* [NGHam](https://github.com/skagmo/ngham) - Support for [NGHam radio protocol](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/blocks/NgHam.java)
* Generic [syncword](https://en.wikipedia.org/wiki/Syncword) correlator - [CorrelateSyncword](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/blocks/CorrelateSyncword.java)
* [USP](https://github.com/sputnixru/SX-USP) - [UspDecoder](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/usp/UspDecoder.java)
* Mobitex - [MobitexBeaconSource](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/mobitex/MobitexBeaconSource.java)
* TUBiX20 - Generic de-framer for TUB-based satellites. [TUBiX20BeaconSource](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/tubix20/TUBiX20BeaconSource.java)
* CCSDS Concatenated - CCSDS 131.0-B-4 implementation for concatenated framing (Convolutional + Reed-Solomon). [CcsdsBeaconSource](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/ccsds/CcsdsBeaconSource.java)
## Auxiliary tools
Quite often decoding require some additional tooling. jradio has some.
### Forward error correction:
* [Viterbi](https://en.wikipedia.org/wiki/Viterbi_algorithm) [hard](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/fec/Viterbi.java) and [soft](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/fec/ViterbiSoft.java) decoders
* [CCSDS ReedSolomon](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/fec/ccsds/ReedSolomon.java)
* [BCH ReedSolomon](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/fec/rs/bch/ReedSolomon.java)
* [BCH(15,x,x)](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/fec/Bch15.java)
* [Repeat Accumulate decoder](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/fec/ra/RaDecoder.java)
* [Golay](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/fec/Golay.java)
* [PLS](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/fec/PlsDecoder.java)
### Randomization
* [xoroshiro128+](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/util/Xoroshiro128p.java)
* [mt19937](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/util/MTRandom.java)
* [RayleighRandom](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/util/RayleighRandom.java)
### CRC
Most likely the algorithm name can't say you much, so it is better to check [corresponding test case](https://github.com/dernasherbrezon/jradio/tree/master/src/test/java/ru/r2cloud/jradio/crc). Here is list of supported implementations:
* [CRC-8](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/crc/Crc8.java)
* [CRC-16/XMODEM & CRC-16/X-25](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/crc/Crc16Ccitt.java)
* [CRC-16/CCITT-FALSE/CRC-16-IBM](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/crc/Crc16CcittFalse.java)
* [CRC-16/ARC](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/crc/Crc16Arc.java)
* [CRC-16-NAIVE](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/crc/Crc16SumOfBytes.java). Just sum of bytes.
* [CRC-32C](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/crc/Crc32c.java)
### Satellite protocols
* [CSP](https://en.wikipedia.org/wiki/Cubesat_Space_Protocol) - Full support
* [CCSDS](https://en.wikipedia.org/wiki/Consultative_Committee_for_Space_Data_Systems) - [Basic support](https://github.com/dernasherbrezon/jradio/tree/master/src/main/java/ru/r2cloud/jradio/ccsds)
* [PACSAT](https://www.tapr.org/pdf/CNC1990-PacSatBroadcast-NK6K-K8KA.pdf) - [Good support](https://github.com/dernasherbrezon/jradio/tree/master/src/main/java/ru/r2cloud/jradio/falconsat3)
* [OpenLST](https://github.com/OpenLST/openlst) - [OpenLstBeaconSource](https://github.com/dernasherbrezon/jradio/blob/master/src/main/java/ru/r2cloud/jradio/openlst/OpenLstBeaconSource)
## Low-level blocks
All blocks meant to be binary compatible with gnuradio versions. This will ensure you got the same results when moving from gnuradio-companion to Java.
* Add
* AdditiveScrambler
* AGC
* [AX100Decoder](https://gomspace.com/UserFiles/Subsystems/datasheet/gs-ds-nanocom-ax100-33.pdf). Out-of-tree block. Support ASM + Golay mode.
* BinarySlicer
* Cc11xxReceiver. Out-of-tree block. Decodes frames produced by [cc11xx](http://www.ti.com/product/CC1101/description). Based on [gr-cc11xx](https://github.com/andrepuschmann/gr-cc11xx)
* ChannelModel
* ChunksToSymbols and ChunksToSymbolsComplex
* [ClockRecoveryMM](https://www.tablix.org/~avian/blog/archives/2015/03/notes_on_m_m_clock_recovery/) and [ClockRecoveryMMComplex](https://www.tablix.org/~avian/blog/archives/2015/03/notes_on_m_m_clock_recovery/)
* ComplexConjugate
* ComplexToReal
* ConstellationSoftDecoder
* [ConvolutionalDeinterleaver](https://en.wikipedia.org/wiki/Burst_error-correcting_code#Convolutional_interleaver)
* CorrelateSynchronizationMarker. Extract data from continuous stream of synchronization markers. Work with soft stream.
* CorrelateSyncword
* CostasLoop
* DcBlocker
* DelayOne. jradio doesn't support split and merge of streams. This block incapsulates delay 1 for imag complex stream
* Descrambler
* DifferentialEncoder/DifferentialDecoder
* DifferentialSoftDecoder. Support qpsk only
* Divide
* FastNoiseSource
* FIRFilterBlock
* File Source (InputStreamSource)
* File Sink (OutputStreamSink)
* FLL Band Edge
* FloatToChar
* FloatToComplex
* FractionalResampler
* FrequencyModulator
* [FrequencyXlatingFIRFilter](http://blog.sdr.hu/grblocks/xlating-fir.html)
* GUI Histogram Sink (Spectogram)
* HardToSoft. Convert hard decision stream to soft stream.
* HdlcReceiver. Out-of-tree block. Extracts HDLC frame from the unpacked stream of bytes
* HdlcTransmitter. Take the byte array and create hdlc frame
* InterpFIRFilter
* LowPassFilter and LowPassFilterComplex
* LMSDDEqualizer
* MapBlock
* Multiply
* MultiplyConst
* NrziDecode/NrziEncode. Performs nrzi decoding/encoding over unpacked stream of bytes
* osmocom source (RtlTcp)
* PackedToUnpacked
* PolyphaseArbResamplerComplex
* PolyphaseClockSyncComplex
* PeakDetection. Detect peaks in the FFT. Not a gnuradio block.
* QuadratureDemodulation
* Rail
* Rms
* RmsAgc and RmsAgcComplex. Out-of-tree block. For more details see this [blog post](https://destevez.net/2017/08/agc-for-gr-satellites/)
* RootRaisedCosineFilter
* Scrambler
* SigSource
* SequentialSource. Produce time-multiplexed outputs from several sources. Useful in simulations.
* TimeConstraintedSource. Can be used in simulations to time-limit noise source.
* UnpackedToPacked
* WavFileSource
* WavFileSink
Coding:
* NRZI
* Bit stuffing
## Supported satellites
jradio has lots of built-in satellite decoders. Some of them have non standard de-framers, some beacon decoders, some both:
Name
NORAD
Sample code
DELFI-C3 (DO-64)
32789
DelfiC3Test
1Kuns-Pf
43466
KunsPfTest
AAUSAT-4
41460
Aausat4Test
Aistechsat3
44103
Aistechsat3Test
Aistechsat2
43768
Same as Aistechsat3. See Aistechsat3Test
AO-73
39444
Ao73Test
Astrocast 0.1
43798
AstrocastTest
AT03
42784
At03Test
ATL-1
44830
Atl1Test
AU02/AU03
42723/42731
Au02Test
CA03
42734
Ca03Test
D-Star ONE
43881
Dstar1Test
DELPHINI
44030
Delphini1Test
Entrysat
44429
EntrysatTest
ESEO
99912
EseoTest
Fmn1
43192
Fmn1Test
FOX-1A, FOX-1B, FOX-1C, FOX-1D
40967, 43017, 43770, 43137
FoxTest
GOMX-1
39430
Gomx1Test
Itasat1
43786
Itasat1Test
Jy1sat
43803
Nayif1Test
Lucky-7
44406
Lucky7Test
Lume-1 / AISTechSat 2
43908 / 43768
Lume1Test
Meteor-M N2
40069
MeteorImageTest
Mysat-1
44045
Mysat1Test
Nayif1
42017
Nayif1Test
OPS-SAT
44878
OpsSatTest
PwSat2
43776
PwSat2Test
Reactor Hello World
43743
ReaktorHelloWorldTest
S-NET A,B,C,D
43186, 43187, 43188, 43189
SnetTest
Sat3Cat1
99901
Sat3Cat1Test
SMOG-P
44832
SmogPTest
Suomi100
43804
Suomi100Test
SWAMPSAT-2
45115
Swampsat2Test
Technosat
42829
TechnosatTest
QARMAN
45263
QarmanTest
Quetzal1
45598
FskDemodulator 4800 baud, Ax25G3ruhBeaconSource and Quetzal1Beacon
Huskysat-1
45119
Huskysat1Test
Painani-1
44365
FskDemodulator 9600 baud, Ax25G3ruhBeaconSource and Painani1Beacon
CHOMPTT
43855
ChompttTest
ALSAT 1N
41789
Alsat1nTest
STRAND-1
39090
Strand1
PolyItan1
40042
FskDemodulator 9600 baud, Ax25G3ruhBeaconSource and PolyItan1Beacon
Unisat6
40012
FskDemodulator 9600 baud, Ax25G3ruhBeaconSource and Unisat6Beacon
Lightsail2
44420
FskDemodulator 9600 baud, Ax25G3ruhBeaconSource and Lightsail2Beacon
CubeBel-1
43666
FskDemodulator 9600 baud, Ax25G3ruhBeaconSource and Bsusat1Beacon
Salsat
46495
AfskDemodulator 1200 baud, -600 deviation, 1500 offset with Salsat decoder
Armadillo
44352
FskDemodulator 19200 baud, Ax25G3ruhBeaconSource and ArmadilloBeacon
Spooqy1
44332
Spooqy1Test
NORBI
46494
FskDemodulator 9600 baud, Ax25G3ruhBeaconSource and NorbiBeacon
MEZNSAT
46489
FskDemodulator 2400 baud, Ax25G3ruhBeaconSource and MeznsatBeacon
FALCONSAT-3
30776
FskDemodulator 9600 baud, Ax25G3ruhBeaconSource and Falconsat3Beacon
AMICALSAT
46287
AfskDemodulator 1200 baud, Ax25BeaconSource and Amical1Beacon
BOBCAT-1
46922
FskDemodulator 1200 baud, Ax100BeaconSource and Bobcat1Beacon
GRIFEX
40379
FskDemodulator 9600 baud, Ax25G3ruhBeaconSource and GrifexBeacon
BUGSAT-1 (TITA)
40014
FskDemodulator 9600 baud, Ax25G3ruhBeaconSource and BugsatBeacon
TAUSAT-1
47926
BpskDemodulator 9600 baud, Ax25G3ruhDecoder and Tausat1Beacon
UVSQ-SAT
47438
BpskDemodulator 9600 baud, Ax25G3ruhDecoder and UvsqsatBeacon
GRBAlpha
47959
FskDemodulator 9600 baud, Ax25G3ruhBeaconSource and GRBAlphaBeacon
SMOG-1
47964
ru.r2cloud.jradio.smog1.Smog1Beacon
DELFI-PQ
47964
ru.r2cloud.jradio.delfipq.DelfiPqBeacon
GASPACS
51439
ru.r2cloud.jradio.gaspacs.Gaspacs
CUTE
49263
ru.r2cloud.jradio.cute.CuteBeacon
PICSAT
43132
ru.r2cloud.jradio.picsat.PicsatBeacon
INSPIRESAT-1
51657
ru.r2cloud.jradio.is1.InspireSat1Beacon
CTIM
52950
ru.r2cloud.jradio.ctim.CtimBeacon
CSIM-FD
43793
ru.r2cloud.jradio.csim.CsimBeacon
IRIS-A
51044
ru.r2cloud.jradio.iris.IrisABeacon
FEES
48082
ru.r2cloud.jradio.fees.FeesBeacon
SelfieSat
53951
ru.r2cloud.jradio.selfiesat.SelfieSatBeacon
VZLUSAT-2
51085
ru.r2cloud.jradio.vzlusat.Vzlusat2Beacon
NETSAT-*
46507
ru.r2cloud.jradio.netsat.NetSatBeacon
MRC-100
56993
ru.r2cloud.jradio.mrc100.Mrc100
Dhabisat
49016
ru.r2cloud.jradio.dhabi.DhabisatBeacon
CONNECTA T1.1
52739
ru.r2cloud.jradio.connecta.Connecta11Beacon
CELESTA and MTCUBE 2 (ROBUSTA 1F)
53111 and 53109
ru.r2cloud.jradio.celesta.CelestaBeacon
StratoSat TK-1
57167
ru.r2cloud.jradio.sstk1.StratosatTk1 and images via ru.r2cloud.jradio.sstk1.StratosatTk1PictureDecoder
RS52SB, RS52SV, RS52SG, RS52SD, RS52SE
57323, 57324, 57325, 57326, 57167
ru.r2cloud.jradio.sstk1.StratosatTk1PicoBeacon
INSPIRE-SAT 7
56211
SPINO mode - ru.r2cloud.jradio.is7.InspireSat7Spino, AX25 mode using ru.r2cloud.jradio.is7.InspireSat7Beacon
RS20S (GEOSCAN-EDELVEIS)
53385
ru.r2cloud.jradio.geoscan.GeoscanBeacon and images via ru.r2cloud.jradio.geoscan.GeoscanPictureDecoder
SIREN, UMKA-1, CUBESX-HSE-AIS, CYCLOPS, ISOI, KUZBASS-300, MIET-AIS, MONITOR-1, VIZARD, CUBESX-HSE, CUBESX-SIRIUS-HSE, ORBICRAFT-ZORKIY
53384, 57172, 53383, 53373, 53381, 53375, 53377, 53374, 57189, 47952, 47951, 47960
ru.r2cloud.jradio.sputnix.SputnixBeacon
Sharjahsat-1
55104
ru.r2cloud.jradio.sharjahsat.Sharjahsat1Beacon and images via ru.r2cloud.jradio.sharjahsat.Sharjahsat1PictureDecoder
Sapling Giganteum
56214
ru.r2cloud.jradio.sapling.SaplingGiganteumBeacon
ROSEYCUBESAT-1
56212
ru.r2cloud.jradio.roseycub.RoseyCubesatBeacon and images via ru.r2cloud.jradio.roseycub.RoseyPictureDecoder
BDSAT-2
55098
ru.r2cloud.jradio.bdsat.BdSat2Beacon
KAFASAT
58317
ru.r2cloud.jradio.kafasat.KafasatBeacon
RANDEV
52898
ru.r2cloud.jradio.randev.RandevBeacon
VERONIKA
58261
ru.r2cloud.jradio.veronika.VeronikaBeacon
SUCHAI-3, SUCHAI-2, PLANTSAT
52191, 52192, 52188
ru.r2cloud.jradio.suchai2.Suchai2Beacon
GRBBETA
60237
ru.r2cloud.jradio.grbbeta.GRBBetaBeacon
CatSat
60246
ru.r2cloud.jradio.catsat.CatsatBeacon
ENSO
58470
ru.r2cloud.jradio.enso.EnsoBeacon
EIRSAT-1
58472
ru.r2cloud.jradio.eirsat.EirsatBeacon
DORA
61502
ru.r2cloud.jradio.dora.DoraBeacon
Crocube
62394
ru.r2cloud.jradio.crocube.CrocubeBeacon
Lasarsat
62391
ru.r2cloud.jradio.lasarsat.LasarsatBeacon
## Doppler correction
Doppler correction could be made using SigSource and Multiply blocks. Here is the sample code:
```java
PassPredictor predictor = new PassPredictor(tle, currentLocation);
SigSource source2 = new SigSource(Waveform.COMPLEX, sampleRate, new DopplerValueSource(sampleRate, satelliteFrequency, correctPeriodMillis, startTimeMillis) {
@Override
public long getDopplerFrequency(long satelliteFrequency, long currentTimeMillis) {
return predictor.getDownlinkFreq(satelliteFrequency, new Date(currentTimeMillis));
}
}, 1.0f);
Multiply mul = new Multiply(source, source2, true);
```
Where "getDopplerFrequency" can be calculated using [orekit](https://www.orekit.org) or [predict4java](https://github.com/g4dpz/predict4java).
## Usage
Configure maven:
```xml
ru.r2cloud
jradio
1.57
```
## Contributing
Contributing to the project is super easy:
* Raise an issue with description and use case. Skip this step for small bug fixes or minor features
* Raise pull request
* Make sure pull request contains unit tests for new functionality or bug fix