There exists one very good linear interpolation method. It performs linear interpolation requiring at most one multiply per output sample. I found its description in a third edition of Understanding DSP by Lyons. This method involves a special hold buffer. Given a number of samples to be inserted between any two input samples, it produces output points using linear interpolation. Here, I have rewritten this algorithm using Python:
temp1, temp2 = 0, 0
iL = 1.0 / L
for i in x:
hold = [i-temp1] * L
temp1 = i
for j in hold:
temp2 += j
y.append(temp2 *iL)
where x contains input samples, L is a number of points to be inserted, y will contain output samples.
My question is how to implement such algorithm in ANSI C in a most effective way, e.g. is it possible to avoid the second loop?
NOTE: presented Python code is just to understand how this algorithm works.
UPDATE: here is an example how it works in Python:
x=[]
y=[]
hold=[]
num_points=20
points_inbetween = 2
temp1,temp2=0,0
for i in range(num_points):
x.append( sin(i*2.0*pi * 0.1) )
L = points_inbetween
iL = 1.0/L
for i in x:
hold = [i-temp1] * L
temp1 = i
for j in hold:
temp2 += j
y.append(temp2 * iL)
Let’s say x=[…. 10, 20, 30 ….]. Then, if L=1, it will produce [… 10, 15, 20, 25, 30 …]
Interpolation in the sense of “signal sample rate increase”
… or i call it, “upsampling” (wrong term, probably. disclaimer: i have not read Lyons’). I just had to understand what the code does and then re-write it for readability. As given it has couple of problems:
a) it is inefficient – two loops is ok but it does multiplication for every single output item; also it uses intermediary lists(
hold), generates result withappend(small beer)b) it interpolates wrong the first interval; it generates fake data in front of the first element. Say we have multiplier=5 and seq=[20,30] – it will generate [0,4,8,12,16,20,22,24,28,30] instead of [20,22,24,26,28,30].
So here is the algorithm in form of a generator:
Ok and now for some tests:
And here is my translation to C, fit into Kratz’s fn template:
Please note the C snippet is “typed but never compiled or run”, so there might be syntax errors, off-by-1 errors etc. But overall the idea is there.