M0LTE.Dsp
0.2.0
dotnet add package M0LTE.Dsp --version 0.2.0
NuGet\Install-Package M0LTE.Dsp -Version 0.2.0
<PackageReference Include="M0LTE.Dsp" Version="0.2.0" />
<PackageVersion Include="M0LTE.Dsp" Version="0.2.0" />
<PackageReference Include="M0LTE.Dsp" />
paket add M0LTE.Dsp --version 0.2.0
#r "nuget: M0LTE.Dsp, 0.2.0"
#:package M0LTE.Dsp@0.2.0
#addin nuget:?package=M0LTE.Dsp&version=0.2.0
#tool nuget:?package=M0LTE.Dsp&version=0.2.0
M0LTE.Dsp
Dependency-free digital-signal-processing primitives for .NET, extracted from the pdn-soundmodem packet-radio modem. Nothing here is radio-specific — it's general-purpose DSP (standard-API / textbook building blocks).
| Type | What it is |
|---|---|
Fft |
Iterative in-place radix-2 complex FFT (power-of-2 lengths). |
FilterDesign |
Windowed-sinc (Hann) FIR design: LowPass, BandPass, and a RootRaisedCosine pulse. |
FirFilter |
Streaming FIR filter — per-sample MAC over a circular history. |
Decimator |
Anti-aliased FIR decimator (computes the FIR only at output instants). |
Upsampler |
Image-rejecting FIR interpolating upsampler — the transmit-side mirror of Decimator. |
FrequencyShifter |
Analytic-signal (Hilbert) SSB frequency translator — moves a real signal by N Hz with no mirror image, at the same rate. |
SpectrumSource |
Turns an audio stream into dB-scaled waterfall lines (Hann-windowed FFT, one byte per bin). |
OccupiedBandwidth |
ITU-R SM.443 occupied-bandwidth meter (Welch-averaged, Hann, 50 % overlap). |
SsbDemodulator |
Single sideband from complex baseband: IQ in, real audio out. The readable reference form — holds the whole signal. |
StreamingSsbDemodulator |
The same filter block-at-a-time, in constant memory and ~4× less arithmetic — what an unbounded stream or a live SDR needs. |
- Targets
net10.0. No third-party package dependencies — just the BCL. - Public API is locked by a build-time test and the package follows
Semantic Versioning; see
docs/versioning.md.
Install
dotnet add package M0LTE.Dsp
Quick start
using M0LTE.Dsp;
// Radix-2 FFT (in place, real/imaginary spans of equal power-of-2 length):
float[] re = new float[1024];
float[] im = new float[1024];
for (int i = 0; i < re.Length; i++)
re[i] = MathF.Sin(2 * MathF.PI * 100 * i / re.Length); // a tone at bin 100
Fft.Forward(re, im);
// Anti-aliased ÷4 decimation, 48 kHz → 12 kHz:
var decimator = new Decimator(inputRate: 48000, factor: 4);
float[] input = new float[48000];
float[] output = new float[decimator.MaxOutput(input.Length)];
int produced = decimator.Process(input, output);
// Design a 1500 Hz low-pass FIR and stream samples through it:
var fir = new FirFilter(FilterDesign.LowPass(cutoffHz: 1500, sampleRate: 12000, taps: 96));
float y = fir.Next(0.5f);
// Occupied bandwidth (ITU-R SM.443), e.g. the 99 % OBW of a captured signal:
var (lowHz, highHz, widthHz, peakHz) = OccupiedBandwidth.Measure(output, sampleRate: 12000);
// SSB from an SDR's complex baseband: 48 kHz IQ in, 12 kHz USB audio out. Because you hold
// the baseband, the receive filter is yours to choose rather than a rig's to impose.
var ssb = new StreamingSsbDemodulator(new SsbDemodulatorOptions
{
InputRate = 48000,
OutputRate = 12000,
Sideband = Sideband.Upper,
DialHz = 0, // the receiver is tuned to the dial, so the carrier is at DC
SsbLowHz = 150, SsbHighHz = 3450,
});
short[] iq = new short[9600]; // interleaved I,Q,I,Q…
float[] audio = new float[ssb.MaxOutputFor(iq.Length / 2)];
int wrote = ssb.Process(iq, audio);
(Exact constructor/method signatures are in the XML docs shipped with the package.)
Licence
AGPL-3.0-or-later (see LICENSE). The implementations are standard-API /
textbook DSP — the design choices mirror QtSoundModem but no code was transcribed, so the
package is permissively relicensable and is shipped AGPL-3.0-or-later by choice to match
the M0LTE.* family. See PROVENANCE.md.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
NuGet packages (3)
Showing the top 3 NuGet packages that depend on M0LTE.Dsp:
| Package | Downloads |
|---|---|
|
pdn-soundmodem
Headless soundcard packet modem core: IL2P/AX.25 framing and FEC now; demodulators, KISS TCP and DCD to follow. |
|
|
M0LTE.Pocsag
A dependency-light POCSAG paging codec for .NET: CCIR Radiopaging Code No. 1 (ITU-R M.584-2) encode and decode, with BCH(31,21) error correction, numeric and alphanumeric pages, tone-only pages, and the DAPNET amateur-paging conventions (512 / 1200 / 2400 bd, function-bit and padding conventions). Encodes pages to baseband 2-FSK audio for an FM radio's data port and decodes audio back to pages with polarity auto-detection. Extracted from the pdn-soundmodem packet-radio modem; implemented spec-first and cross-validated against multimon-ng. |
|
|
M0LTE.FmChannel
A physical FM link simulator for measuring soundcard modems: audio is really frequency-modulated onto a carrier, noise is added there at a stated carrier-to-noise ratio, and a limiter and discriminator bring it back through the radio's real audio paths. The threshold effect, triangular discriminator noise, pre/de-emphasis and band limits all emerge rather than being asserted. |
GitHub repositories
This package is not used by any popular GitHub repositories.