title: C# Linear Interpolation
body: <p>I'm having issues interpolating a data file, which i have converted from .csv into an X array and Y array where X[0] corresponds to point Y[0] for example.</p>
  
  <p>I need to interpolate between the values to give me a smooth file at the end.
  I am using a Picoscope to output the function which means each line is equally spaced in time, so only using Y values, which is why I'm trying to do this in a strange way when you see my code.</p>
  
  <p>The kind of values it has to deal with are:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>So where 2 Y values next to each other are the same its a straight line between them but when they vary like from X = 10 on wards it becomes a sine wave in this example.</p>
  
  <p>I have been looking at the equations for interpolation etc and other posts on here but i haven't done that sort of maths for years and sadly i can't figure it out any more, because there's 2 unknowns and i can't think how to program that into c#.</p>
  
  <p>What i have is:</p>
  
  <pre><code>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 &lt; sizeoffile-1 &amp;&amp; d &lt; 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]) &gt; 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 &lt; times + 1 &amp;&amp; d &lt; 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]) &gt; 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]) &gt; 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 &gt; 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 &lt; points + 1 &amp;&amp; d &lt; 8192);
              q = 0;
          }
          else if (points != 0 &amp;&amp; points &gt; 0)
          {
              newy[d] = Y[a];//load first point
              d++;
          }
      }
      a++;
  }
  </code></pre>
  
  <p>and this creates a close waveform but it is still very steppy.</p>
  
  <p>So can anyone see why this isn't very accurate?
  How to improve its accuracy?
  Or a different way of doing this using arrays?</p>
  
  <p>Thanks for looking :)</p>