On Thu, Jun 26, 2008 at 11:18 AM, Mathieu Bouchard matju@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
X'[w]=j*sin(w)
It still has trouble with the high frequencies. So there might be some value in expanding the number of points to include better approximations.
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 :)
Chuck