C # Линейная интерполяция

У меня возникли проблемы с интерполяцией файла данных, который я преобразовал из .csv в массив X и массив Y, где X [0] соответствует точке Y [0], например.

Мне нужно интерполировать между значениями, чтобы получить плавный файл в конце. Я использую Picoscope для вывода функции, которая означает, что каждая строка равномерно распределена по времени, поэтому я использую только значения Y, поэтому яЯ пытаюсь сделать это странным образом, когда вы видите мой код.

Вид ценностей, с которыми он имеет дело:

X     Y
0     0
2.5   0
2.5   12000
7.5   12000
7.5   3000
10    3000
10    6000
11    6625.254
12    7095.154

Таким образом, если значения 2 Y рядом друг с другом одинаковы, это прямая линия между ними, но когда они изменяются, например, от X = 10 на участках, это становится синусоидальной волной в этом примере.

Я смотрел на уравнения для интерполяции и т. Д. И другие посты здесь, но я не имеюя делал такие математики годами, и, к сожалению, я не могуне могу понять это больше, потому что тамс 2 неизвестных и я могуне думаю, как запрограммировать это в C #.

Что у меня есть:

int a = 0, d = 0, q = 0;
bool up = false;
double times = 0, change = 0, points = 0, pointchange = 0; 
double[] newy = new double[8192];
while (a < sizeoffile-1 && d < 8192)
{
    Console.Write("...");
    if (Y[a] == Y[a+1])//if the 2 values are the same add correct number of lines in to make it last the correct time
    {
        times = (X[a] - X[a + 1]);//number of repetitions
        if ((X[a + 1] - X[a]) > times)//if that was a negative number try the other way around
            times = (X[a + 1] - X[a]);//number of repetitions 
        do
        {
            newy[d] = Y[a];//add the values to the newy array which replaces y later on in the program
            d++;//increment newy position
            q++;//reduce number of reps in this loop
        }
        while (q < times + 1 && d < 8192);
        q = 0;//reset reps
    }
    else if (Y[a] != Y[a + 1])//if the 2 values are not the same interpolate between them
    {
        change = (Y[a] - Y[a + 1]);//work out difference between the values
        up = true;//the waveform is increasing
        if ((Y[a + 1] - Y[a]) > change)//if that number was a negative try the other way around
        {
            change = (Y[a + 1] - Y[a]);//work out difference bwteen values
            up = false;//the waveform is decreasing
        }
        points = (X[a] - X[a + 1]);//work out amount of time between given points
        if ((X[a + 1] - X[a]) > points)//if that was a negative try other way around
            points = (X[a + 1] - X[a]);///work out amount of time between given points
        pointchange = (change / points);//calculate the amount per point in time the value changes by
        if (points > 1)//any lower and the values cause errors
        {
            newy[d] = Y[a];//load first point
            d++;
            do
            {
                if (up == true)//
                    newy[d] = ((newy[d - 1]) + pointchange);
                else if (up == false)
                    newy[d] = ((newy[d - 1]) - pointchange);
                d++;
                q++;
            }
            while (q < points + 1 && d < 8192);
            q = 0;
        }
        else if (points != 0 && points > 0)
        {
            newy[d] = Y[a];//load first point
            d++;
        }
    }
    a++;
}

и это создает близкий сигнал, но он все еще очень крут.

Так может кто-нибудь понять, почему это не такТочнее? Как улучшить его точность? Или другой способ сделать это с помощью массивов?

Спасибо за внимание :)