15 KiB
15 KiB
source_files, generated_at, model, schema_version, sha256
| source_files | generated_at | model | schema_version | sha256 | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
2026-04-16T03:48:44.236669+00:00 | Qwen/Qwen3-Coder-Next-FP8 | 1 | e35f8b9ef214514d |
Exocortex.DSP Module Documentation
1. Purpose
This module provides core digital signal processing (DSP) functionality for the Exocortex Technologies library. It defines foundational types and utilities including complex number representations (Complex, ComplexF), polynomial evaluation (Polynomial, SimplePolynomial), filter implementations (PassFilter), Fourier transform direction specification (FourierDirection), and statistical operations on complex arrays (ComplexStats). The module serves as the mathematical backbone for signal analysis and transformation operations within the larger DataPRO system.
2. Public Interface
Structs
Complex
public Complex(double real, double imaginary)
Constructs a double-precision complex number from real and imaginary components.public Complex(Complex c)
Copy constructor.public static Complex FromRealImaginary(double real, double imaginary)
Factory method to create a complex number from real/imaginary parts.public static Complex FromModulusArgument(double modulus, double argument)
Factory method to create a complex number from polar coordinates (modulus and argument in radians).public double GetModulus()
Returns the magnitude (Euclidean norm) of the complex number.public double GetModulusSquared()
Returns the squared magnitude (faster thanGetModulus()).public double GetArgument()
Returns the phase angle (argument) in radians.public Complex GetConjugate()
Returns the complex conjugate.public void Normalize()
Scales the complex number to unit magnitude (throwsDivideByZeroExceptionif zero).public static explicit operator Complex(ComplexF cF)
Explicit cast from single-precisionComplexFtoComplex.public static explicit operator Complex(double d)
Explicit cast fromdoubletoComplex(real part =d, imaginary part = 0).public static explicit operator double(Complex c)
Explicit cast fromComplextodouble(returns real part).public static bool operator ==(Complex a, Complex b)
Equality comparison (exact).public static bool operator !=(Complex a, Complex b)
Inequality comparison (exact).public override bool Equals(object o)
Object equality (delegates to==).public int CompareTo(object o)
Compares based on magnitude (modulus). Supports comparison withComplex,double,ComplexF,float, ornull.public static Complex operator +(Complex a)
Unary plus.public static Complex operator -(Complex a)
Unary negation.public static Complex operator +(Complex a, double f)/operator +(double f, Complex a)
Addition with real scalar.public static Complex operator +(Complex a, Complex b)
Complex addition.public static Complex operator -(Complex a, double f)/operator -(double f, Complex a)
Subtraction with real scalar.public static Complex operator -(Complex a, Complex b)
Complex subtraction.public static Complex operator *(Complex a, double f)/operator *(double f, Complex a)
Scalar multiplication.public static Complex operator *(Complex a, Complex b)
Complex multiplication.public static Complex operator /(Complex a, double f)
Scalar division (throwsDivideByZeroExceptioniff == 0).public static Complex operator /(Complex a, Complex b)
Complex division (throwsDivideByZeroExceptionif divisor is zero).public static bool IsEqual(Complex a, Complex b, double tolerance)
Approximate equality check withintolerance.public override string ToString()
Returns string in format"( {Re}, {Im}i )".public static Complex Zero
Static property returning(0, 0).public static Complex I
Static property returning(0, 1)(imaginary unit).public static Complex MaxValue/MinValue
Static properties for extreme values.
ComplexF
- Note: Definition not provided in source files, but referenced extensively in
ComplexStatsandComplexMath. Assumed to be a single-precision counterpart toComplex.
Classes
Polynomial
protected double[] coefficients
Protected field storing the polynomial coefficients (index 0 = constant term).public Polynomial(params double[] coefficients)
Constructor initializing coefficients via deep copy.public abstract double Evaluate(double value)
Abstract method to evaluate the polynomial atvalue.public double GetCoefficient(int index)
Returns coefficient atindex, ordouble.NaNifcoefficients == null,index < 0, orindex >= coefficients.Length.
SimplePolynomial : Polynomial
public SimplePolynomial(params double[] coefficients)
Constructor delegating to base class.public override double Evaluate(double value)
Evaluates polynomial using Horner’s method:
retval = c[0] + c[1]*x + c[2]*x² + ...
Computed iteratively for efficiency.
ComplexMath
private ComplexMath()
Private constructor (static class pattern).public static void Swap(ref Complex a, ref Complex b)
Swaps twoComplexinstances.public static void Swap(ref ComplexF a, ref ComplexF b)
Swaps twoComplexFinstances.public static Complex Sqrt(Complex c)
Computes complex square root using principal branch.
Formula:
real = √2/2 * √(|c| + Re(c))
imag = sign(Im(c)) * √2/2 * √(|c| - Re(c))
where|c|is modulus.public static ComplexF Sqrt(ComplexF c)
Single-precision variant ofSqrt.public static Complex Pow(Complex c, double exponent)
Computesc^exponentvia polar form:
modulus = |c|^exponent,argument = arg(c) * exponent,
then converts back:(modulus * cos(arg), modulus * sin(arg)).public static ComplexF Pow(ComplexF c, double exponent)
Single-precision variant ofPow.
ComplexStats
private ComplexStats()
Private constructor (static class pattern).public static Complex Sum(Complex[] data)/Sum(ComplexF[] data)
Computes sum of array elements using recursive divide-and-conquer (base case ≤1000 elements).public static Complex SumOfSquares(Complex[] data)/SumOfSquares(ComplexF[] data)
ComputesΣ(data[i] * data[i])(note: not|data[i]|²).public static Complex Mean(Complex[] data)/Mean(ComplexF[] data)
Computes arithmetic mean:Sum(data) / data.Length.public static Complex Variance(Complex[] data)/Variance(ComplexF[] data)
Computes variance as:SumOfSquares(data)/n - Sum(data).
ThrowsDivideByZeroExceptionifdata.Length == 0.public static Complex StdDev(Complex[] data)/StdDev(ComplexF[] data)
Computes standard deviation:Sqrt(Variance(data)).
ThrowsDivideByZeroExceptionifdata.Length == 0.public static double RMSError(Complex[] alpha, Complex[] beta)/RMSError(ComplexF[] alpha, ComplexF[] beta)
Computes root mean squared error between two arrays:
sqrt( Σ |beta[i] - alpha[i]|² / n ).
Arrays must be non-null and equal length.
PassFilter
public static double[] HighPass(double[] values, double sampleRate, double centerFrequency, PassFilterType type, uint order)
Applies high-pass filtering via FFT. Delegates toRunFilter(..., lowPass: false).public static double[] LowPass(double[] values, double sampleRate, double centerFrequency, PassFilterType type, uint order)
Applies low-pass filtering via FFT. Delegates toRunFilter(..., lowPass: true).private static double[] RunFilter(..., bool lowPass)
Core filtering logic:- Converts input
double[]toComplex[](imag part = 0). - Applies forward FFT.
- Applies frequency-domain gain function (parallelized via
Parallel.For). - Applies inverse FFT.
- Scales result by
1/N. - Extracts real parts as
double[].
- Note: DC component (
signal[0]) is zeroed only for Chebyshev filter.
- Converts input
private static Complex[] BesselFilter(...)
Implements Bessel filter using precomputed denominator polynomialB.
Gain:numerator / sqrt(B(freq / centerFreq))(low-pass) ornumerator / sqrt(B(centerFreq / freq))(high-pass).private static double BesselGain(...)
Helper for Bessel gain computation.private static Complex[] ButterworthFilter(...)
Implements Butterworth filter.
Gain:DCGain / sqrt(1 + (freq / centerFreq)^(2*order))(low-pass) orDCGain / sqrt(1 + (centerFreq / freq)^(2*order))(high-pass).private static double ButterworthGain(...)
Helper for Butterworth gain computation.private static Complex[] ChebyshevFilter(...)
Implements Chebyshev filter using precomputed Chebyshev polynomialT.
Gain:DCGain / sqrt(1 + ripple * T(freq / centerFreq)^(2*order))(low-pass) or similar for high-pass.
Note: DC component zeroed before filtering.private static double ChebyshevGain(...)
Helper for Chebyshev gain computation.private static Polynomial ChebyshevPolynomial(int order)
ReturnsSimplePolynomialinstance for Chebyshev polynomial of order0–8(hardcoded coefficients). ThrowsNotImplementedExceptionfor other orders.private static Polynomial BesselDenominatorPolynomial(int order)
ReturnsSimplePolynomialinstance for Bessel denominator polynomial (squared magnitude denominator) for orders2–8(hardcoded coefficients). ThrowsNotImplementedExceptionfor other orders.
Enums
FourierDirection
Forward = 1
Indicates forward FFT (time → frequency).Backward = -1
Indicates inverse FFT (frequency → time).
PassFilterType
Bessel
Maximally flat group delay.Butterworth
Maximally flat magnitude response.Chebyshev
Equi-ripple in passband.CriticalDamping
Fastest non-oscillatory response.
3. Invariants
Polynomial.coefficientsis always non-null after construction (deep copy of input array).Polynomial.GetCoefficient(index)returnsdouble.NaNfor invalid indices (null, negative, or ≥ length).Complex.Normalize()throwsDivideByZeroExceptionif modulus is zero.ComplexStats.Variance/StdDevthrowDivideByZeroExceptionif input array length is zero.ComplexStats.RMSErrorasserts (viaDebug.Assert) that both input arrays are non-null and of equal length.ComplexStats.Sum/SumOfSquaresuse recursion with base case size ≤1000 for performance.PassFilter.RunFilterassumes FFT lengthNis even (usesN/2bins for symmetric spectrum).PassFilterfilters requirecenterFrequency > 0; ifcenterFrequency <= 0, no filtering is applied (original signal returned).PassFilterfilters assume input array length matches FFT size (N), and output is scaled by1/Nafter inverse FFT.
4. Dependencies
Internal Dependencies (within Exocortex.DSP)
Complexis used by:ComplexMath(operations onComplex)ComplexStats(statistical operations onComplex[])PassFilter(filtering via FFT)Polynomial(indirectly viaComplex[]inRunFilter)
ComplexFis used by:ComplexMath(single-precision operations)ComplexStats(statistical operations onComplexF[])
Fourieris referenced inPassFilter(Fourier.FFT(...)), but its definition is not provided in the source files.SimplePolynomialis used byPassFilter(Bessel/Chebyshev filter polynomials).
External Dependencies
System(core types:Math,Debug,String,Exception,Attribute,Runtime.InteropServices)System.Threading.Tasks(used forParallel.ForinPassFilter)System.Collections.Generic,System.Linq,System.Text,System.Threading.Tasks(viaPassFilter.cs)
Inferred Usage
Fourier.FFTis a required dependency (not shown in source). Its behavior is assumed to be:- In-place transform of
Complex[]. - Supports
FourierDirection.Forward/Backward. - Output scaling is handled explicitly in
PassFilter(signal = signal.Select(n => n / N).ToArray()).
- In-place transform of
5. Gotchas
ComplexStats.SumOfSquarescomputesΣ(z_i * z_i)(algebraic square), notΣ|z_i|²(squared magnitude). This is unconventional for complex statistics and may be a source of errors.ComplexStats.VarianceformulaSumOfSquares/n - Sumis incorrect for complex numbers. Correct variance should beΣ|z_i - μ|²/n. The current implementation yields complex-valued variance (real part may be negative), which is non-standard.ComplexStats.RMSErrorcomputes RMS error assqrt( Σ|Δ|² / n ), butSumOfSquaredErrorRecursionuses|Δ|² = Δ.Re² + Δ.Im²(correct), whileSumOfSquaresinVariancedoes not.Complex.Parse(string)is declared but throwsNotImplementedException. No parsing support exists.PassFilteruses hardcoded polynomial coefficients for orders0–8(Chebyshev) and2–8(Bessel). Filters for other orders are unsupported.PassFilterfilters assume even-length input arrays (due toN/2bin symmetry assumption). Behavior for odd lengths is undefined.PassFilterfilters zero DC component only for Chebyshev filters (signal[0] = 0), but not for Bessel/Butterworth. This may cause unintended DC offset differences.Complex.GetModulus()andGetArgument()useMath.Sqrt/Math.Atan2, which may have performance implications in hot loops.Complexstruct is mutable (fields are public). Operations likeoperator +,*,/modify the first operand in-place before returning it (e.g.,a + bmutatesa). This violates typical expectations for value types and may cause side effects.Complex.CompareTocompares by magnitude only, not lexicographically. Comparing complex numbers by magnitude may be semantically unclear.Complexhas noIEquatable<Complex>implementation;Equals/==use exact equality (no tolerance).ComplexStatsmethods useDebug.Assertfor validation, which are disabled in release builds. Invalid inputs (e.g., null arrays) may cause runtime exceptions only at runtime (not compile-time).PassFilterusesParallel.Forfor frequency-domain filtering, but may not scale well for small arrays due to parallelization overhead.