a good place to find different kind of audio interpolator : http://www.student.oulu.fi/~oniemita/dsp/deip.pdf
cyrille
Matt Barber a écrit :
For polynomial interpolation using four points, if the above is right there are 5 ways to do it, and they are ordered first by degree of polynomial, then from fewest to greatest number of derivatives matched. I tend to agree with other posters who suggested that this kind of organization might best lend itself to one object with interpolation type specified by an argument or message.
The argument could follow one of a couple standards: 1) a numeral or letter in order, as above, or 2) a descriptive argument. The descriptive argument could work something like this:
[tabread4~ array] -- default to cubic Lagrange [tabread4~ array 3] -- explicit cubic Lagrange [tabread4~ array 3d] -- cubic, C1 [tabread4~ array 5dd] -- fifth-degree, C2
etc.
[tabread4~ array 3dd] -- cubic, C2 -- doesn't exist, object doesn't create -- might post a list of available options.
The d or dd could be replaced with whatever, as long as it was descriptive of the level of continuity.
After further thought, there are some more problems with this kind of naming scheme. While the above would be exhaustive for the four-point interpolations, it would not be for a 6-point one. With 6-point interpolations you'd have the opportunity to match more than two first and second derivatives, so there are two ways, for example, to make a 9th-degree C2 curve -- one that fixes all six points, two first derivatives and two second derivatives, and one that fixes four points, four first derivatives, and two second derivatives. An alternate notation would be something like:
[tabread4~ arrayname 4] -- fix all four points (default). [tabread4~ arrayname 2 2] -- fix points at x=0 and 1, and first derivatives at x=0 and 1 [tabread4~ arrayname 4 2 2] fix points at -1 0 1 and 2, f' at 0 and 1, and f'' at 0 and 1
[tabread6~ arrayname 6 4 2 2] fix all 6 points, all 4 first derivatives, and two second and third derivatives (13th-degree polynomial).
Obviously this starts to get ridiculous. In fact if we wanted an exhaustive set of 6-point interpolations, I count 13 of them, assuming you don't ever want to constrain more first derivatives than points, or more second derivatives than first, etc., and assuming you only constrain up to the 2nd derivative. If you want to start constraining 3rd and 4th derivatives (possible with 6 points but not with 4), then it goes up to 25 different interpolations, and up to a 17th-degree polynomial (fixing 6 points, 4 each of the 1st and 2nd derivatives, and 2 each of the 3rd and 4th... yikes!). That would allow for the following: 1 C0 option, 5 C1 options, 7 C2 options, 6 C3 options, and 6 C4 options.
It also starts to put the onus on the user to figure out what arguments to use, and requires that they know a little about the math behind it, which probably shouldn't be necessary. Maybe several classes could be made for the library -- for 4-point you could retain [tabread4~] as the C0 option, then have a [tabread4c1~] option for the continuous first derivative with an argument for the two different ways of doing it (there's a cubic one and a 5th-degree one). Then [tabread4c2~] for the 2 C2 options. This might help keep the classes from being too bloated with options, and would keep things organized by differing levels of continuity, but it means that more classes would have to be maintained...
Not knowing enough of the math to test out the responses, I just don't know which direction to pursue, or whether an exhaustive set of options would make this more of an engineering curiosity than a library for high-quality audio. My intuition is that there are diminishing returns once you start getting higher than 5th- or 7th-degree polynomials, but I also generally hate arbitrary constraints.
Any ideas??
Thanks,
Matt
Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list