El problema se podría resolver con una tabla de 16 posiciones entre 0 y 90 grados.
Como la tabla tiene 16 posiciones, sería fácil encontrar la posición de un elemento tomando los cuatro bits más significativos del ángulo (con un ángulo entre 0 y 4096 pulsos de encoder para toda la circunferencia)
Ángulo del encoder:
0 pulsos = 0 grados
1023 pulsos = 90 grados.
La interpolación se calcula así:
X=ángulo (pulsos) Y=seno(ángulo)
0 0.0000
63 0.0966
127 0.1938
...
seno(x) = Y0 + (Y1-Y0) * (x - X0) / (X1-X0)
donde (X1-X0) siempre vale 64 y se puede sustituir por una multiplicación (más rápida):
1 / (X1 - X0) = 1 / 64 = 0.0156
seno(x) = Y0 + (Y1-Y0) * (x - X0) * 0.0156
Se resuelve todo con una búsqueda en tabla de datos (inmediata), tres sumas y dos multiplicaciones.
Otra simplificación a la interpolación:
La multiplicación y la suma (Y1-Y0) * 0.0156 se podrían añadir a la tabla y con eso todavía se reducen más las operaciones:
X=Angulo (pulsos) Y=seno (Y1-Y0) * 0.0156
0 0.0000 0,001509
63 0.0966 0,001519
127 0.1938 0,001489
seno(x) = Y0 + (x - X0) * [(Y1-Y0) * 0.0156]
seno(95) = 0.0966 + (95 - 63) * 0.001519 = 0.14521
Resultado real = seno(95*90/1023) = 0.14535
Error = 0.00014
Todo resuelto con una búsqueda, una multiplicación y dos sumas
Ahora que lo he calculado creo que esta sería la respuesta más eficiente. De todas formas hay otra respuesta válida que es la que realmente preguntaba.
Saludos.