Repository navigation
Module_SignalProcessing_Signals
Location: Home / Signal processing / Signals
The Vorcyc.Mathematics.SignalProcessing.Signals namespace provides time-domain and frequency-domain signal definitions and editing utilities.
0.9 recommended API
| Type | Description |
|---|---|
Signal |
Primary single-threaded real time-domain type: float sample rate, pinned buffer, Samples as Span<float>, implements ISingleThreadTimeDomainSignal
|
SignalSegment |
Zero-copy slice signal[start, length] of parent Signal; frame-level SIMD statistics and features |
SignalExtensions |
Signal editing and frame statistics extensions (replaces obsolete DiscreteSignalExtensions) |
ComplexDiscreteSignalFp32 |
Complex discrete signal (convolution, frequency-domain ops, etc.) |
Signals.Generators.* |
0.9+ sample-by-sample generators (ISampleGenerator) and offline ToSignal / Fill helpers |
Compatibility / obsolete
-
DiscreteSignal,DiscreteSignalExtensions: still available, marked[Obsolete]; useSignal/SignalExtensionsorDiscreteSignal.ToSignal(). - The legacy
Signals.Builders.*types have been removed; useGeneratorsinstead (see migration table). - The
DiscreteSignalsections below are kept for migration reference; new code should use the Signal class.
Namespace: Vorcyc.Mathematics.SignalProcessing.Signals.Generators
Streaming / offline waveform synthesis. ISampleGenerator.NextSample() drives per-sample generation; SampleGeneratorExtensions fills a Signal or builds one via ToSignal(length, samplingRate).
| Type | Description |
|---|---|
ISampleGenerator |
NextSample(), Reset()
|
IAmplitudeOscillator |
Oscillator with Frequency, Min, Max (extends ISampleGenerator) |
SampleGeneratorExtensions |
Fill(generator, signal), ToSignal(...), SetLfoFrequency, SetLfoRange
|
SineOscillator / CosineOscillator
|
Basic periodic waves |
SquareOscillator / SawtoothOscillator / TriangleOscillator
|
Periodic waves |
ChirpOscillator |
Frequency sweep |
SincGenerator / RampGenerator
|
Sinc pulse, linear ramp |
AwgnGenerator / WhiteNoiseGenerator / PinkNoiseGenerator / RedNoiseGenerator / PerlinNoiseGenerator
|
Noise sources |
PulseWaveGenerator |
Pulse train |
FadeInOutGenerator |
Fade envelope wrapper |
AdsrEnvelope / AdsrState
|
ADSR envelope (IAmplitudeOscillator) |
WaveTableGenerator |
Wavetable playback base |
KarplusStrongGenerator / KarplusStrongDrumGenerator
|
Karplus–Strong string / drum |
PadSynthGenerator |
Pad synthesis |
Builders → Generators migration (approximate)
Legacy Builders.*
|
Use instead |
|---|---|
SineBuilder |
SineOscillator + ToSignal
|
ChirpBuilder |
ChirpOscillator |
AdsrBuilder |
AdsrEnvelope |
WhiteNoiseBuilder / PinkNoiseBuilder / … |
matching *NoiseGenerator
|
KarplusStrongBuilder |
KarplusStrongGenerator |
Example:
using Vorcyc.Mathematics.SignalProcessing.Signals;
using Vorcyc.Mathematics.SignalProcessing.Signals.Generators;
var gen = new SineOscillator(frequency: 440f, samplingRate: 48_000f);
Signal tone = gen.ToSignal(length: 48_000, samplingRate: 48_000f);For one-shot fill of an existing Signal / DiscreteSignal, use GenerateWave(WaveShape, frequency, Behaviour) (extension on ITimeDomainSignal). Shapes map onto the generators above:
WaveShape |
Notes |
|---|---|
Sine / Cosine / Square / Sawtooth / Triangle
|
Periodic waves; frequency in Hz |
WhiteNoise / PinkNoise / RedNoise / Awgn
|
Noise; frequency ignored (AWGN uses fixed default σ). 0.10.14: PinkNoise uses Paul Kellet PinkNoiseGenerator (~±1; prior custom IIR removed) |
Chirp |
Linear chirp; frequency is start Hz (end defaults to min(f×10, 0.45×Nyquist)) |
Pulse |
Pulse train at frequency Hz, 50% duty |
Ramp |
Linear ramp −1…+1 over the buffer; frequency ignored |
Sinc |
Scaled sinc; frequency sets width (same as SincGenerator.Frequency) |
var chirp = new Signal(48_000, 48_000f);
chirp.GenerateWave(WaveShape.Chirp, frequency: 100f);Namespace
Vorcyc.Mathematics.SignalProcessing.Signals(types below)
📒 Contents
- 🔖 Generators (0.9+)
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.Signal class
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.SignalSegment struct
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.SignalExtensions class
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignalFp32 class
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignal class
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignalExtensions class
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignal class
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignal class
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignalExtensions class(obsolete)
Signal is the recommended single-threaded real time-domain type from 0.9. Samples live in POHBuffer<float> and are exposed as Span<float> via Samples; call NotifySamplesModified() after edits to invalidate cached time-domain features.
| Member | Description |
|---|---|
Signal(int sampleCount, float samplingRate) |
Allocate buffer by sample count and rate |
Signal(TimeSpan duration, float samplingRate) |
Allocate buffer by duration and rate |
Signal.Unit(int length, float samplingRate) |
Unit impulse (first sample is 1) |
Signal.Constant(float value, int length, float samplingRate) |
Constant signal |
Signal.FromCopy(ReadOnlySpan<float>, float) |
Construct from span copy |
Signal.FromCopy(float[], float) |
Construct from array copy |
-
Length、SamplingRate(float)、Duration -
Samples: read/writeSpan<float>view - Time-domain features (SIMD-cached):
Amplitude,TotalPower,AveragePower,TotalEnergy,AverageEnergy,Rms,ZeroCrossingRate,Entropy
-
this[int start, int length]→ zero-copySignalSegment? -
this[Range range]、this[TimeSpan start, TimeSpan duration] -
Clone()、CloneRange(int start, int length)
-
TransformToFrequencyDomain(ComputingContext?, WindowType?)→FrequencyDomain(recommended; uses the SoAFftButterflyFp32kernel when SIMD/parallel is beneficial) -
FrequencyDomain.IndexToFrequency: from 0.10.15, maps bins withTransformLength(FFT size); onesided magnitude bins0…N/2are always non-negativebin·Δf(do not use unpaddedActualLength) -
ISingleThreadTimeDomainSignal.GetRms(context)and other time-domain features (optional execution policy) -
Resample(float destinationSamplingRate, FirFilter?, int order)→ newSignal
+, -, *, / (scalar and same-shape Signal element-wise ops; returns new Signal)
using Vorcyc.Mathematics.SignalProcessing.Signals;
var signal = new Signal(1024, 8000f);
signal.GenerateWave(WaveShape.Sine, 440f);
var frame = signal[256, 512, throwException: true]!.Value;
Console.WriteLine($"Frame RMS: {frame.Rms}");
var copy = signal.CloneRange(0, 256);Readonly struct: zero-copy view of contiguous samples on a parent Signal. Implements ITimeDomainSignal / ISingleThreadTimeDomainSignal; frame-level Rms, AverageEnergy, ZeroCrossingRate, Entropy, etc. are lazily computed with SIMD.
- Obtained via
signal[start, length]orsignal[range] -
Samplesis aSpan<float>into the parent buffer sub-range - Can call
TransformToFrequencyDomain,Resampleindependently
Static extensions migrated from DiscreteSignalExtensions (use this class in new code).
| Method | Description |
|---|---|
First / Last
|
First/last n samples (new Signal) |
Amplify / Attenuate / Reverse
|
In-place gain / reverse |
NormalizeMax |
Peak-normalize to [-1, 1] |
Delay |
Delayed copy (positive delay pads; negative delay truncates/shifts left) |
Concatenate / Repeat
|
Concatenate / repeat |
Superimpose / SuperimposeMany / Subtract
|
Superimpose and subtract (unequal-length broadcast) |
FullRectify / HalfRectify
|
In-place rectification |
FadeIn / FadeOut / FadeInFadeOut
|
Linear fade in/out (double seconds or TimeSpan) |
Crossfade |
Crossfade two signals |
ToComplex |
Convert to ComplexDiscreteSignalFp32 (zero imaginary part) |
Energy / Rms / ZeroCrossingRate / Entropy
|
Range statistics (Signal or ReadOnlySpan<float>) |
var a = Signal.Constant(1f, 100, 8000f);
var b = Signal.Constant(0.5f, 100, 8000f);
var mixed = a.Superimpose(b);
a.FadeIn(0.01);
a.FadeOut(0.01);
var joined = a.Crossfade(b, 0.005);All types below are in namespace: Vorcyc.Mathematics.SignalProcessing.Signals
Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignalFp32 represents a finite complex discrete-time signal stored as real and imaginary arrays at a given sample rate.
-
public int SamplingRate { get; }- Gets sample rate (samples per second).
-
public float[] Real { get; }- Gets real part of complex sample.
-
public float[] Imag { get; }- Gets imaginary part of complex sample.
-
public int Length => Real.Length- Gets signal length.
-
public float[] Magnitude- Gets magnitude of complex sample.
-
public float[] Power- Gets power of complex sample (amplitude squared).
-
public float[] Phase- Gets phase of complex sample.
-
public float[] PhaseUnwrapped- Gets unwrapped phase of complex sample.
-
public ComplexDiscreteSignalFp32(int samplingRate, float[] real, float[] imag = null, bool allocateNew = false)- Constructs from real and imaginary arrays ComplexDiscreteSignalFp32 instance.
- Parameters:
-
samplingRate: signal sample rate.. -
real: real-part array of complex signal.. -
imag: imaginary-part array of complex signal; default null.. -
allocateNew: if new memory should be allocated for data, set to true; default false..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<float> real, IEnumerable<float> imag = null)- Constructs from real and imaginary sets ComplexDiscreteSignalFp32 instance.
- Parameters:
-
samplingRate: signal sample rate.. -
real: real-part set of complex signal.. -
imag: imaginary-part set of complex signal; default null..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<ComplexFp32> samples)- Constructs from complex sample set ComplexDiscreteSignalFp32 instance.
- Parameters:
-
samplingRate: signal sample rate.. -
samples: complex sample set..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, int length, float real = 0.0f, float imag = 0.0f)- Constructssignal with specified length filled with specified value.
- Parameters:
-
samplingRate: signal sample rate.. -
length: sample count. -
real: real part value per sample; default 0.0.. -
imag: imaginary part value per sample; default 0.0..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<int> samples, float normalizeFactor = 1.0f)- constructs signal from integer sample set and normalizes at given sample rate.
- Parameters:
-
samplingRate: signal sample rate.. -
samples: integer sample set.. -
normalizeFactor: each sample is divided by this value; default 1.0..
-
-
public ComplexDiscreteSignalFp32 Copy()- Creates a deep copy of the signal.
- Returns: deep copy of the signal.
-
public float this[int index] { get; set; }- Sample indexer; applies to real-part array only; use with care.
- Parameters:
-
index: sample index..
-
- Returns: real part value of sample.
-
public ComplexDiscreteSignalFp32 this[int startPos, int endPos] { get; }- Creates a slice of the signal.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: slice of the signal.
-
public static ComplexDiscreteSignalFp32 operator +(ComplexDiscreteSignalFp32 s1, ComplexDiscreteSignalFp32 s2)- creates new signal by superimposing s1 and s2; if sizes differ, smaller signal is broadcast to match larger.
- Parameters:
-
s1: first signal.. -
s2: second signal..
-
- Returns: new superimposed signal.
-
public static ComplexDiscreteSignalFp32 operator +(ComplexDiscreteSignalFp32 s, float constant)- creates new signal by adding constant to signal s.
- Parameters:
-
s: signal. -
constant: constant to add to each sample..
-
- Returns: new signal after adding constant.
-
public static ComplexDiscreteSignalFp32 operator -(ComplexDiscreteSignalFp32 s, float constant)- creates new signal by subtracting constant from signal s.
- Parameters:
-
s: signal. -
constant: constant to subtract from each sample..
-
- Returns: new signal after subtracting constant.
-
public static ComplexDiscreteSignalFp32 operator *(ComplexDiscreteSignalFp32 s, float coeff)- creates new signal by multiplying signal s by coefficient (amplify/attenuate).
- Parameters:
-
s: signal. -
coeff: amplify/attenuate coefficient..
-
- Returns: new signal after multiplying by coefficient.
The following example uses ComplexDiscreteSignalFp32 with comments:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class ComplexDiscreteSignalExample
{
public static void Main()
{
// Define sample rate
int samplingRate = 44100;
// Define real and imaginary arrays
float[] real = { 0.5f, 0.6f, 0.55f };
float[] imag = { 0.1f, 0.2f, 0.15f };
// Create ComplexDiscreteSignalFp32 instance
var signal = new ComplexDiscreteSignalFp32(samplingRate, real, imag);
// Print signal real and imaginary parts
Console.WriteLine("Real Parts:");
foreach (var r in signal.Real)
{
Console.WriteLine(r);
}
Console.WriteLine("Imaginary Parts:");
foreach (var i in signal.Imag)
{
Console.WriteLine(i);
}
// Get and print signal magnitude
var magnitude = signal.Magnitude;
Console.WriteLine("Magnitude:");
foreach (var m in magnitude)
{
Console.WriteLine(m);
}
// Get and print signal phase
var phase = signal.Phase;
Console.WriteLine("Phase:");
foreach (var p in phase)
{
Console.WriteLine(p);
}
// Creates a slice of the signal
var slicedSignal = signal[1, 3];
Console.WriteLine("Sliced Signal Real Parts:");
foreach (var r in slicedSignal.Real)
{
Console.WriteLine(r);
}
// Creates a deep copy of the signal
var copiedSignal = signal.Copy();
Console.WriteLine("Copied Signal Real Parts:");
foreach (var r in copiedSignal.Real)
{
Console.WriteLine(r);
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignal<T> represents a finite complex discrete-time signal stored as real and imaginary arrays at a given sample rate.
-
public int SamplingRate { get; }- Gets sample rate (samples per second).
-
public T[] Real { get; }- Gets real part of complex sample.
-
public T[] Imag { get; }- Gets imaginary part of complex sample.
-
public int Length => Real.Length- Gets signal length.
-
public T[] Magnitude- Gets magnitude of complex sample.
-
public T[] Power- Gets power of complex sample (amplitude squared).
-
public T[] Phase- Gets phase of complex sample.
-
public T[] PhaseUnwrapped- Gets unwrapped phase of complex sample.
-
public ComplexDiscreteSignalFp32(int samplingRate, T[] real, T[]? imag = null, bool allocateNew = false)- Constructs from real and imaginary arrays ComplexDiscreteSignalFp32 instance.
- Parameters:
-
samplingRate: signal sample rate.. -
real: real-part array of complex signal.. -
imag: imaginary-part array of complex signal; default null.. -
allocateNew: if new memory should be allocated for data, set to true; default false..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<T> real, IEnumerable<T>? imag = null)- Constructs from real and imaginary sets ComplexDiscreteSignalFp32 instance.
- Parameters:
-
samplingRate: signal sample rate.. -
real: real-part set of complex signal.. -
imag: imaginary-part set of complex signal; default null..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<Complex<T>> samples)- Constructs from complex sample set ComplexDiscreteSignalFp32 instance.
- Parameters:
-
samplingRate: signal sample rate.. -
samples: complex sample set..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, int length, T real = default, T imag = default)- Constructssignal with specified length filled with specified value.
- Parameters:
-
samplingRate: signal sample rate.. -
length: sample count. -
real: real part value per sample; default 0.0.. -
imag: imaginary part value per sample; default 0.0..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<T> samples, T? normalizeFactor = null)- constructs signal from integer sample set and normalizes at given sample rate.
- Parameters:
-
samplingRate: signal sample rate.. -
samples: integer sample set.. -
normalizeFactor: each sample is divided by this value; default 1.0..
-
-
public ComplexDiscreteSignal<T> Copy()- Creates a deep copy of the signal.
- Returns: deep copy of the signal.
-
public T this[int index] { get; set; }- Sample indexer; applies to real-part array only; use with care.
- Parameters:
-
index: sample index..
-
- Returns: real part value of sample.
-
public ComplexDiscreteSignal<T> this[int startPos, int endPos] { get; }- Creates a slice of the signal.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: slice of the signal.
-
public static ComplexDiscreteSignal<T> operator +(ComplexDiscreteSignal<T> s1, ComplexDiscreteSignal<T> s2)- creates new signal by superimposing s1 and s2; if sizes differ, smaller signal is broadcast to match larger.
- Parameters:
-
s1: first signal.. -
s2: second signal..
-
- Returns: new superimposed signal.
-
public static ComplexDiscreteSignal<T> operator +(ComplexDiscreteSignal<T> s, T constant)- creates new signal by adding constant to signal s.
- Parameters:
-
s: signal. -
constant: constant to add to each sample..
-
- Returns: new signal after adding constant.
-
public static ComplexDiscreteSignal<T> operator -(ComplexDiscreteSignal<T> s, T constant)- creates new signal by subtracting constant from signal s.
- Parameters:
-
s: signal. -
constant: constant to subtract from each sample..
-
- Returns: new signal after subtracting constant.
-
public static ComplexDiscreteSignal<T> operator *(ComplexDiscreteSignal<T> s, T coeff)- creates new signal by multiplying signal s by coefficient (amplify/attenuate).
- Parameters:
-
s: signal. -
coeff: amplify/attenuate coefficient..
-
- Returns: new signal after multiplying by coefficient.
The following example uses ComplexDiscreteSignal<T> with comments:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class ComplexDiscreteSignalExample
{
public static void Main()
{
// Define sample rate
int samplingRate = 44100;
// Define real and imaginary arrays
float[] real = { 0.5f, 0.6f, 0.55f };
float[] imag = { 0.1f, 0.2f, 0.15f };
// Create ComplexDiscreteSignalFp32 instance
var signal = new ComplexDiscreteSignal<float>(samplingRate, real, imag);
// Print signal real and imaginary parts
Console.WriteLine("Real Parts:");
foreach (var r in signal.Real)
{
Console.WriteLine(r);
}
Console.WriteLine("Imaginary Parts:");
foreach (var i in signal.Imag)
{
Console.WriteLine(i);
}
// Get and print signal magnitude
var magnitude = signal.Magnitude;
Console.WriteLine("Magnitude:");
foreach (var m in magnitude)
{
Console.WriteLine(m);
}
// Get and print signal phase
var phase = signal.Phase;
Console.WriteLine("Phase:");
foreach (var p in phase)
{
Console.WriteLine(p);
}
// Creates a slice of the signal
var slicedSignal = signal[1, 3];
Console.WriteLine("Sliced Signal Real Parts:");
foreach (var r in slicedSignal.Real)
{
Console.WriteLine(r);
}
// Creates a deep copy of the signal
var copiedSignal = signal.Copy();
Console.WriteLine("Copied Signal Real Parts:");
foreach (var r in copiedSignal.Real)
{
Console.WriteLine(r);
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignalExtensions provides extension methods for complex discrete signals.
-
public static ComplexDiscreteSignalFp32 Delay(this ComplexDiscreteSignalFp32 signal, int delay)- Creates a delayed copy of
signalby shifting right (positivedelay) or left (negativedelay). - Parameters:
-
signal: signal. -
delay: delay in samples (positive or negative)..
-
- Returns: delayed
ComplexDiscreteSignalFp32.
- Creates a delayed copy of
-
public static ComplexDiscreteSignal<T> Delay<T>(this ComplexDiscreteSignal<T> signal, int delay) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Creates a delayed copy of
signalby shifting right (positivedelay) or left (negativedelay). - Parameters:
-
signal: signal. -
delay: delay in samples (positive or negative)..
-
- Returns: delayed
ComplexDiscreteSignal<T>.
- Creates a delayed copy of
-
public static ComplexDiscreteSignalFp32 Superimpose(this ComplexDiscreteSignalFp32 signal1, ComplexDiscreteSignalFp32 signal2)- Superimposes
signal1andsignal2; if sizes differ, the smaller signal is broadcast to match the larger. - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: superimposed
ComplexDiscreteSignalFp32.
- Superimposes
-
public static ComplexDiscreteSignal<T> Superimpose<T>(this ComplexDiscreteSignal<T> signal1, ComplexDiscreteSignal<T> signal2) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Superimposes
signal1andsignal2; if sizes differ, the smaller signal is broadcast to match the larger. - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: superimposed
ComplexDiscreteSignal<T>.
- Superimposes
-
public static ComplexDiscreteSignalFp32 Concatenate(this ComplexDiscreteSignalFp32 signal1, ComplexDiscreteSignalFp32 signal2)- Concatenates
signal1andsignal2. - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: concatenated
ComplexDiscreteSignalFp32.
- Concatenates
-
public static ComplexDiscreteSignal<T> Concatenate<T>(this ComplexDiscreteSignal<T> signal1, ComplexDiscreteSignal<T> signal2) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Concatenates
signal1andsignal2. - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: concatenated
ComplexDiscreteSignal<T>.
- Concatenates
-
public static ComplexDiscreteSignalFp32 Repeat(this ComplexDiscreteSignalFp32 signal, int n)- Creates a copy of
signalrepeatedntimes. - Parameters:
-
signal: signal. -
n: repeat count..
-
- Returns: repeated
ComplexDiscreteSignalFp32.
- Creates a copy of
-
public static ComplexDiscreteSignal<T> Repeat<T>(this ComplexDiscreteSignal<T> signal, int n) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Creates a copy of
signalrepeatedntimes. - Parameters:
-
signal: signal. -
n: repeat count..
-
- Returns: repeated
ComplexDiscreteSignal<T>.
- Creates a copy of
-
public static void Amplify(this ComplexDiscreteSignalFp32 signal, float coeff)- Amplifies
signalbycoeff. - Parameters:
-
signal: signal. -
coeff: amplification coefficient..
-
- Amplifies
-
public static void Amplify<T>(this ComplexDiscreteSignal<T> signal, T coeff) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Amplifies
signalbycoeff. - Parameters:
-
signal: signal. -
coeff: amplification coefficient..
-
- Amplifies
-
public static void Attenuate(this ComplexDiscreteSignalFp32 signal, float coeff)- Attenuates
signalbycoeff. - Parameters:
-
signal: signal. -
coeff: attenuation coefficient..
-
- Attenuates
-
public static void Attenuate<T>(this ComplexDiscreteSignal<T> signal, T coeff) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Attenuates
signalbycoeff. - Parameters:
-
signal: signal. -
coeff: attenuation coefficient..
-
- Attenuates
-
public static ComplexDiscreteSignalFp32 First(this ComplexDiscreteSignalFp32 signal, int n)- Creates a new signal from the first
nsamples ofsignal. - Parameters:
-
signal: signal. -
n: sample count.
-
- Returns: new
ComplexDiscreteSignalFp32.
- Creates a new signal from the first
-
public static ComplexDiscreteSignal<T> First<T>(this ComplexDiscreteSignal<T> signal, int n) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Creates a new signal from the first
nsamples ofsignal. - Parameters:
-
signal: signal. -
n: sample count.
-
- Returns: new
ComplexDiscreteSignal<T>.
- Creates a new signal from the first
-
public static ComplexDiscreteSignalFp32 Last(this ComplexDiscreteSignalFp32 signal, int n)- Creates a new signal from the last
nsamples ofsignal. - Parameters:
-
signal: signal. -
n: sample count.
-
- Returns: new
ComplexDiscreteSignalFp32.
- Creates a new signal from the last
-
public static ComplexDiscreteSignal<T> Last<T>(this ComplexDiscreteSignal<T> signal, int n) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Creates a new signal from the last
nsamples ofsignal. - Parameters:
-
signal: signal. -
n: sample count.
-
- Returns: new
ComplexDiscreteSignal<T>.
- Creates a new signal from the last
-
public static ComplexDiscreteSignalFp32 ZeroPadded(this ComplexDiscreteSignalFp32 signal, int length)- Creates a new zero-padded complex discrete signal from
signal. - Parameters:
-
signal: signal. -
length: length of zero-padded signal..
-
- Returns: zero-padded
ComplexDiscreteSignalFp32.
- Creates a new zero-padded complex discrete signal from
-
public static ComplexDiscreteSignal<T> ZeroPadded<T>(this ComplexDiscreteSignal<T> signal, int length) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Creates a new zero-padded complex discrete signal from
signal. - Parameters:
-
signal: signal. -
length: length of zero-padded signal..
-
- Returns: zero-padded
ComplexDiscreteSignal<T>.
- Creates a new zero-padded complex discrete signal from
-
public static ComplexDiscreteSignalFp32 Multiply(this ComplexDiscreteSignalFp32 signal1, ComplexDiscreteSignalFp32 signal2)- Performs complex multiplication of
signal1andsignal2(normalized by length). - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: multiplied
ComplexDiscreteSignalFp32.
- Performs complex multiplication of
-
public static ComplexDiscreteSignal<T> Multiply<T>(this ComplexDiscreteSignal<T> signal1, ComplexDiscreteSignal<T> signal2) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Performs complex multiplication of
signal1andsignal2(normalized by length). - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: multiplied
ComplexDiscreteSignal<T>.
- Performs complex multiplication of
-
public static ComplexDiscreteSignalFp32 Divide(this ComplexDiscreteSignalFp32 signal1, ComplexDiscreteSignalFp32 signal2)- Performs complex division of
signal1andsignal2(normalized by length). - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: divided
ComplexDiscreteSignalFp32.
- Performs complex division of
-
public static ComplexDiscreteSignal<T> Divide<T>(this ComplexDiscreteSignal<T> signal1, ComplexDiscreteSignal<T> signal2) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Performs complex division of
signal1andsignal2(normalized by length). - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: divided
ComplexDiscreteSignal<T>.
- Performs complex division of
-
public static float[] Unwrap(this float[] phase, float tolerance = ConstantsFp32.PI)- Unwraps phase of complex samples.
- Parameters:
-
phase: phase. -
tolerance: hop size, defaultConstantsFp32.PI..
-
- Returns: unwrapped phase array.
-
public static T[] Unwrap<T>(this T[] phase, T? tolerance = null) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Unwraps phase of complex samples.
- Parameters:
-
phase: phase. -
tolerance: hop size, defaultT.Pi..
-
- Returns: unwrapped phase array.
-
public static IEnumerable<ComplexFp32> ToComplexNumbers(this ComplexDiscreteSignalFp32 signal)- Generates complex numbers from
signalsamples. - Parameters:
-
signal: complexdiscretesignal.
-
- Returns: sequence of complex numbers.
- Generates complex numbers from
-
public static IEnumerable<Complex<T>> ToComplexNumbers<T>(this ComplexDiscreteSignal<T> signal) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- Generates complex numbers from
signalsamples. - Parameters:
-
signal: complexdiscretesignal.
-
- Returns: sequence of complex numbers.
- Generates complex numbers from
The following example uses ComplexDiscreteSignalExtensions with comments:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class ComplexDiscreteSignalExtensionsExample
{
public static void Main()
{
// Define sample rate
int samplingRate = 44100;
// Define real and imaginary arrays
float[] real = { 0.5f, 0.6f, 0.55f };
float[] imag = { 0.1f, 0.2f, 0.15f };
// Create ComplexDiscreteSignalFp32 instance
var signal = new ComplexDiscreteSignalFp32(samplingRate, real, imag);
// Createsdelaysignal
var delayedSignal = signal.Delay(2);
Console.WriteLine("Delayed Signal Real Parts:");
foreach (var r in delayedSignal.Real)
{
Console.WriteLine(r);
}
// superimposesignal
var superimposedSignal = signal.Superimpose(delayedSignal);
Console.WriteLine("Superimposed Signal Real Parts:");
foreach (var r in superimposedSignal.Real)
{
Console.WriteLine(r);
}
// Concatenate signal
var concatenatedSignal = signal.Concatenate(delayedSignal);
Console.WriteLine("Concatenated Signal Real Parts:");
foreach (var r in concatenatedSignal.Real)
{
Console.WriteLine(r);
}
// Amplify signal
signal.Amplify(2.0f);
Console.WriteLine("Amplified Signal Real Parts:");
foreach (var r in signal.Real)
{
Console.WriteLine(r);
}
// Attenuate signal
signal.Attenuate(2.0f);
Console.WriteLine("Attenuated Signal Real Parts:");
foreach (var r in signal.Real)
{
Console.WriteLine(r);
}
// Get first n samples
var firstSamples = signal.First(2);
Console.WriteLine("First Samples Real Parts:");
foreach (var r in firstSamples.Real)
{
Console.WriteLine(r);
}
// Get last n samples
var lastSamples = signal.Last(2);
Console.WriteLine("Last Samples Real Parts:");
foreach (var r in lastSamples.Real)
{
Console.WriteLine(r);
}
// zero-padded signal
var zeroPaddedSignal = signal.ZeroPadded(8);
Console.WriteLine("Zero Padded Signal Real Parts:");
foreach (var r in zeroPaddedSignal.Real)
{
Console.WriteLine(r);
}
// complex multiplication
var multipliedSignal = signal.Multiply(delayedSignal);
Console.WriteLine("Multiplied Signal Real Parts:");
foreach (var r in multipliedSignal.Real)
{
Console.WriteLine(r);
}
// complex division
var dividedSignal = signal.Divide(delayedSignal);
Console.WriteLine("Divided Signal Real Parts:");
foreach (var r in dividedSignal.Real)
{
Console.WriteLine(r);
}
// Unwrap phase
var unwrappedPhase = signal.Phase.Unwrap();
Console.WriteLine("Unwrapped Phase:");
foreach (var p in unwrappedPhase)
{
Console.WriteLine(p);
}
// Convert to complex
var complexNumbers = signal.ToComplexNumbers();
Console.WriteLine("Complex Numbers:");
foreach (var c in complexNumbers)
{
Console.WriteLine($"Real: {c.Real}, Imaginary: {c.Imaginary}");
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignal<T> represents a finite complex discrete-time signal stored as real and imaginary arrays at a given sample rate.
-
public int SamplingRate { get; }- Gets sample rate (samples per second).
-
public T[] Real { get; }- Gets real part of complex sample.
-
public T[] Imag { get; }- Gets imaginary part of complex sample.
-
public int Length => Real.Length- Gets signal length.
-
public T[] Magnitude- Gets magnitude of complex sample.
-
public T[] Power- Gets power of complex sample (amplitude squared).
-
public T[] Phase- Gets phase of complex sample.
-
public T[] PhaseUnwrapped- Gets unwrapped phase of complex sample.
-
public ComplexDiscreteSignalFp32(int samplingRate, T[] real, T[]? imag = null, bool allocateNew = false)- Constructs from real and imaginary arrays ComplexDiscreteSignalFp32 instance.
- Parameters:
-
samplingRate: signal sample rate.. -
real: real-part array of complex signal.. -
imag: imaginary-part array of complex signal; default null.. -
allocateNew: if new memory should be allocated for data, set to true; default false..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<T> real, IEnumerable<T>? imag = null)- Constructs from real and imaginary sets ComplexDiscreteSignalFp32 instance.
- Parameters:
-
samplingRate: signal sample rate.. -
real: real-part set of complex signal.. -
imag: imaginary-part set of complex signal; default null..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<Complex<T>> samples)- Constructs from complex sample set ComplexDiscreteSignalFp32 instance.
- Parameters:
-
samplingRate: signal sample rate.. -
samples: complex sample set..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, int length, T real = default, T imag = default)- Constructssignal with specified length filled with specified value.
- Parameters:
-
samplingRate: signal sample rate.. -
length: sample count. -
real: real part value per sample; default 0.0.. -
imag: imaginary part value per sample; default 0.0..
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<T> samples, T? normalizeFactor = null)- constructs signal from integer sample set and normalizes at given sample rate.
- Parameters:
-
samplingRate: signal sample rate.. -
samples: integer sample set.. -
normalizeFactor: each sample is divided by this value; default 1.0..
-
-
public ComplexDiscreteSignal<T> Copy()- Creates a deep copy of the signal.
- Returns: deep copy of the signal.
-
public T this[int index] { get; set; }- Sample indexer; applies to real-part array only; use with care.
- Parameters:
-
index: sample index..
-
- Returns: real part value of sample.
-
public ComplexDiscreteSignal<T> this[int startPos, int endPos] { get; }- Creates a slice of the signal.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: slice of the signal.
-
public static ComplexDiscreteSignal<T> operator +(ComplexDiscreteSignal<T> s1, ComplexDiscreteSignal<T> s2)- creates new signal by superimposing s1 and s2; if sizes differ, smaller signal is broadcast to match larger.
- Parameters:
-
s1: first signal.. -
s2: second signal..
-
- Returns: new superimposed signal.
-
public static ComplexDiscreteSignal<T> operator +(ComplexDiscreteSignal<T> s, T constant)- creates new signal by adding constant to signal s.
- Parameters:
-
s: signal. -
constant: constant to add to each sample..
-
- Returns: new signal after adding constant.
-
public static ComplexDiscreteSignal<T> operator -(ComplexDiscreteSignal<T> s, T constant)- creates new signal by subtracting constant from signal s.
- Parameters:
-
s: signal. -
constant: constant to subtract from each sample..
-
- Returns: new signal after subtracting constant.
-
public static ComplexDiscreteSignal<T> operator *(ComplexDiscreteSignal<T> s, T coeff)- creates new signal by multiplying signal s by coefficient (amplify/attenuate).
- Parameters:
-
s: signal. -
coeff: amplify/attenuate coefficient..
-
- Returns: new signal after multiplying by coefficient.
The following example uses ComplexDiscreteSignal<T> with comments:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class ComplexDiscreteSignalExample
{
public static void Main()
{
// Define sample rate
int samplingRate = 44100;
// Define real and imaginary arrays
float[] real = { 0.5f, 0.6f, 0.55f };
float[] imag = { 0.1f, 0.2f, 0.15f };
// Create ComplexDiscreteSignalFp32 instance
var signal = new ComplexDiscreteSignal<float>(samplingRate, real, imag);
// Print signal real and imaginary parts
Console.WriteLine("Real Parts:");
foreach (var r in signal.Real)
{
Console.WriteLine(r);
}
Console.WriteLine("Imaginary Parts:");
foreach (var i in signal.Imag)
{
Console.WriteLine(i);
}
// Get and print signal magnitude
var magnitude = signal.Magnitude;
Console.WriteLine("Magnitude:");
foreach (var m in magnitude)
{
Console.WriteLine(m);
}
// Get and print signal phase
var phase = signal.Phase;
Console.WriteLine("Phase:");
foreach (var p in phase)
{
Console.WriteLine(p);
}
// Creates a slice of the signal
var slicedSignal = signal[1, 3];
Console.WriteLine("Sliced Signal Real Parts:");
foreach (var r in slicedSignal.Real)
{
Console.WriteLine(r);
}
// Creates a deep copy of the signal
var copiedSignal = signal.Copy();
Console.WriteLine("Copied Signal Real Parts:");
foreach (var r in copiedSignal.Real)
{
Console.WriteLine(r);
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignal represents a finite real discrete-time signal stored as a single array at a given sample rate.
-
public int SamplingRate { get; }- Gets sample rate (samples per second).
-
public int SampleCount { get; }- Gets sample count (fixed after allocation).
-
public int ValidSampleCount { get; }- Gets effective sample count.
-
public TimeSpan Duration { get; }- Gets signal duration.
-
public PinnableArray<float> Samples { get; }- Gets signal sample array.
-
public MemoryStrategy MemoryStrategy { get; }- Gets signal memory strategy.
-
public DiscreteSignal(int samplingRate, TimeSpan duration, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and duration. - Parameters:
-
samplingRate: signal sample rate.. -
duration: signal duration.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, int count, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and sample count. - Parameters:
-
samplingRate: signal sample rate.. -
count: sample count.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, float[] samples, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and sample array. - Parameters:
-
samplingRate: signal sample rate.. -
samples: sample array.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, float[] samples, int offset, int count, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate, sample array, offset, and count. - Parameters:
-
samplingRate: signal sample rate.. -
samples: sample array.. -
offset: offset into sample array.. -
count: sample count.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, IEnumerable<float> samples, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and sample set. - Parameters:
-
samplingRate: signal sample rate.. -
samples: Sample set. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, ArraySegment<float> segment, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and sample segment. - Parameters:
-
samplingRate: signal sample rate.. -
segment: sample segment.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, Span<float> span, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and sample span. - Parameters:
-
samplingRate: signal sample rate.. -
span: sample span.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal Clone()- Creates a deep copy of the signal.
- Returns: deep copy of the signal.
-
public float this[int index] { get; set; }- Sample indexer.
- Parameters:
-
index: sample index..
-
- Returns: sampleValue.
-
public DiscreteSignal this[int startPos, int endPos] { get; }- Creates a slice of the signal.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: slice of the signal.
-
public DiscreteSignal this[Range range] { get; }- Creates a slice of the signal.
- Parameters:
-
range: sample range..
-
- Returns: slice of the signal.
-
public float Energy(int startPos, int endPos)- Computes energy of signal segment.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: energy of signal segment.
-
public float Energy(Range range)- Computes energy of signal segment.
- Parameters:
-
range: sample range..
-
- Returns: energy of signal segment.
-
public float Energy()- Computes energy of entire signal.
- Returns: energy of entire signal.
-
public float Rms(int startPos, int endPos)- Computes RMS of signal segment.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: RMS of signal segment.
-
public float Rms(Range range)- Computes RMS of signal segment.
- Parameters:
-
range: sample range..
-
- Returns: RMS of signal segment.
-
public float Rms()- Computes RMS of entire signal.
- Returns: RMS of entire signal.
-
public float ZeroCrossingRate(int startPos, int endPos)- Computes zero-crossing rate of signal segment.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: zero-crossing rate of signal segment.
-
public float ZeroCrossingRate(Range range)- Computes zero-crossing rate of signal segment.
- Parameters:
-
range: sample range..
-
- Returns: zero-crossing rate of signal segment.
-
public float ZeroCrossingRate()- Computes zero-crossing rate of entire signal.
- Returns: zero-crossing rate of entire signal.
-
public float Entropy(int startPos, int endPos, int binCount = 32)- Computes Shannon entropy of signal segment.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive).. -
binCount: histogram bin count; default 32..
-
- Returns: Shannon entropy of signal segment.
-
public float Entropy(Range range, int binCount = 32)- Computes Shannon entropy of signal segment.
- Parameters:
-
range: sample range.. -
binCount: histogram bin count; default 32..
-
- Returns: Shannon entropy of signal segment.
-
public float Entropy(int binCount = 32)- Computes Shannon entropy of entire signal.
- Parameters:
-
binCount: histogram bin count; default 32..
-
- Returns: Shannon entropy of entire signal.
-
public static DiscreteSignal operator +(DiscreteSignal s1, DiscreteSignal s2)- creates new signal by superimposing s1 and s2; if sizes differ, smaller signal is broadcast to match larger.
- Parameters:
-
s1: first signal.. -
s2: second signal..
-
- Returns: new superimposed signal.
-
public static DiscreteSignal operator +(DiscreteSignal s, float constant)- creates new signal by adding constant to signal s.
- Parameters:
-
s: signal. -
constant: constant to add to each sample..
-
- Returns: new signal after adding constant.
-
public static DiscreteSignal operator -(DiscreteSignal s)- Creates an inverted copy of signal s.
- Parameters:
-
s: signal.
-
- Returns: new inverted signal.
-
public static DiscreteSignal operator -(DiscreteSignal s1, DiscreteSignal s2)- Creates new signal by subtracting s2 from s1; if sizes differ, smaller signal is broadcast to match larger.
- Parameters:
-
s1: first signal.. -
s2: second signal..
-
- Returns: new signal after subtraction.
-
public static DiscreteSignal operator -(DiscreteSignal s, float constant)- creates new signal by subtracting constant from signal s.
- Parameters:
-
s: signal. -
constant: constant to subtract from each sample..
-
- Returns: new signal after subtracting constant.
-
public static DiscreteSignal operator *(DiscreteSignal s, float coeff)- creates new signal by multiplying signal s by coefficient (amplify/attenuate).
- Parameters:
-
s: signal. -
coeff: amplify/attenuate coefficient..
-
- Returns: new signal after multiplying by coefficient.
The following example uses DiscreteSignal with comments:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class DiscreteSignalExample
{
public static void Main()
{
// Define sample rate
int samplingRate = 44100;
// Define sample array
float[] samples = { 0.5f, 0.6f, 0.55f };
// Create DiscreteSignal instance
var signal = new DiscreteSignal(samplingRate, samples);
// Print signal samples
Console.WriteLine("Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// Get and print signal energy
var energy = signal.Energy();
Console.WriteLine("Energy:");
Console.WriteLine(energy);
// Get and print signal RMS
var rms = signal.Rms();
Console.WriteLine("RMS:");
Console.WriteLine(rms);
// Get and print signal zero-crossing rate
var zeroCrossingRate = signal.ZeroCrossingRate();
Console.WriteLine("Zero Crossing Rate:");
Console.WriteLine(zeroCrossingRate);
// Get and print signal Shannon entropy
var entropy = signal.Entropy();
Console.WriteLine("Entropy:");
Console.WriteLine(entropy);
// Creates a slice of the signal
var slicedSignal = signal[1, 3];
Console.WriteLine("Sliced Signal Samples:");
foreach (var sample in slicedSignal.Samples)
{
Console.WriteLine(sample);
}
// Creates a deep copy of the signal
var copiedSignal = signal.Clone();
Console.WriteLine("Copied Signal Samples:");
foreach (var sample in copiedSignal.Samples)
{
Console.WriteLine(sample);
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignal<TSample> represents a finite real discrete-time signal stored as a single array at a given sample rate.
-
public int SamplingRate { get; }- Gets sample rate (samples per second).
-
public int SampleCount { get; }- Gets sample count (fixed after allocation).
-
public int ValidSampleCount { get; }- Gets effective sample count.
-
public TimeSpan Duration { get; }- Gets signal duration.
-
public PinnableArray<TSample> Samples { get; }- Gets signal sample array.
-
public MemoryStrategy MemoryStrategy { get; }- Gets signal memory strategy.
-
public DiscreteSignal(int samplingRate, TimeSpan duration, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and duration. - Parameters:
-
samplingRate: signal sample rate.. -
duration: signal duration.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, int count, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and sample count. - Parameters:
-
samplingRate: signal sample rate.. -
count: sample count.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, TSample[] samples, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and sample array. - Parameters:
-
samplingRate: signal sample rate.. -
samples: sample array.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, TSample[] samples, int offset, int count, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate, sample array, offset, and count. - Parameters:
-
samplingRate: signal sample rate.. -
samples: sample array.. -
offset: offset into sample array.. -
count: sample count.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, IEnumerable<TSample> samples, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and sample set. - Parameters:
-
samplingRate: signal sample rate.. -
samples: Sample set. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, ArraySegment<TSample> segment, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and sample segment. - Parameters:
-
samplingRate: signal sample rate.. -
segment: sample segment.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal(int samplingRate, Span<TSample> span, MemoryStrategy strategy = MemoryStrategy.Immediate)- Constructs
DiscreteSignalfrom sample rate and sample span. - Parameters:
-
samplingRate: signal sample rate.. -
span: sample span.. -
strategy: memory strategy; defaultMemoryStrategy.Immediate..
-
- Constructs
-
public DiscreteSignal<TSample> Clone()- Creates a deep copy of the signal.
- Returns: deep copy of the signal.
-
public TSample this[int index] { get; set; }- Sample indexer.
- Parameters:
-
index: sample index..
-
- Returns: sampleValue.
-
public DiscreteSignal<TSample> this[int startPos, int endPos] { get; }- Creates a slice of the signal.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: slice of the signal.
-
public DiscreteSignal<TSample> this[Range range] { get; }- Creates a slice of the signal.
- Parameters:
-
range: sample range..
-
- Returns: slice of the signal.
-
public TSample Energy(int startPos, int endPos)- Computes energy of signal segment.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: energy of signal segment.
-
public TSample Energy(Range range)- Computes energy of signal segment.
- Parameters:
-
range: sample range..
-
- Returns: energy of signal segment.
-
public TSample Energy()- Computes energy of entire signal.
- Returns: energy of entire signal.
-
public TSample Rms(int startPos, int endPos)- Computes RMS of signal segment.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: RMS of signal segment.
-
public TSample Rms(Range range)- Computes RMS of signal segment.
- Parameters:
-
range: sample range..
-
- Returns: RMS of signal segment.
-
public TSample Rms()- Computes RMS of entire signal.
- Returns: RMS of entire signal.
-
public TSample ZeroCrossingRate(int startPos, int endPos)- Computes zero-crossing rate of signal segment.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive)..
-
- Returns: zero-crossing rate of signal segment.
-
public TSample ZeroCrossingRate(Range range)- Computes zero-crossing rate of signal segment.
- Parameters:
-
range: sample range..
-
- Returns: zero-crossing rate of signal segment.
-
public TSample ZeroCrossingRate()- Computes zero-crossing rate of entire signal.
- Returns: zero-crossing rate of entire signal.
-
public TSample Entropy(int startPos, int endPos, int binCount = 32)- Computes Shannon entropy of signal segment.
- Parameters:
-
startPos: index of first sample (inclusive).. -
endPos: index of last sample (exclusive).. -
binCount: histogram bin count; default 32..
-
- Returns: Shannon entropy of signal segment.
-
public TSample Entropy(Range range, int binCount = 32)- Computes Shannon entropy of signal segment.
- Parameters:
-
range: sample range.. -
binCount: histogram bin count; default 32..
-
- Returns: Shannon entropy of signal segment.
-
public TSample Entropy(int binCount = 32)- Computes Shannon entropy of entire signal.
- Parameters:
-
binCount: histogram bin count; default 32..
-
- Returns: Shannon entropy of entire signal.
-
public static DiscreteSignal<TSample> operator +(DiscreteSignal<TSample> s1, DiscreteSignal<TSample> s2)- creates new signal by superimposing s1 and s2; if sizes differ, smaller signal is broadcast to match larger.
- Parameters:
-
s1: first signal.. -
s2: second signal..
-
- Returns: new superimposed signal.
-
public static DiscreteSignal<TSample> operator +(DiscreteSignal<TSample> s, TSample constant)- creates new signal by adding constant to signal s.
- Parameters:
-
s: signal. -
constant: constant to add to each sample..
-
- Returns: new signal after adding constant.
-
public static DiscreteSignal<TSample> operator -(DiscreteSignal<TSample> s)- Creates an inverted copy of signal s.
- Parameters:
-
s: signal.
-
- Returns: new inverted signal.
-
public static DiscreteSignal<TSample> operator -(DiscreteSignal<TSample> s1, DiscreteSignal<TSample> s2)- Creates new signal by subtracting s2 from s1; if sizes differ, smaller signal is broadcast to match larger.
- Parameters:
-
s1: first signal.. -
s2: second signal..
-
- Returns: new signal after subtraction.
-
public static DiscreteSignal<TSample> operator -(DiscreteSignal<TSample> s, TSample constant)- creates new signal by subtracting constant from signal s.
- Parameters:
-
s: signal. -
constant: constant to subtract from each sample..
-
- Returns: new signal after subtracting constant.
-
public static DiscreteSignal<TSample> operator *(DiscreteSignal<TSample> s, TSample coeff)- creates new signal by multiplying signal s by coefficient (amplify/attenuate).
- Parameters:
-
s: signal. -
coeff: amplify/attenuate coefficient..
-
- Returns: new signal after multiplying by coefficient.
The following example uses DiscreteSignal<TSample> with comments:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class DiscreteSignalExample
{
public static void Main()
{
// Define sample rate
int samplingRate = 44100;
// Define sample array
float[] samples = { 0.5f, 0.6f, 0.55f };
// Create DiscreteSignal instance
var signal = new DiscreteSignal<float>(samplingRate, samples);
// Print signal samples
Console.WriteLine("Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// Get and print signal energy
var energy = signal.Energy();
Console.WriteLine("Energy:");
Console.WriteLine(energy);
// Get and print signal RMS
var rms = signal.Rms();
Console.WriteLine("RMS:");
Console.WriteLine(rms);
// Get and print signal zero-crossing rate
var zeroCrossingRate = signal.ZeroCrossingRate();
Console.WriteLine("Zero Crossing Rate:");
Console.WriteLine(zeroCrossingRate);
// Get and print signal Shannon entropy
var entropy = signal.Entropy();
Console.WriteLine("Entropy:");
Console.WriteLine(entropy);
// Creates a slice of the signal
var slicedSignal = signal[1, 3];
Console.WriteLine("Sliced Signal Samples:");
foreach (var sample in slicedSignal.Samples)
{
Console.WriteLine(sample);
}
// Creates a deep copy of the signal
var copiedSignal = signal.Clone();
Console.WriteLine("Copied Signal Samples:");
foreach (var sample in copiedSignal.Samples)
{
Console.WriteLine(sample);
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignalExtensions provides extension methods for discrete signals.
-
public static DiscreteSignal Delay(this DiscreteSignal signal, int delay)- Creates a delayed copy of
signalby shifting right (positivedelay) or left (negativedelay). - Parameters:
-
signal: signal. -
delay: delay in samples (positive or negative)..
-
- Returns: delayed
DiscreteSignal.
- Creates a delayed copy of
-
public static DiscreteSignal Superimpose(this DiscreteSignal signal1, DiscreteSignal signal2)- Superimposes
signal1andsignal2; if sizes differ, the smaller signal is broadcast to match the larger. - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: superimposed
DiscreteSignal.
- Superimposes
-
public static DiscreteSignal SuperimposeMany(this DiscreteSignal signal1, DiscreteSignal signal2, int[] positions)- Superimposes
signal2ontosignal1at givenpositionsmultiple times. - Parameters:
-
signal1: first signal.. -
signal2: second signal.. -
positions: positions (indices) to insertsignal2..
-
- Returns: superimposed
DiscreteSignal.
- Superimposes
-
public static DiscreteSignal Subtract(this DiscreteSignal signal1, DiscreteSignal signal2)- Subtracts
signal2fromsignal1; if sizes differ, smaller signal is broadcast to match larger. - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: resulting
DiscreteSignalafter subtraction.
- Subtracts
-
public static DiscreteSignal Concatenate(this DiscreteSignal signal1, DiscreteSignal signal2)- Concatenates
signal1andsignal2. - Parameters:
-
signal1: first signal.. -
signal2: second signal..
-
- Returns: concatenated
DiscreteSignal.
- Concatenates
-
public static DiscreteSignal Repeat(this DiscreteSignal signal, int n)- Creates a copy of
signalrepeatedntimes. - Parameters:
-
signal: signal. -
n: repeat count..
-
- Returns: repeated
DiscreteSignal.
- Creates a copy of
-
public static void Amplify(this DiscreteSignal signal, float coeff)- Amplifies
signalbycoeff. - Parameters:
-
signal: signal. -
coeff: amplification coefficient..
-
- Amplifies
-
public static void Attenuate(this DiscreteSignal signal, float coeff)- Attenuates
signalbycoeff. - Parameters:
-
signal: signal. -
coeff: attenuation coefficient..
-
- Attenuates
-
public static void Reverse(this DiscreteSignal signal)- reverse
signal. - Parameters:
-
signal: signal.
-
- reverse
-
public static DiscreteSignal First(this DiscreteSignal signal, int n)- Creates a new signal from the first
nsamples ofsignal. - Parameters:
-
signal: signal. -
n: sample count.
-
- Returns: new
DiscreteSignal.
- Creates a new signal from the first
-
public static DiscreteSignal Last(this DiscreteSignal signal, int n)- Creates a new signal from the last
nsamples ofsignal. - Parameters:
-
signal: signal. -
n: sample count.
-
- Returns: new
DiscreteSignal.
- Creates a new signal from the last
-
public static void FullRectify(this DiscreteSignal signal)- Full-wave rectifies
signal. - Parameters:
-
signal: signal.
-
- Full-wave rectifies
-
public static void HalfRectify(this DiscreteSignal signal)- Half-wave rectifies
signal. - Parameters:
-
signal: signal.
-
- Half-wave rectifies
-
public static void NormalizeMax(this DiscreteSignal signal, int bitsPerSample = 0)- Normalizes
signalby max absolute value (range [-1, 1]). - Parameters:
-
signal: signal. -
bitsPerSample: bits per sample; default 0..
-
- Normalizes
-
public static ComplexDiscreteSignalFp32 ToComplex(this DiscreteSignal signal)- Creates
ComplexDiscreteSignalFp32fromDiscreteSignalwith zero imaginary part. - Parameters:
-
signal: real-valued signal..
-
- Returns: complexValuesignal
ComplexDiscreteSignalFp32.
- Creates
-
public static void FadeInFadeOut(this DiscreteSignal signal, double fadeInDuration, double fadeOutDuration)- Applies linear fade in/out to
signal. - Parameters:
-
signal: signal. -
fadeInDuration: fade induration (seconds). -
fadeOutDuration: fade outduration (seconds).
-
- Applies linear fade in/out to
-
public static void FadeInFadeOut(this DiscreteSignal signal, TimeSpan fadeInDuration, TimeSpan fadeOutDuration)- Applies linear fade in/out to
signal. - Parameters:
-
signal: signal. -
fadeInDuration: fade induration. -
fadeOutDuration: fade outduration.
-
- Applies linear fade in/out to
-
public static void FadeIn(this DiscreteSignal signal, double duration)- Applies linear fade in to
signal. - Parameters:
-
signal: signal. -
duration: fade induration (seconds).
-
- Applies linear fade in to
-
public static void FadeIn(this DiscreteSignal signal, TimeSpan duration)- Applies linear fade in to
signal. - Parameters:
-
signal: signal. -
duration: fade induration.
-
- Applies linear fade in to
-
public static void FadeOut(this DiscreteSignal signal, double duration)- Applies linear fade out to
signal. - Parameters:
-
signal: signal. -
duration: fade outduration (seconds).
-
- Applies linear fade out to
-
public static void FadeOut(this DiscreteSignal signal, TimeSpan duration)- Applies linear fade out to
signal. - Parameters:
-
signal: signal. -
duration: fade outduration.
-
- Applies linear fade out to
-
public static DiscreteSignal Crossfade(this DiscreteSignal signal1, DiscreteSignal signal2, double duration)- Linearly crossfades between
signal1andsignal2; result length equals sum of lengths minus crossfade region. - Parameters:
-
signal1: first signal.. -
signal2: second signal.. -
duration: crossfadeduration (seconds).
-
- Returns: crossfaded
DiscreteSignal.
- Linearly crossfades between
-
public static DiscreteSignal Crossfade(this DiscreteSignal signal1, DiscreteSignal signal2, TimeSpan duration)- Linearly crossfades between
signal1andsignal2; result length equals sum of lengths minus crossfade region. - Parameters:
-
signal1: first signal.. -
signal2: second signal.. -
duration: crossfadeduration.
-
- Returns: crossfaded
DiscreteSignal.
- Linearly crossfades between
The following example uses DiscreteSignalExtensions with comments:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class DiscreteSignalExtensionsExample
{
public static void Main()
{
// Define sample rate
int samplingRate = 44100;
// Define sample array
float[] samples = { 0.5f, 0.6f, 0.55f };
// Create DiscreteSignal instance
var signal = new DiscreteSignal(samplingRate, samples);
// Createsdelaysignal
var delayedSignal = signal.Delay(2);
Console.WriteLine("Delayed Signal Samples:");
foreach (var sample in delayedSignal.Samples)
{
Console.WriteLine(sample);
}
// superimposesignal
var superimposedSignal = signal.Superimpose(delayedSignal);
Console.WriteLine("Superimposed Signal Samples:");
foreach (var sample in superimposedSignal.Samples)
{
Console.WriteLine(sample);
}
// Concatenate signal
var concatenatedSignal = signal.Concatenate(delayedSignal);
Console.WriteLine("Concatenated Signal Samples:");
foreach (var sample in concatenatedSignal.Samples)
{
Console.WriteLine(sample);
}
// Amplify signal
signal.Amplify(2.0f);
Console.WriteLine("Amplified Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// Attenuate signal
signal.Attenuate(2.0f);
Console.WriteLine("Attenuated Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// Get first n samples
var firstSamples = signal.First(2);
Console.WriteLine("First Samples:");
foreach (var sample in firstSamples.Samples)
{
Console.WriteLine(sample);
}
// Get last n samples
var lastSamples = signal.Last(2);
Console.WriteLine("Last Samples:");
foreach (var sample in lastSamples.Samples)
{
Console.WriteLine(sample);
}
// full-wave rectified signal
signal.FullRectify();
Console.WriteLine("Full Rectified Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// half-wave rectified signal
signal.HalfRectify();
Console.WriteLine("Half Rectified Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// normalizedsignal
signal.NormalizeMax();
Console.WriteLine("Normalized Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// fadesignal
signal.FadeInFadeOut(0.1, 0.1);
Console.WriteLine("Fade In Fade Out Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// crossfadesignal
var crossfadedSignal = signal.Crossfade(delayedSignal, 0.1);
Console.WriteLine("Crossfaded Signal Samples:");
foreach (var sample in crossfadedSignal.Samples)
{
Console.WriteLine(sample);
}
}
}-
- 🔖 ArrayExtension class
- 🔖 BaseConverter class
- 🔖 BitMathExtension class
- 🔖 Combinatorics class
- 🔖 ConstantsFp32 class
- 🔖 NumberMapper class
- 🔖 PinnableArray<T> class
- 🔖 SimpleRNG_Fp32 and SimpleRNG_Fp64 classes
- 🔖 TrigonometryHelper class
- 🔖 VMath class
- 🔖 Pinned buffers (Buffers)
- 🔖 IPinnedBuffer<T> interface
- 🔖 POHBuffer<T> class
- 🔖 NativeBuffer<T> class
-
- 🔖 0.9 classifier walkthrough
- 🔖 KNN<T> class
- 🔖 MultipleLinearRegression<T> class
- 🔖 SimpleLinearRegression<T> class
- 🔖 SupportVectorMachine<TSelf> class
- 🔖 DBSCAN<T> class
- 🔖 ExpectationMaximization<T> class
- 🔖 GMM<T> class
- 🔖 HierarchicalClustering<T> class
- 🔖 KMeansClusterer<T> class
- 🔖 VectorQuantization<T> class
- 🔖 FactorAnalysis<T> class
- 🔖 PCA<TSelf> class
- 🔖 TSNE<T> class
- 🔖 Distance metric classes
-
📒 Examples
-
📒 GPU 策略说明
- 🔖 为何放弃主包 GPU
- 🔖 当前性能路径
- 🔖 若仍需要更强算力
-
📒 计算上下文模块
-
📒 核心模块
-
📒 深度学习模块
-
📒 线性代数模块
-
📒 机器学习模块
- 🔖 0.9 分类器完整示例
- 🔖 KNN<T> 类
- 🔖 MultipleLinearRegression<T> 类
- 🔖 SimpleLinearRegression<T> 类
- 🔖 SupportVectorMachine<TSelf> 类
- 🔖 DBSCAN<T> 类
- 🔖 ExpectationMaximization<T> 类
- 🔖 GMM<T> 类
- 🔖 HierarchicalClustering<T> 类
- 🔖 KMeansClusterer<T> 类
- 🔖 VectorQuantization<T> 类
- 🔖 FactorAnalysis<T> 类
- 🔖 PCA<TSelf> 类
- 🔖 TSNE<T> 类
- 🔖 距离度量类
-
📒 信号处理模块
-
📒 数值模块
-
📒 统计模块
- 🔖 基础统计函数
- 🔖 高级统计函数
- 🔖 稳健统计 / RunningMoments
- 🔖 其它统计函数
- 🔖 分布相关函数
- 🔖 时间序列分析
- 🔖 IComparable 扩展
- 🔖 ExtremeValueFinder
- 🔖 INumber 扩展
-
📒 FFTW 扩展
-
📒 示例