2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2025-05-06 19:42:58 +00:00
esiur-dotnet/Esiur.Analysis/DSP/TransferFunction.cs
2022-11-05 17:48:30 +03:00

74 lines
2.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.WebSockets;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Xml.Schema;
namespace Esiur.Analysis.DSP
{
public class TransferFunction
{
public double Step { get; set; }
double[] inputs;
double[] outputs;
public double[] InputCoefficients { get; set; }
public double[] OutputCoefficients { get; set; }
public TransferFunction(double[] numerator, double[] denominator, double step = 0.01)
{
inputs = new double[numerator.Length];
outputs = new double[denominator.Length];
InputCoefficients = numerator.Reverse().ToArray();
OutputCoefficients = denominator.Reverse().ToArray();
Step = step;
}
public double Evaluate(double value)
{
var xs = new double[inputs.Length];
xs[0] = value;// * InputCoefficients.Last();
// diffrentiate
for(var i = 1; i < xs.Length; i++)
xs[i] = (xs[i - 1] - inputs[i - 1]) / Step;
var ys = new double[outputs.Length];
// integrate
for (var i = outputs.Length - 2; i >= 0; i--)
{
var iy = outputs[i] + (Step * outputs[i + 1]);
if (double.IsNaN(iy) || double.IsInfinity(iy))
ys[i] = outputs[i];
else
ys[i] = iy;
}
var v = xs.Zip(InputCoefficients, (x, c) => x * c).Sum() - ys.Zip(OutputCoefficients, (y, c) => y * c).Sum();
if (double.IsNaN(v) || double.IsInfinity(v))
ys[ys.Length - 1] = outputs[ys.Length - 1];
else
ys[ys.Length - 1] = v;
inputs = xs;
outputs = ys;
return ys[0];
}
public double[] Evaluate(double[] value)
{
return value.Select(x => Evaluate(x)).ToArray();
}
}
}