|
|
1 ay önce | |
|---|---|---|
| .. | ||
| API.md | 1 ay önce | |
| NOTES.md | 1 ay önce | |
| README.md | 1 ay önce | |
| config.plutosdr.json | 1 ay önce | |
| config.sample.json | 1 ay önce | |
go test ./...go run ./cmd/fmrtx -print-configgo run ./cmd/fmrtx -config docs/config.sample.jsongo run ./cmd/fmrtx --dry-run --dry-output build/dryrun/frame.jsongo run ./cmd/fmrtx --simulate-tx --simulate-output build/sim/simulated-soapy.iqf32 --simulate-duration 250msgo run ./cmd/offline -duration 500ms -output build/offline/composite.iqf32Current no-hardware sources:
audio.inputPath (robust chunk-scanning loader)The current no-hardware source can be parameterized via config:
audio.toneLeftHzaudio.toneRightHzaudio.toneAmplitudeThe full signal chain from audio input to IQ output:
FM broadcast requires pre-emphasis to boost high frequencies before transmission. The receiver applies complementary de-emphasis to restore flat response while reducing noise.
preEmphasisUS: 50)preEmphasisUS: 75)preEmphasisUS: 0fmModulationEnabled: true — output is baseband FM-modulated IQ (I² + Q² = 1). This is what SDR transmitters expect.fmModulationEnabled: false — output is raw composite MPX (I = composite, Q = 0). Useful for analysis or composite exciters.When deviceSampleRateHz > compositeRateHz (e.g. Pluto at 2.28 MHz, composite at 228 kHz), the engine automatically activates split-rate mode:
compositeRateHz (228 kHz)FMUpsampler performs FM modulation + phase-domain interpolation to deviceSampleRateHzThis halves CPU load compared to running all DSP at device rate. Log output confirms the active mode:
engine: split-rate mode — DSP@228000Hz → upsample@2280000Hz (ratio 10.00)
When rates are equal (e.g. LimeSDR at 228 kHz), same-rate mode is used:
engine: same-rate mode — DSP@228000Hz
The MPX limiter prevents overmodulation by applying smooth gain reduction when the composite signal exceeds the configured ceiling. A hard clipper acts as a safety net after the limiter.
limiterEnabled: true/falselimiterCeiling: 1.0 (max composite level before FM modulation)Full API documentation: docs/API.md
All major TX parameters are hot-reloadable via POST /config during live transmission — frequency, stereo/mono, RDS text, output drive, pilot/RDS levels, limiter. Changes take effect within 50–88ms without stopping the stream.
Available endpoints: /healthz, /status, /runtime, /config (GET/POST), /dry-run, /tx/start, /tx/stop
cd internalgo test ./...cd examplesgo test ./...go run ./soapy_simulatedThe dry-run mode generates a synthetic, hardware-free frame summary based on the current config. It reports the active source label, pre-emphasis setting, limiter state, and FM modulation mode.
The HTTP control plane also exposes GET /dry-run for quick inspection.
--simulate-tx runs the offline generator through the Soapy-oriented simulated backend path and writes an IQ-style artifact to disk.
cmd/offline generates a deterministic no-hardware IQ/composite file using the full DSP chain (pre-emphasis, stereo encoding, RDS, limiter, FM modulation).
Current honest release posture: pre-v1.
Recommended milestone tag: v0.4.0-pre.
See CHANGELOG.md and RELEASE.md.