mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-19 02:58:05 +00:00
[CodeFactor] Apply fixes to commit 9697fac
This commit is contained in:
@@ -400,7 +400,7 @@ public sealed class ALaguerre : AbstractBase
|
||||
s.LastValid = input;
|
||||
|
||||
// Filt = (L0 + 2*L1 + 2*L2 + L3) / 6
|
||||
double result = (s.L0 + 2.0 * s.L1 + 2.0 * s.L2 + s.L3) / 6.0;
|
||||
double result = (s.L0 + (2.0 * s.L1) + (2.0 * s.L2) + s.L3) / 6.0;
|
||||
s.LastResult = result;
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -159,7 +159,7 @@ public sealed class Bpf : AbstractBase
|
||||
|
||||
// Highpass Filter Step
|
||||
// hp = hp_c1 * (val - 2*src1 + src2) + hp_c2 * hp1 + hp_c3 * hp2
|
||||
double term1 = _hpC1 * (val - 2.0 * _state.Src1 + _state.Src2);
|
||||
double term1 = _hpC1 * (val - (2.0 * _state.Src1) + _state.Src2);
|
||||
double hp = Math.FusedMultiplyAdd(_hpC2, _state.Hp1, Math.FusedMultiplyAdd(_hpC3, _state.Hp2, term1));
|
||||
|
||||
// Lowpass Filter Step (Bandpass output)
|
||||
@@ -187,7 +187,6 @@ public sealed class Bpf : AbstractBase
|
||||
return indicator.Update(source);
|
||||
}
|
||||
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static void Batch(ReadOnlySpan<double> source, Span<double> output, int lowerPeriod, int upperPeriod)
|
||||
{
|
||||
@@ -240,7 +239,7 @@ public sealed class Bpf : AbstractBase
|
||||
}
|
||||
|
||||
// Highpass
|
||||
double term1 = hpC1 * (val - 2.0 * src1 + src2);
|
||||
double term1 = hpC1 * (val - (2.0 * src1) + src2);
|
||||
double hp = Math.FusedMultiplyAdd(hpC2, hp1, Math.FusedMultiplyAdd(hpC3, hp2, term1));
|
||||
|
||||
// Lowpass
|
||||
|
||||
@@ -93,7 +93,7 @@ public sealed class Butter2 : AbstractBase
|
||||
DateTime baseTime = DateTime.UtcNow;
|
||||
for (int i = 0; i < source.Length; i++)
|
||||
{
|
||||
Update(new TValue(baseTime + interval * i, source[i]));
|
||||
Update(new TValue(baseTime + (interval * i), source[i]));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ public sealed class Butter3 : AbstractBase
|
||||
double c1 = a1 * a1;
|
||||
|
||||
coef2 = b1 + c1;
|
||||
coef3 = -(c1 + b1 * c1);
|
||||
coef3 = -(c1 + (b1 * c1));
|
||||
coef4 = c1 * c1;
|
||||
coef1 = (1.0 - b1 + c1) * (1.0 - c1) / 8.0;
|
||||
}
|
||||
@@ -87,7 +87,7 @@ public sealed class Butter3 : AbstractBase
|
||||
DateTime baseTime = DateTime.UtcNow;
|
||||
for (int i = 0; i < source.Length; i++)
|
||||
{
|
||||
Update(new TValue(baseTime + interval * i, source[i]));
|
||||
Update(new TValue(baseTime + (interval * i), source[i]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ public sealed class Butter3 : AbstractBase
|
||||
: Math.FusedMultiplyAdd(_coef4, _state.Y3,
|
||||
Math.FusedMultiplyAdd(_coef3, _state.Y2,
|
||||
Math.FusedMultiplyAdd(_coef2, _state.Y1,
|
||||
_coef1 * (x + 3.0 * _state.X1 + 3.0 * _state.X2 + _state.X3))));
|
||||
_coef1 * (x + (3.0 * _state.X1) + (3.0 * _state.X2) + _state.X3))));
|
||||
|
||||
// Update state: shift history
|
||||
_state.X3 = _state.X2;
|
||||
@@ -203,7 +203,7 @@ public sealed class Butter3 : AbstractBase
|
||||
: Math.FusedMultiplyAdd(coef4, y3,
|
||||
Math.FusedMultiplyAdd(coef3, y2,
|
||||
Math.FusedMultiplyAdd(coef2, y1,
|
||||
coef1 * (x + 3.0 * x1 + 3.0 * x2 + x3))));
|
||||
coef1 * (x + (3.0 * x1) + (3.0 * x2) + x3))));
|
||||
|
||||
x3 = x2;
|
||||
x2 = x1;
|
||||
|
||||
@@ -226,7 +226,7 @@ public sealed class Cfitz : AbstractBase
|
||||
}
|
||||
|
||||
// Endpoint correction: b̃ = -0.5*B_0 - Σ B_j
|
||||
double btilde = -0.5 * _b0 - sumBj;
|
||||
double btilde = (-0.5 * _b0) - sumBj;
|
||||
weightedSum += btilde * _history[0];
|
||||
|
||||
return weightedSum;
|
||||
@@ -303,7 +303,7 @@ public sealed class Cfitz : AbstractBase
|
||||
ws += bWeights[j] * source[j]; // y_{j+1} in 0-index is source[j]
|
||||
sBj += bWeights[j];
|
||||
}
|
||||
double bt = -0.5 * b0 - sBj;
|
||||
double bt = (-0.5 * b0) - sBj;
|
||||
ws += bt * source[T - 1];
|
||||
output[t] = ws;
|
||||
}
|
||||
@@ -317,7 +317,7 @@ public sealed class Cfitz : AbstractBase
|
||||
ws += bWeights[j] * source[T - 1 - j];
|
||||
sBj += bWeights[j];
|
||||
}
|
||||
double bt = -0.5 * b0 - sBj;
|
||||
double bt = (-0.5 * b0) - sBj;
|
||||
ws += bt * source[0];
|
||||
output[t] = ws;
|
||||
}
|
||||
@@ -339,7 +339,7 @@ public sealed class Cfitz : AbstractBase
|
||||
sumFwd += bWeights[j];
|
||||
}
|
||||
// Far endpoint correction
|
||||
double btFwd = -0.5 * b0 - sumFwd;
|
||||
double btFwd = (-0.5 * b0) - sumFwd;
|
||||
ws += btFwd * source[T - 1];
|
||||
|
||||
// Backward terms: j=1..tp-2 = t-1 in 0-indexed
|
||||
@@ -351,7 +351,7 @@ public sealed class Cfitz : AbstractBase
|
||||
sumBwd += bWeights[j];
|
||||
}
|
||||
// Near endpoint correction
|
||||
double btBwd = -0.5 * b0 - sumBwd;
|
||||
double btBwd = (-0.5 * b0) - sumBwd;
|
||||
ws += btBwd * source[0];
|
||||
|
||||
output[t] = ws;
|
||||
|
||||
@@ -72,9 +72,9 @@ public sealed class Cheby1 : AbstractBase
|
||||
double omegaD = coshMu * Wc;
|
||||
double K = Math.FusedMultiplyAdd(sigma, sigma, omegaD * omegaD);
|
||||
|
||||
double a0z = 1.0 - 2.0 * sigma + K;
|
||||
double a1z = 2.0 * K - 2.0;
|
||||
double a2z = 1.0 + 2.0 * sigma + K;
|
||||
double a0z = 1.0 - (2.0 * sigma) + K;
|
||||
double a1z = (2.0 * K) - 2.0;
|
||||
double a2z = 1.0 + (2.0 * sigma) + K;
|
||||
double b0z = K;
|
||||
double b1z = 2.0 * K;
|
||||
double b2z = K;
|
||||
@@ -202,7 +202,6 @@ public sealed class Cheby1 : AbstractBase
|
||||
return indicator.Update(source);
|
||||
}
|
||||
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static void Batch(ReadOnlySpan<double> source, Span<double> output, int period, double ripple = 1.0)
|
||||
{
|
||||
@@ -231,11 +230,11 @@ public sealed class Cheby1 : AbstractBase
|
||||
double coshMu = Math.Cosh(mu);
|
||||
double sigma = -sinhMu * Wc;
|
||||
double omegaD = coshMu * Wc;
|
||||
double K = sigma * sigma + omegaD * omegaD;
|
||||
double K = (sigma * sigma) + (omegaD * omegaD);
|
||||
|
||||
double a0z = 1.0 - 2.0 * sigma + K;
|
||||
double a1z = 2.0 * K - 2.0;
|
||||
double a2z = 1.0 + 2.0 * sigma + K;
|
||||
double a0z = 1.0 - (2.0 * sigma) + K;
|
||||
double a1z = (2.0 * K) - 2.0;
|
||||
double a2z = 1.0 + (2.0 * sigma) + K;
|
||||
double b0z = K;
|
||||
double b1z = 2.0 * K;
|
||||
double b2z = K;
|
||||
|
||||
@@ -77,12 +77,12 @@ public sealed class Cheby2 : AbstractBase
|
||||
double Kz = omegaZ * omegaZ;
|
||||
double dcGain = Kz / Kp;
|
||||
|
||||
double a0z = 1.0 - 2.0 * sigmaP + Kp;
|
||||
double a1z = 2.0 * Kp - 2.0;
|
||||
double a2z = 1.0 + 2.0 * sigmaP + Kp;
|
||||
double a0z = 1.0 - (2.0 * sigmaP) + Kp;
|
||||
double a1z = (2.0 * Kp) - 2.0;
|
||||
double a2z = 1.0 + (2.0 * sigmaP) + Kp;
|
||||
|
||||
double b0z = dcGain * (1.0 + Kz);
|
||||
double b1z = dcGain * (2.0 * Kz - 2.0);
|
||||
double b1z = dcGain * ((2.0 * Kz) - 2.0);
|
||||
double b2z = dcGain * (1.0 + Kz);
|
||||
|
||||
// Normalize
|
||||
@@ -258,12 +258,12 @@ public sealed class Cheby2 : AbstractBase
|
||||
double Kz = omegaZ * omegaZ;
|
||||
double dcGain = Kz / Kp;
|
||||
|
||||
double a0z = 1.0 - 2.0 * sigmaP + Kp;
|
||||
double a1z = 2.0 * Kp - 2.0;
|
||||
double a2z = 1.0 + 2.0 * sigmaP + Kp;
|
||||
double a0z = 1.0 - (2.0 * sigmaP) + Kp;
|
||||
double a1z = (2.0 * Kp) - 2.0;
|
||||
double a2z = 1.0 + (2.0 * sigmaP) + Kp;
|
||||
|
||||
double b0z = dcGain * (1.0 + Kz);
|
||||
double b1z = dcGain * (2.0 * Kz - 2.0);
|
||||
double b1z = dcGain * ((2.0 * Kz) - 2.0);
|
||||
double b2z = dcGain * (1.0 + Kz);
|
||||
|
||||
double b0 = b0z / a0z;
|
||||
|
||||
@@ -49,7 +49,7 @@ public sealed class Edcf : AbstractBase
|
||||
// But the inner loop looks back within the same window, so we only need 'length' samples
|
||||
// However, the EasyLanguage code accesses Price[count + LookBack] where count goes to Length-1
|
||||
// and LookBack goes to Length-1, so max index = 2*(Length-1). We need 2*Length - 1 in the buffer.
|
||||
_buffer = new RingBuffer(2 * length - 1);
|
||||
_buffer = new RingBuffer((2 * length) - 1);
|
||||
WarmupPeriod = length;
|
||||
Name = $"Edcf({_length})";
|
||||
}
|
||||
@@ -215,12 +215,12 @@ public sealed class Edcf : AbstractBase
|
||||
|
||||
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
|
||||
{
|
||||
long initialTicks = DateTime.UtcNow.Ticks - source.Length * (step?.Ticks ?? TimeSpan.FromSeconds(1).Ticks);
|
||||
long initialTicks = DateTime.UtcNow.Ticks - (source.Length * (step?.Ticks ?? TimeSpan.FromSeconds(1).Ticks));
|
||||
TimeSpan increment = step ?? TimeSpan.FromSeconds(1);
|
||||
|
||||
for (int i = 0; i < source.Length; i++)
|
||||
{
|
||||
Update(new TValue(initialTicks + i * increment.Ticks, source[i]));
|
||||
Update(new TValue(initialTicks + (i * increment.Ticks), source[i]));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ public sealed class Elliptic : AbstractBase
|
||||
double sigma_scaled = C_sigma * Wc;
|
||||
double Kp_scaled = C_Kp_norm * Wc * Wc;
|
||||
|
||||
double a0_denom = 1.0 - 2.0 * sigma_scaled + Kp_scaled;
|
||||
double a0_denom = 1.0 - (2.0 * sigma_scaled) + Kp_scaled;
|
||||
if (Math.Abs(a0_denom) < 1e-9)
|
||||
{
|
||||
a0_denom = 1e-9;
|
||||
@@ -73,12 +73,12 @@ public sealed class Elliptic : AbstractBase
|
||||
|
||||
const double norm_factor = C_Kp_norm / (C_k * C_wz * C_wz);
|
||||
|
||||
double b0_val = norm_factor * C_k * (1.0 + omega_z_scaled * omega_z_scaled) / a0_denom;
|
||||
double b1_val = norm_factor * C_k * (2.0 * omega_z_scaled * omega_z_scaled - 2.0) / a0_denom;
|
||||
double b0_val = norm_factor * C_k * (1.0 + (omega_z_scaled * omega_z_scaled)) / a0_denom;
|
||||
double b1_val = norm_factor * C_k * ((2.0 * omega_z_scaled * omega_z_scaled) - 2.0) / a0_denom;
|
||||
double b2_val = b0_val;
|
||||
|
||||
double a1_val = (2.0 * Kp_scaled - 2.0) / a0_denom;
|
||||
double a2_val = (1.0 + 2.0 * sigma_scaled + Kp_scaled) / a0_denom;
|
||||
double a1_val = ((2.0 * Kp_scaled) - 2.0) / a0_denom;
|
||||
double a2_val = (1.0 + (2.0 * sigma_scaled) + Kp_scaled) / a0_denom;
|
||||
|
||||
// Validate and Normalize for Unity Gain at DC
|
||||
// DC Gain = (b0 + b1 + b2) / (1 + a1 + a2)
|
||||
@@ -207,7 +207,6 @@ public sealed class Elliptic : AbstractBase
|
||||
return indicator.Update(source);
|
||||
}
|
||||
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static void Batch(ReadOnlySpan<double> source, Span<double> output, int period)
|
||||
{
|
||||
@@ -255,7 +254,7 @@ public sealed class Elliptic : AbstractBase
|
||||
double sigma_scaled = C_sigma * Wc;
|
||||
double Kp_scaled = C_Kp_norm * Wc * Wc;
|
||||
|
||||
double a0_denom = 1.0 - 2.0 * sigma_scaled + Kp_scaled;
|
||||
double a0_denom = 1.0 - (2.0 * sigma_scaled) + Kp_scaled;
|
||||
if (Math.Abs(a0_denom) < 1e-9)
|
||||
{
|
||||
a0_denom = 1e-9;
|
||||
@@ -263,12 +262,12 @@ public sealed class Elliptic : AbstractBase
|
||||
|
||||
const double norm_factor = C_Kp_norm / (C_k * C_wz * C_wz);
|
||||
|
||||
double b0 = norm_factor * C_k * (1.0 + omega_z_scaled * omega_z_scaled) / a0_denom;
|
||||
double b1 = norm_factor * C_k * (2.0 * omega_z_scaled * omega_z_scaled - 2.0) / a0_denom;
|
||||
double b0 = norm_factor * C_k * (1.0 + (omega_z_scaled * omega_z_scaled)) / a0_denom;
|
||||
double b1 = norm_factor * C_k * ((2.0 * omega_z_scaled * omega_z_scaled) - 2.0) / a0_denom;
|
||||
double b2 = b0;
|
||||
|
||||
double a1 = (2.0 * Kp_scaled - 2.0) / a0_denom;
|
||||
double a2 = (1.0 + 2.0 * sigma_scaled + Kp_scaled) / a0_denom;
|
||||
double a1 = ((2.0 * Kp_scaled) - 2.0) / a0_denom;
|
||||
double a2 = (1.0 + (2.0 * sigma_scaled) + Kp_scaled) / a0_denom;
|
||||
|
||||
// Normalize constants for Unity Gain
|
||||
double sum_b = b0 + b1 + b2;
|
||||
|
||||
@@ -50,7 +50,7 @@ public sealed class Gauss : AbstractBase
|
||||
}
|
||||
|
||||
_sigma = sigma;
|
||||
KernelSize = (int)(2 * Math.Ceiling(3.0 * sigma) + 1);
|
||||
KernelSize = (int)((2 * Math.Ceiling(3.0 * sigma)) + 1);
|
||||
WarmupPeriod = KernelSize;
|
||||
Name = $"Gauss({sigma:F2})";
|
||||
_buffer = new RingBuffer(KernelSize);
|
||||
@@ -241,7 +241,7 @@ public sealed class Gauss : AbstractBase
|
||||
throw new ArgumentException("Source and output spans must be of equal length.", nameof(output));
|
||||
}
|
||||
|
||||
int kernelSize = (int)(2 * Math.Ceiling(3.0 * sigma) + 1);
|
||||
int kernelSize = (int)((2 * Math.Ceiling(3.0 * sigma)) + 1);
|
||||
|
||||
// Use stackalloc for small kernels, ArrayPool for large ones to avoid stack overflow
|
||||
double[]? rented = null;
|
||||
|
||||
@@ -53,7 +53,7 @@ public sealed class Hp : AbstractBase
|
||||
Lambda = lambda;
|
||||
|
||||
double s = Math.Sqrt(lambda);
|
||||
_alpha = (s * 0.5 - 1.0) / (s * 0.5 + 1.0);
|
||||
_alpha = ((s * 0.5) - 1.0) / ((s * 0.5) + 1.0);
|
||||
_alpha = Math.Clamp(_alpha, 0.0001, 0.9999);
|
||||
_oneMinusAlpha = 1.0 - _alpha;
|
||||
_halfAlpha = 0.5 * _alpha;
|
||||
@@ -218,7 +218,7 @@ public sealed class Hp : AbstractBase
|
||||
}
|
||||
|
||||
double s = Math.Sqrt(lambda);
|
||||
double alpha = (s * 0.5 - 1.0) / (s * 0.5 + 1.0);
|
||||
double alpha = ((s * 0.5) - 1.0) / ((s * 0.5) + 1.0);
|
||||
alpha = Math.Clamp(alpha, 0.0001, 0.9999);
|
||||
|
||||
double oneMinusAlpha = 1.0 - alpha;
|
||||
|
||||
@@ -251,7 +251,7 @@ public sealed class Hpf : AbstractBase
|
||||
double a = (cosW + sinW - 1.0) / cosW;
|
||||
double oneMinusA = 1.0 - a;
|
||||
|
||||
double t = 1.0 - 0.5 * a;
|
||||
double t = 1.0 - (0.5 * a);
|
||||
double c1 = t * t;
|
||||
double c2 = 2.0 * oneMinusA;
|
||||
double c3 = oneMinusA * oneMinusA;
|
||||
@@ -316,7 +316,6 @@ public sealed class Hpf : AbstractBase
|
||||
return (results, indicator);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Unsubscribes from the source publisher if one was provided during construction.
|
||||
/// </summary>
|
||||
|
||||
@@ -263,7 +263,7 @@ public sealed class Laguerre : AbstractBase
|
||||
s.LastValid = input;
|
||||
|
||||
// Filt = (L0 + 2*L1 + 2*L2 + L3) / 6
|
||||
return (s.L0 + 2.0 * s.L1 + 2.0 * s.L2 + s.L3) / 6.0;
|
||||
return (s.L0 + (2.0 * s.L1) + (2.0 * s.L2) + s.L3) / 6.0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -131,7 +131,7 @@ public sealed class OneEuro : AbstractBase
|
||||
s.DxHat = Math.FusedMultiplyAdd(_alphaD, dx - s.DxHat, s.DxHat);
|
||||
|
||||
// Step 3: Adaptive cutoff
|
||||
double fc = MinCutoff + Beta * Math.Abs(s.DxHat);
|
||||
double fc = MinCutoff + (Beta * Math.Abs(s.DxHat));
|
||||
|
||||
// Step 4: Smoothing factor α = r / (r + 1), r = 2π·fc
|
||||
double r = 2.0 * Math.PI * fc;
|
||||
@@ -223,7 +223,7 @@ public sealed class OneEuro : AbstractBase
|
||||
dxHat = Math.FusedMultiplyAdd(alphaD, dx - dxHat, dxHat);
|
||||
|
||||
// Adaptive cutoff
|
||||
double fc = minCutoff + beta * Math.Abs(dxHat);
|
||||
double fc = minCutoff + (beta * Math.Abs(dxHat));
|
||||
|
||||
// Smoothing factor
|
||||
double r = 2.0 * Math.PI * fc;
|
||||
|
||||
@@ -88,7 +88,7 @@ public sealed class Rls : AbstractBase
|
||||
_p_P = new double[matSize];
|
||||
for (int i = 0; i < order; i++)
|
||||
{
|
||||
_P[i * order + i] = delta;
|
||||
_P[(i * order) + i] = delta;
|
||||
}
|
||||
|
||||
// Ring buffer holds order+1 values: current + order past values
|
||||
@@ -247,7 +247,7 @@ public sealed class Rls : AbstractBase
|
||||
int rowBase = i * _order;
|
||||
for (int j = 0; j < _order; j++)
|
||||
{
|
||||
_P[rowBase + j] = _invLambda * (_P[rowBase + j] - ki * px[j]);
|
||||
_P[rowBase + j] = _invLambda * (_P[rowBase + j] - (ki * px[j]));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -304,7 +304,7 @@ public sealed class Rls : AbstractBase
|
||||
double[] P = new double[matSize];
|
||||
for (int i = 0; i < order; i++)
|
||||
{
|
||||
P[i * order + i] = delta;
|
||||
P[(i * order) + i] = delta;
|
||||
}
|
||||
|
||||
// Temporary buffers for Px and k
|
||||
@@ -391,7 +391,7 @@ public sealed class Rls : AbstractBase
|
||||
int rowBase = i * order;
|
||||
for (int j = 0; j < order; j++)
|
||||
{
|
||||
P[rowBase + j] = invLambda * (P[rowBase + j] - ki * px[j]);
|
||||
P[rowBase + j] = invLambda * (P[rowBase + j] - (ki * px[j]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -414,7 +414,7 @@ public sealed class Rls : AbstractBase
|
||||
Array.Clear(_p_P);
|
||||
for (int i = 0; i < _order; i++)
|
||||
{
|
||||
_P[i * _order + i] = delta;
|
||||
_P[(i * _order) + i] = delta;
|
||||
}
|
||||
|
||||
Last = default;
|
||||
|
||||
@@ -159,7 +159,7 @@ public sealed class Roofing : AbstractBase
|
||||
|
||||
// Stage 1: Highpass Filter (removes trend)
|
||||
// hp = hpC1 * (val - 2*src1 + src2) + hpC2 * hp1 + hpC3 * hp2
|
||||
double hpInput = _hpC1 * (val - 2.0 * _state.Src1 + _state.Src2);
|
||||
double hpInput = _hpC1 * (val - (2.0 * _state.Src1) + _state.Src2);
|
||||
double hp = Math.FusedMultiplyAdd(_hpC2, _state.Hp1, Math.FusedMultiplyAdd(_hpC3, _state.Hp2, hpInput));
|
||||
|
||||
// Stage 2: Super Smoother (removes noise from HP output)
|
||||
@@ -238,7 +238,7 @@ public sealed class Roofing : AbstractBase
|
||||
}
|
||||
|
||||
// Highpass
|
||||
double hpInput = hpC1 * (val - 2.0 * src1 + src2);
|
||||
double hpInput = hpC1 * (val - (2.0 * src1) + src2);
|
||||
double hp = Math.FusedMultiplyAdd(hpC2, hp1, Math.FusedMultiplyAdd(hpC3, hp2, hpInput));
|
||||
|
||||
// Super Smoother
|
||||
|
||||
@@ -156,7 +156,7 @@ public sealed class Sak : AbstractBase
|
||||
break;
|
||||
|
||||
case "HP":
|
||||
_c0 = 1.0 - alpha / 2.0; _b0 = 1; _b1 = -1; _b2 = 0;
|
||||
_c0 = 1.0 - (alpha / 2.0); _b0 = 1; _b1 = -1; _b2 = 0;
|
||||
_a1 = decay; _a2 = 0;
|
||||
break;
|
||||
|
||||
@@ -245,7 +245,7 @@ public sealed class Sak : AbstractBase
|
||||
double oldest = _smaBuf!.IsFull ? _smaBuf.Oldest : 0.0;
|
||||
_smaBuf.Add(val, isNew);
|
||||
// _state.Y1 holds the running sum
|
||||
y = Math.FusedMultiplyAdd(_oneDivN, val, _state.Y1 - _oneDivN * oldest);
|
||||
y = Math.FusedMultiplyAdd(_oneDivN, val, _state.Y1 - (_oneDivN * oldest));
|
||||
_state.Y1 = y;
|
||||
}
|
||||
else
|
||||
@@ -388,7 +388,7 @@ public sealed class Sak : AbstractBase
|
||||
{
|
||||
double oldest = (smaBuf != null && smaBuf.IsFull) ? smaBuf.Oldest : 0.0;
|
||||
smaBuf?.Add(val);
|
||||
y = Math.FusedMultiplyAdd(oneDivN, val, state.Y1 - oneDivN * oldest);
|
||||
y = Math.FusedMultiplyAdd(oneDivN, val, state.Y1 - (oneDivN * oldest));
|
||||
state.Y1 = y;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -69,17 +69,17 @@ public sealed class Sgf : AbstractBase
|
||||
double weight = 0;
|
||||
if (_polyOrder == 2)
|
||||
{
|
||||
weight = 3.0 * (3.0 * _period * _period - 7.0 - 20.0 * k * k);
|
||||
weight = 3.0 * ((3.0 * _period * _period) - 7.0 - (20.0 * k * k));
|
||||
}
|
||||
else if (_polyOrder == 4)
|
||||
{
|
||||
double k2 = k * k;
|
||||
weight = 15.0 + k2 * (-20.0 + k2 * 6.0);
|
||||
weight = 15.0 + (k2 * (-20.0 + (k2 * 6.0)));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Guard against division by zero when halfWindow == 0 (period == 1)
|
||||
weight = (halfWindow == 0) ? 1.0 : 1.0 - Math.Abs((double)k) / (double)halfWindow;
|
||||
weight = (halfWindow == 0) ? 1.0 : 1.0 - (Math.Abs((double)k) / (double)halfWindow);
|
||||
}
|
||||
|
||||
_weights[i] = weight;
|
||||
@@ -287,17 +287,17 @@ public sealed class Sgf : AbstractBase
|
||||
double weight = 0;
|
||||
if (polyOrder == 2)
|
||||
{
|
||||
weight = 3.0 * (3.0 * period * period - 7.0 - 20.0 * k * k);
|
||||
weight = 3.0 * ((3.0 * period * period) - 7.0 - (20.0 * k * k));
|
||||
}
|
||||
else if (polyOrder == 4)
|
||||
{
|
||||
double k2 = k * k;
|
||||
weight = 15.0 + k2 * (-20.0 + k2 * 6.0);
|
||||
weight = 15.0 + (k2 * (-20.0 + (k2 * 6.0)));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Guard against division by zero when halfWindow == 0 (period == 1)
|
||||
weight = (halfWindow == 0) ? 1.0 : 1.0 - Math.Abs((double)k) / (double)halfWindow;
|
||||
weight = (halfWindow == 0) ? 1.0 : 1.0 - (Math.Abs((double)k) / (double)halfWindow);
|
||||
}
|
||||
|
||||
weights[i] = weight;
|
||||
|
||||
@@ -58,7 +58,7 @@ public sealed class Ssf3 : AbstractBase
|
||||
double c1 = a1 * a1;
|
||||
|
||||
coef2 = b1 + c1;
|
||||
coef3 = -(c1 + b1 * c1);
|
||||
coef3 = -(c1 + (b1 * c1));
|
||||
coef4 = c1 * c1;
|
||||
coef1 = 1.0 - coef2 - coef3 - coef4;
|
||||
}
|
||||
@@ -88,7 +88,7 @@ public sealed class Ssf3 : AbstractBase
|
||||
DateTime baseTime = DateTime.UtcNow;
|
||||
for (int i = 0; i < source.Length; i++)
|
||||
{
|
||||
Update(new TValue(baseTime + interval * i, source[i]));
|
||||
Update(new TValue(baseTime + (interval * i), source[i]));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ public sealed class Usf : AbstractBase
|
||||
|
||||
// Precompute coefficients for FMA optimization
|
||||
_k0 = 1.0 - _c1; // coefficient for val
|
||||
_k1 = 2.0 * _c1 - _c2; // coefficient for PrevInput1
|
||||
_k1 = (2.0 * _c1) - _c2; // coefficient for PrevInput1
|
||||
_k2 = -(_c1 + _c3); // coefficient for PrevInput2
|
||||
|
||||
Name = $"Usf({period})";
|
||||
@@ -281,7 +281,7 @@ public sealed class Usf : AbstractBase
|
||||
|
||||
// Precompute coefficients for FMA (outside loop)
|
||||
double k0 = 1.0 - c1;
|
||||
double k1 = 2.0 * c1 - c2;
|
||||
double k1 = (2.0 * c1) - c2;
|
||||
double k2 = -(c1 + c3);
|
||||
|
||||
for (; i < len; i++)
|
||||
|
||||
@@ -102,7 +102,7 @@ public sealed class Voss : AbstractBase
|
||||
double twoPiOverPeriod = 2.0 * Math.PI / period;
|
||||
_f1 = Math.Cos(twoPiOverPeriod);
|
||||
double g1 = Math.Cos(bandwidth * twoPiOverPeriod);
|
||||
_s1 = 1.0 / g1 - Math.Sqrt(1.0 / (g1 * g1) - 1.0);
|
||||
_s1 = (1.0 / g1) - Math.Sqrt((1.0 / (g1 * g1)) - 1.0);
|
||||
|
||||
_vossRing = new double[_order + 1];
|
||||
_s.LastValid = double.NaN;
|
||||
@@ -203,11 +203,11 @@ public sealed class Voss : AbstractBase
|
||||
for (int count = 0; count < _order; count++)
|
||||
{
|
||||
int idx = _order - count; // lookback distance
|
||||
int ringPos = (_vossIdx - idx + ringLen * 2) % ringLen;
|
||||
int ringPos = (_vossIdx - idx + (ringLen * 2)) % ringLen;
|
||||
sumC += (double)(count + 1) / _order * _vossRing[ringPos];
|
||||
}
|
||||
|
||||
double vossVal = (double)(3 + _order) / 2.0 * filt - sumC;
|
||||
double vossVal = ((double)(3 + _order) / 2.0 * filt) - sumC;
|
||||
|
||||
// State shifts for next bar
|
||||
if (isNew)
|
||||
@@ -261,7 +261,7 @@ public sealed class Voss : AbstractBase
|
||||
double twoPiOverPeriod = 2.0 * Math.PI / period;
|
||||
double f1 = Math.Cos(twoPiOverPeriod);
|
||||
double g1 = Math.Cos(bandwidth * twoPiOverPeriod);
|
||||
double s1 = 1.0 / g1 - Math.Sqrt(1.0 / (g1 * g1) - 1.0);
|
||||
double s1 = (1.0 / g1) - Math.Sqrt((1.0 / (g1 * g1)) - 1.0);
|
||||
|
||||
int order = 3 * predict;
|
||||
double[] vossHistory = new double[source.Length];
|
||||
@@ -319,7 +319,7 @@ public sealed class Voss : AbstractBase
|
||||
}
|
||||
}
|
||||
|
||||
double vossVal = (double)(3 + order) / 2.0 * filt - sumC;
|
||||
double vossVal = ((double)(3 + order) / 2.0 * filt) - sumC;
|
||||
vossHistory[i] = vossVal;
|
||||
output[i] = vossVal;
|
||||
|
||||
|
||||
@@ -160,17 +160,17 @@ public sealed class Wiener : AbstractBase
|
||||
|
||||
// result = mean + k * (src - mean)
|
||||
double src0 = _buffer[^1];
|
||||
return mean + kp * (src0 - mean);
|
||||
return mean + (kp * (src0 - mean));
|
||||
}
|
||||
|
||||
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
|
||||
{
|
||||
long initialTicks = DateTime.UtcNow.Ticks - source.Length * (step?.Ticks ?? TimeSpan.FromSeconds(1).Ticks);
|
||||
long initialTicks = DateTime.UtcNow.Ticks - (source.Length * (step?.Ticks ?? TimeSpan.FromSeconds(1).Ticks));
|
||||
TimeSpan increment = step ?? TimeSpan.FromSeconds(1);
|
||||
|
||||
for (int i = 0; i < source.Length; i++)
|
||||
{
|
||||
Update(new TValue(initialTicks + i * increment.Ticks, source[i]));
|
||||
Update(new TValue(initialTicks + (i * increment.Ticks), source[i]));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user