1

Я получаю x,y,z значения от гироскопа. Каждой переменной присваивается 10 значений в секунду. Через 3 секунды у меня есть;Преобразование Лапласа и получение частого значения для гироскопа

x=[30values] 
y=[30values] 
z=[30values] 

Некоторые из значений слишком отличаются от других причин шума. С преобразованием лапласа мне нужно получить наиболее частое значение из моего массива.

Blockquote

мне нужно фильтровать массив с преобразования Лапласа уравнение. Мне нужно построить уравнение в C#. Как реализовать массив с помощью уравнения?

+0

Это похоже на проблему Control/DSP ... «получить наиболее частое значение из моего массива», возможно, вы можете прояснить, что это означает, предоставив образец ввода - ожидаемую пару. Таким образом, легче понять проблему или предложить решение. Например, каковы значения для x = [30 значений] и каков ожидаемый результат – Ian

+0

Например: x = [301,302,306,301,305, _512_, 308,301,302, _616_, 306 ...] Мне нужно использовать преобразование Лапласа для получения частотные значения координаты x в случае понимания значений 301-308 являются наиболее точными числами. Но как я могу реализовать массив с помощью уравнения? –

+0

О, о, не здесь ... Вы можете обновить вопрос. И все может стать намного проще, если вы не требуете, чтобы фильтр был Лапласом, но любой фильтр (например, медианный/средний). – Ian

ответ

0

Поскольку этот вид фильтра (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; 
    } 
} 

кодируются г Уолта Fair младший в CodeProject.

+0

Спасибо за ваши ответы. Я посмотрю на это. –

+0

Добро пожаловать. Идея здесь заключается не в создании чего-то, чего вы не могли себе позволить себе ... Поскольку в очень специализированной области, такой как 'Control/DSP Engineering', легко ошибиться в кодировании, потому что мы не знакомы с языком или с концепцией «Инжиниринг». Таким образом, если вы не уверены, или нет других, кто делает такую ​​вещь, я бы предпочел лучше искать лучшее решение за пределами первой ... – Ian

+0

Хорошо. Большое спасибо за ваши ответы и рекомендации снова! –

Смежные вопросы