M0LTE.Dsp 0.2.0

dotnet add package M0LTE.Dsp --version 0.2.0
                    
NuGet\Install-Package M0LTE.Dsp -Version 0.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="M0LTE.Dsp" Version="0.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="M0LTE.Dsp" Version="0.2.0" />
                    
Directory.Packages.props
<PackageReference Include="M0LTE.Dsp" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add M0LTE.Dsp --version 0.2.0
                    
#r "nuget: M0LTE.Dsp, 0.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package M0LTE.Dsp@0.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=M0LTE.Dsp&version=0.2.0
                    
Install as a Cake Addin
#tool nuget:?package=M0LTE.Dsp&version=0.2.0
                    
Install as a Cake Tool

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.

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • 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.

Version Downloads Last Updated
0.2.0 551 8/2/2026
0.1.1 288 7/18/2026
0.1.0 397 7/17/2026