[PD] better tabread4~

Charles Henry czhenry at gmail.com
Fri Jun 27 07:39:18 CEST 2008

On Thu, Jun 26, 2008 at 11:18 AM, Mathieu Bouchard <matju at artengine.ca> wrote:
> I fucked up here. To get a C2 curve you may need to solve an equation system
> covering the whole table (!). Anyhow, a C1 system is fine enough for most
> uses, and it would be already much better than pd's.
> The thing is that you can only match the 2nd derivatives if you let the 1st
> derivatives just match but freely float. Then there will be one curve going
> through all points of the whole table supposing that the 2nd derivative is
> zero at the beginning and end of the table. Clearly this is a wholly
> different game because you need to compute a 2nd table to remember what the
> 1st derivatives are supposed to be and then you can't change anything in the
> 1st table without recomputing the 2nd table from scratch, or something.

I get what you're saying now.  I had to read it a couple times through
to see :)  You're referring to piecewise cubic polynomials, right?  We
would wind up with an overdetermined system of equations if we didn't
float the 1st *and* 2nd derivatives, which would come out as a linear
algebra problem of the size of the table.

but I think it gets even worse.  There could be a non-zero null space
to the problem.  There are infinite solutions to interpolate a table
full of zeros, with these conditions.  What a mess :)

>> or we could set x[0],x[1] and x'[0]=(x[1]-x[-1])/2 and x'[1]=(x[2]-x[0])/2
>> again, 4 constraints, cubic polynomial, etc...
> Seems reasonable. What I want has to have constraints on x'[0] and x'[1].
> Those would be a possibility. The problem is that it uses a gap of 2 samples
> instead of one, so it uses a "blurry" derivative, but the alternative is to
> have to pick between forward-difference and backwards-difference. The
> "blurry" derivative happens to be the average of the 1-sample
> forward-difference and backward-difference.

By expanding it out to more points, we could use a more accurate
calculation of the derivative.  There's always a frequency dependent
effect on the accuracy of 1st derivative approximations.

For example, backwards difference:
x' ~= x[n] - x[n-1]

X'[z] = X[z] ( 1 - z^-1)

Which has spectrum,  X'[w]=1-e^(-j*w)
|X'[w]|^2=(1-cos(w))^2+sin(w)^2,  phase (X'[w])=arctan(  sin(w)/(1-cos(w))  )

our ideal system has X'[w]=j*w

Central divided difference
x'  ~= (x[n+1] - x[n-1])/2

X'[z] = X[z] ( z  - z^-1)/2

Which has spectrum,  X'[w]=(e^(j*w)-e^(-j*w))/2


It still has trouble with the high frequencies.  So there might be
some value in expanding the number of points to include better

>> and x''[0]=x[1]-2*x[0]+x[-1] and x''[1]=x[2]-2*x[1]+x[0]
>> 6 constraints, 5th degree polynomial
> I think that the replacement for tabread4~ should be another cubic, so that
> it takes almost the same time to compute it. What I said about C2 was based
> on a mistaken reading of webpages trying to refresh myself on splines. I
> should've been more careful.

Yeah, a cubic polynomial makes the most sense for small changes.  I
haven't ever heard of people interpolating 4 points with a 5th degree
polynomial.... but I think I could make it work....

> The "blurry" derivative above seems to be fine... I'd have to try it, but I
> should be working on other things now. I suppose that Cyrille already has
> everything figured out anyway. I just feel like talking about math
> sometimes... ;)

It's all good by me :)


More information about the Pd-list mailing list