# martinmarinov/tempestsdr architecture

> Architecture diagram of the GitHub repository martinmarinov/tempestsdr, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/martinmarinov/tempestsdr
- Repository: https://github.com/martinmarinov/tempestsdr

## Overview

TempestSDR is a Java GUI and native C toolkit that reconstructs video imagery from signals captured by SDR receivers or read from a sample file. The principal workflow is GUI configuration, source selection and plugin loading, sample acquisition, native signal processing and frame delivery to visualizers. The documented capabilities also include automatic resolution and refresh-rate estimation, synchronization controls, SNR and plot feedback, and post-processing. The README and sampled excerpts support the overall architecture; several GUI and DSP links reflect documented capabilities rather than inspected implementation details.

Main entry points: [`JavaGUI/src/martin/tempest/core/TSDRLibrary.java`](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/core/TSDRLibrary.java) (Java API), [`TempestSDR/src/TSDRLibrary.c`](https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/TSDRLibrary.c) (TSDR engine), [`TempestSDR/src/TSDRPluginLoader.c`](https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/TSDRPluginLoader.c) (Plugin loader), [`JavaGUI/src/martin/tempest/gui/Main.java`](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/Main.java) (Main window)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_gui["GUI and controls"]
  node_main["Main window<br/>[Main.java]"]
  node_source_catalog["Source catalog<br/>[TSDRSource.java]"]
  node_source_settings["Source settings<br/>[TSDRSource.java]"]
end

subgraph group_sources["Input sources"]
  node_raw_plugin["Raw-file plugin"]
  node_mirics_plugin["Mirics plugin"]
  node_sdrplay_plugin["SDRplay plugin"]
  node_extio_plugin["ExtIO plugin<br/>[TSDRPlugin_ExtIO.c]"]
  node_uhd_plugin["UHD plugin<br/>[TSDRPlugin_UHD.cpp]"]
end

subgraph group_native["Native processing"]
  node_wrapper["Java API<br/>[TSDRLibrary.java]"]
  node_jni["JNI bridge<br/>[TSDRLibraryNDK.c]"]
  node_engine["TSDR engine<br/>[TSDRLibrary.c]"]
  node_plugin_loader["Plugin loader<br/>[TSDRPluginLoader.c]"]
  node_dsp["Signal processing<br/>[dsp.c]"]
  node_sync["Sync and detection<br/>[syncdetector.c]"]
  node_frame_rate["Rate estimation"]
end

subgraph group_feedback["Frames and feedback"]
  node_frame_view["Image visualizer"]
  node_plots["Plot visualizers"]
  node_snr["SNR visualizer<br/>[SNRVisualizer.java]"]
  node_auto_scale["Auto scale"]
end

node_operator(("Operator"))
node_receiver["SDR receiver"]
node_file["Sample file"]

node_operator -->|"configures"| node_main
node_main -->|"lists sources"| node_source_catalog
node_main -->|"configures source"| node_source_settings
node_main -->|"controls capture"| node_wrapper
node_source_settings -->|"supplies plugin settings"| node_wrapper
node_wrapper -->|"invokes native API"| node_jni
node_jni -->|"calls library API"| node_engine
node_engine -->|"loads plugin"| node_plugin_loader
node_plugin_loader -->|"dispatches"| node_raw_plugin
node_plugin_loader -->|"dispatches"| node_mirics_plugin
node_plugin_loader -->|"dispatches"| node_sdrplay_plugin
node_plugin_loader -->|"dispatches"| node_extio_plugin
node_plugin_loader -->|"dispatches"| node_uhd_plugin
node_raw_plugin -->|"reads samples"| node_file
node_mirics_plugin -->|"captures samples"| node_receiver
node_sdrplay_plugin -->|"captures samples"| node_receiver
node_extio_plugin -->|"captures samples"| node_receiver
node_uhd_plugin -->|"captures samples"| node_receiver
node_raw_plugin -->|"streams samples"| node_engine
node_mirics_plugin -->|"streams samples"| node_engine
node_sdrplay_plugin -->|"streams samples"| node_engine
node_extio_plugin -->|"streams samples"| node_engine
node_uhd_plugin -->|"streams samples"| node_engine
node_engine -->|"processes samples"| node_dsp
node_dsp -->|"feeds synchronization"| node_sync
node_dsp -->|"supports rate detection"| node_frame_rate
node_jni -->|"delivers callbacks"| node_wrapper
node_wrapper -->|"delivers frames"| node_frame_view
node_wrapper -->|"delivers plot data"| node_plots
node_wrapper -->|"delivers SNR values"| node_snr
node_wrapper -->|"delivers scale feedback"| node_auto_scale
node_operator -->|"views output"| node_frame_view

