拉普拉斯变换并获得陀螺仪的频繁值
Laplace Transform And Getting The Frequent Value For Gyro
我正在从陀螺仪传感器获取 x,y,z
值。每个变量每秒发送 10 个值。在 3 秒内我有;
x=[30values]
y=[30values]
z=[30values]
一些值与其他值差异太大,导致出现噪音。使用拉普拉斯变换,我需要从我的数组中获取最频繁的值。
我需要用拉普拉斯变换方程过滤数组。我需要在 C# 中构建方程式。如何用等式实现数组?
由于这种过滤器 (Laplace) 非常专门用于 Engineering
的某些领域,并且需要对编程语言(在本例中为 C#)和过滤器本身都有很好理解的人,我建议您使用这样的 source,而不是自己编写过滤器代码。
这是源代码的片段:
class Laplace
{
const int DefaultStehfest = 14;
public delegate double FunctionDelegate(double t);
static double[] V; // Stehfest coefficients
static double ln2; // log of 2
public static void InitStehfest(int N)
{
ln2 = Math.Log(2.0);
int N2 = N / 2;
int NV = 2 * N2;
V = new double[NV];
int sign = 1;
if ((N2 % 2) != 0)
sign = -1;
for (int i = 0; i < NV; i++)
{
int kmin = (i + 2) / 2;
int kmax = i + 1;
if (kmax > N2)
kmax = N2;
V[i] = 0;
sign = -sign;
for (int k = kmin; k <= kmax; k++)
{
V[i] = V[i] + (Math.Pow(k, N2) / Factorial(k)) * (Factorial(2 * k)
/ Factorial(2 * k - i - 1)) / Factorial(N2 - k)
/ Factorial(k - 1) / Factorial(i + 1 - k);
}
V[i] = sign * V[i];
}
}
public static double InverseTransform(FunctionDelegate f, double t)
{
double ln2t = ln2 / t;
double x = 0;
double y = 0;
for (int i = 0; i < V.Length; i++)
{
x += ln2t;
y += V[i] * f(x);
}
return ln2t * y;
}
public static double Factorial(int N)
{
double x = 1;
if (N > 1)
{
for (int i = 2; i <= N; i++)
x = i * x;
}
return x;
}
}
由 Walt Fair Jr. 先生在 CodeProject 中编码。
我正在从陀螺仪传感器获取 x,y,z
值。每个变量每秒发送 10 个值。在 3 秒内我有;
x=[30values]
y=[30values]
z=[30values]
一些值与其他值差异太大,导致出现噪音。使用拉普拉斯变换,我需要从我的数组中获取最频繁的值。
我需要用拉普拉斯变换方程过滤数组。我需要在 C# 中构建方程式。如何用等式实现数组?
由于这种过滤器 (Laplace) 非常专门用于 Engineering
的某些领域,并且需要对编程语言(在本例中为 C#)和过滤器本身都有很好理解的人,我建议您使用这样的 source,而不是自己编写过滤器代码。
这是源代码的片段:
class Laplace
{
const int DefaultStehfest = 14;
public delegate double FunctionDelegate(double t);
static double[] V; // Stehfest coefficients
static double ln2; // log of 2
public static void InitStehfest(int N)
{
ln2 = Math.Log(2.0);
int N2 = N / 2;
int NV = 2 * N2;
V = new double[NV];
int sign = 1;
if ((N2 % 2) != 0)
sign = -1;
for (int i = 0; i < NV; i++)
{
int kmin = (i + 2) / 2;
int kmax = i + 1;
if (kmax > N2)
kmax = N2;
V[i] = 0;
sign = -sign;
for (int k = kmin; k <= kmax; k++)
{
V[i] = V[i] + (Math.Pow(k, N2) / Factorial(k)) * (Factorial(2 * k)
/ Factorial(2 * k - i - 1)) / Factorial(N2 - k)
/ Factorial(k - 1) / Factorial(i + 1 - k);
}
V[i] = sign * V[i];
}
}
public static double InverseTransform(FunctionDelegate f, double t)
{
double ln2t = ln2 / t;
double x = 0;
double y = 0;
for (int i = 0; i < V.Length; i++)
{
x += ln2t;
y += V[i] * f(x);
}
return ln2t * y;
}
public static double Factorial(int N)
{
double x = 1;
if (N > 1)
{
for (int i = 2; i <= N; i++)
x = i * x;
}
return x;
}
}
由 Walt Fair Jr. 先生在 CodeProject 中编码。