Trigonometría de punto fijo para aplicaciones integradas

9

Necesito hacer transformaciones rotacionales (y otras) en una aplicación incrustada, que requiere las funciones sin () cos () y tan (). Sé que puede usar tablas de búsqueda, y esa es la única solución que podría encontrar haciendo mi propia investigación, pero ¿existe una buena biblioteca de trigonometría fija?

Estoy pensando en usar un cortex M3 para la aplicación, así que quiero mantenerme alejado del punto flotante tanto como sea posible para mantener las aplicaciones rápidas.

Beto
fuente
Dos pensamientos: una implementación primitiva tradicional de rotación es el algoritmo CORDIC. También puede ver si su proveedor ahora ofrece un Cortex M4 competitivo con el M3 que estaba considerando.
Chris Stratton
44
¿Por qué no quieres usar tablas de búsqueda? Eso funciona muy bien para el pecado y cos. Hacer pecado y cos algorítmicamente llevará más tiempo. La única ventaja podría ser menos espacio de memoria de programa utilizado, pero ¿eso realmente importa en su aplicación?
Olin Lathrop
@OlinLathrop, quiero saber lo que otros han encontrado: ¿quizás exista alguna forma eficiente de resolver el problema rápidamente con un pequeño error y al mismo tiempo ahorrar espacio de memoria que no he encontrado? Por lo que sé (y podría estar equivocado), el mayor problema para resolver algorítmicamente con las bibliotecas estándar es que todas las matemáticas se realizan en coma flotante, y sin una FPU, todo tiene que hacerse numéricamente, lo que es terriblemente ineficiente. .. El mayor problema con las tablas de búsqueda es: ¿qué tan preciso debo ser? Y si esa exigencia de precisión cambia, ¿tendré suficiente memoria de programa?
Bob
¿Qué tan precisa necesitas? Una tabla de búsqueda de tamaño modesto es suficiente para la mayoría de las necesidades integradas de sin / cos. Con 1025 entradas de tabla, obtienes una resolución de ángulo de 4096. En ese punto, la interoplancia lineal le brinda una buena precisión entre las entradas de la tabla. Parece que hay muchos mitos incorrectos sobre la búsqueda sinusoidal. Consulte mi respuesta en electronics.stackexchange.com/a/16516/4512 para obtener más detalles.
Olin Lathrop
Escucho lo que está diciendo y entiendo la idea de la tabla de búsqueda para la función seno, pero si tengo un código limitado (los proyectos siempre llenan el espacio de código), ¿hay una forma más compacta de manejar esto? Por eso pregunté: hay muchas personas con talento contribuyendo, y me gustaría saber si han encontrado algo mejor.
Bob

Respuestas:

6

Un buen enfoque para hacer trigonometría en aplicaciones integradas es utilizar aproximaciones polinómicas a las funciones que necesita. El código es compacto, los datos consisten en algunos coeficientes y las únicas operaciones requeridas son multiplicar y sumar / restar. Muchos sistemas integrados tienen multiplicadores de hardware, lo que brinda un buen rendimiento.

Dave Tweed
fuente
1
¿Alguien ha lanzado una versión de esto en C optimizada para aplicaciones integradas que no utilizan instrucciones de coma flotante? El alto error a cada lado de la aproximación polinómica se presta para usar trucos para usar diferentes polinomios para diferentes segmentos para reducir el error, o algún otro truco ...
Bob
1
Generic C no admite directamente operaciones y tipos de datos de punto fijo no enteros, por lo que las optimizaciones para este tipo de datos tienden a ser bastante específicas de la plataforma. Por ejemplo, la mayoría de los DSP admiten un tipo de datos fraccionales de punto fijo directamente en su hardware. Desde C, accede a esto a través de bibliotecas propietarias.
Dave Tweed
Generic C está ganando soporte a través del tipo de datos _Fract, pero la mayoría de las implementaciones de microcontroladores tienen bibliotecas específicas del proveedor. Uso libmathq15 para todas mis necesidades de punto fijo. Ha hecho el trabajo hasta ahora.
ligeramente
_Fractes un pedazo de basura en mi humilde opinión; Odio el hecho de que fue "estandarizado" por el comité C. Te obliga a usar Q15 o Q31 para todo, lo que no tiene sentido en muchas situaciones, y te deja sin ayuda para esas situaciones.
Jason S
3

¿Se opone a usar las bibliotecas de punto fijo Cortex para esto?

q31_t arm_sin_q31 (q31_t x)
Aproximación rápida a la función seno trigonométrica para datos Q31.

desde:

CMSIS-DSP: Colección de bibliotecas DSP con más de 60 funciones para varios tipos de datos: punto fijo (fraccional q7, q15, q31) y punto flotante de precisión simple (32 bits). La biblioteca está disponible para Cortex-M0, Cortex-M3 y Cortex-M4.

Utiliza una tabla de búsqueda con interpolación cuadrática, pero es bastante rápida. Puede adaptarlo a la interpolación lineal para una velocidad más rápida pero con más errores.

También tenga en cuenta que incluso Cortex M4 no necesariamente tiene FPU. Los he visto llamados "M4F" si lo hacen.

endolito
fuente