click node_main "https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/Main.java"
click node_source_catalog "https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/sources/TSDRSource.java"
click node_source_settings "https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/sources/TSDRSource.java"
click node_wrapper "https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/core/TSDRLibrary.java"
click node_jni "https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/jni/TSDRLibraryNDK.c"
click node_engine "https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/TSDRLibrary.c"
click node_plugin_loader "https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/TSDRPluginLoader.c"
click node_dsp "https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/dsp.c"
click node_sync "https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/syncdetector.c"
click node_frame_rate "https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/frameratedetector.c"
click node_raw_plugin "https://github.com/martinmarinov/tempestsdr/blob/master/TSDRPlugin_RawFile/src/TSDRPlugin_RawFile.c"
click node_mirics_plugin "https://github.com/martinmarinov/tempestsdr/blob/master/TSDRPlugin_Mirics/src/TSDRPlugin_Mirics.c"
click node_sdrplay_plugin "https://github.com/martinmarinov/tempestsdr/blob/master/TSDRPlugin_SdrPlay/src/TSDRPlugin_SDRPlay.c"
click node_extio_plugin "https://github.com/martinmarinov/tempestsdr/blob/master/TSDRPlugin_ExtIO/src/TSDRPlugin_ExtIO.c"
click node_uhd_plugin "https://github.com/martinmarinov/tempestsdr/blob/master/TSDRPlugin_UHD/src/TSDRPlugin_UHD.cpp"
click node_frame_view "https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/ImageVisualizer.java"
click node_plots "https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/PlotVisualizer.java"
click node_snr "https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/SNRVisualizer.java"
click node_auto_scale "https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/AutoScaleVisualizer.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_main,node_source_catalog,node_source_settings toneBlue
class node_raw_plugin,node_mirics_plugin,node_sdrplay_plugin,node_extio_plugin,node_uhd_plugin toneAmber
class node_wrapper,node_jni,node_engine,node_plugin_loader,node_dsp,node_sync,node_frame_rate toneMint
class node_frame_view,node_plots,node_snr,node_auto_scale toneRose
class node_operator,node_receiver,node_file toneIndigo
```

## Components

### GUI and controls

- [Main window](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/Main.java): `JavaGUI/src/martin/tempest/gui/Main.java`
- [Source catalog](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/sources/TSDRSource.java): `JavaGUI/src/martin/tempest/sources/TSDRSource.java`
- [Source settings](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/sources/TSDRSource.java): `JavaGUI/src/martin/tempest/sources/TSDRSource.java`

### Input sources

- [Raw-file plugin](https://github.com/martinmarinov/tempestsdr/blob/master/TSDRPlugin_RawFile/src/TSDRPlugin_RawFile.c): `TSDRPlugin_RawFile/src/TSDRPlugin_RawFile.c`
- [Mirics plugin](https://github.com/martinmarinov/tempestsdr/blob/master/TSDRPlugin_Mirics/src/TSDRPlugin_Mirics.c): `TSDRPlugin_Mirics/src/TSDRPlugin_Mirics.c`
- [SDRplay plugin](https://github.com/martinmarinov/tempestsdr/blob/master/TSDRPlugin_SdrPlay/src/TSDRPlugin_SDRPlay.c): `TSDRPlugin_SdrPlay/src/TSDRPlugin_SDRPlay.c`
- [ExtIO plugin](https://github.com/martinmarinov/tempestsdr/blob/master/TSDRPlugin_ExtIO/src/TSDRPlugin_ExtIO.c): `TSDRPlugin_ExtIO/src/TSDRPlugin_ExtIO.c`
- [UHD plugin](https://github.com/martinmarinov/tempestsdr/blob/master/TSDRPlugin_UHD/src/TSDRPlugin_UHD.cpp): `TSDRPlugin_UHD/src/TSDRPlugin_UHD.cpp`

### Native processing

- [Java API](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/core/TSDRLibrary.java): `JavaGUI/src/martin/tempest/core/TSDRLibrary.java`
- [JNI bridge](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/jni/TSDRLibraryNDK.c): `JavaGUI/jni/TSDRLibraryNDK.c`
- [TSDR engine](https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/TSDRLibrary.c): `TempestSDR/src/TSDRLibrary.c`
- [Plugin loader](https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/TSDRPluginLoader.c): `TempestSDR/src/TSDRPluginLoader.c`
- [Signal processing](https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/dsp.c): `TempestSDR/src/dsp.c`
- [Sync and detection](https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/syncdetector.c): `TempestSDR/src/syncdetector.c`
- [Rate estimation](https://github.com/martinmarinov/tempestsdr/blob/master/TempestSDR/src/frameratedetector.c): `TempestSDR/src/frameratedetector.c`

### Frames and feedback

- [Image visualizer](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/ImageVisualizer.java): `JavaGUI/src/martin/tempest/gui/ImageVisualizer.java`
- [Plot visualizers](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/PlotVisualizer.java): `JavaGUI/src/martin/tempest/gui/PlotVisualizer.java`
- [SNR visualizer](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/SNRVisualizer.java): `JavaGUI/src/martin/tempest/gui/SNRVisualizer.java`
- [Auto scale](https://github.com/martinmarinov/tempestsdr/blob/master/JavaGUI/src/martin/tempest/gui/AutoScaleVisualizer.java): `JavaGUI/src/martin/tempest/gui/AutoScaleVisualizer.java`

### Other components

- **Operator**
- **SDR receiver**
- **Sample file**

## Connections

- Operator → Main window: configures
- Main window → Source catalog: lists sources
- Main window → Source settings: configures source
- Main window → Java API: controls capture
- Source settings → Java API: supplies plugin settings
- Java API → JNI bridge: invokes native API
- JNI bridge → TSDR engine: calls library API
- TSDR engine → Plugin loader: loads plugin
- Plugin loader → Raw-file plugin: dispatches
- Plugin loader → Mirics plugin: dispatches
- Plugin loader → SDRplay plugin: dispatches
- Plugin loader → ExtIO plugin: dispatches
- Plugin loader → UHD plugin: dispatches
- Raw-file plugin → Sample file: reads samples
- Mirics plugin → SDR receiver: captures samples
- SDRplay plugin → SDR receiver: captures samples
- ExtIO plugin → SDR receiver: captures samples
- UHD plugin → SDR receiver: captures samples
- Raw-file plugin → TSDR engine: streams samples
- Mirics plugin → TSDR engine: streams samples
- SDRplay plugin → TSDR engine: streams samples
- ExtIO plugin → TSDR engine: streams samples
- UHD plugin → TSDR engine: streams samples
- TSDR engine → Signal processing: processes samples
- Signal processing → Sync and detection: feeds synchronization
- Signal processing → Rate estimation: supports rate detection
- JNI bridge → Java API: delivers callbacks
- Java API → Image visualizer: delivers frames
- Java API → Plot visualizers: delivers plot data
- Java API → SNR visualizer: delivers SNR values
- Java API → Auto scale: delivers scale feedback
- Operator → Image visualizer: views output
