Trigonometria a punto fisso per applicazioni incorporate


9

Ho bisogno di fare trasformazioni rotazionali (e altre) in un'applicazione incorporata, che richiede le funzioni sin () cos () e tan (). So che puoi usare le tabelle di ricerca, e questa è l'unica soluzione che ho trovato facendo le mie ricerche, ma c'è una buona libreria di trigmi a virgola fissa là fuori?

Sto pensando di utilizzare una corteccia M3 per l'applicazione, quindi voglio stare il più possibile lontano da virgola mobile per mantenere le applicazioni zippy.


Due pensieri: una tradizionale implementazione primitiva della rotazione è l'algoritmo CORDIC. Potresti anche vedere se il tuo fornitore offre ora una Cortex M4 competitiva con la M3 che stavi prendendo in considerazione.
Chris Stratton,

4
Perché non vuoi usare le tabelle di ricerca? Funziona molto bene per il peccato e il cos. Fare peccati e cos in modo algoritmico richiederà più tempo. L'unico vantaggio potrebbe essere la riduzione dello spazio di memoria del programma utilizzato, ma è davvero importante nella tua applicazione?
Olin Lathrop,

@OlinLathrop, voglio sapere cosa hanno trovato gli altri: forse esiste un modo efficace per risolvere rapidamente il problema con un piccolo errore e risparmiare spazio di memoria che non ho trovato? Da quello che so (e potrei sbagliarmi), il problema più grande per la risoluzione algoritmica con le librerie standard è che tutta la matematica è fatta in virgola mobile e senza una FPU che deve essere fatta numericamente, il che è terribilmente inefficiente. .. Il problema maggiore con le tabelle di ricerca è: quanto devo essere preciso? E se tale precisione dovesse cambiare, avrò ancora abbastanza memoria del programma?
Bob,

Quanto preciso hai bisogno? Le tabelle di ricerca di dimensioni modeste sono abbastanza sufficienti per la maggior parte delle esigenze sin / cos incorporate. Con 1025 voci di tabella, ottieni una risoluzione dell'angolo di 4096. A quel punto, l'interoperabilità lineare ti dà una buona precisione tra le voci della tabella. Sembra che ci siano molti miti errati sulla ricerca sinusoidale. Vedi la mia risposta su electronics.stackexchange.com/a/16516/4512 per maggiori dettagli.
Olin Lathrop,

Ho sentito quello che stai dicendo e capisco l'idea della tabella di ricerca per la funzione seno, ma se sono limitato al codice (i progetti riempiono sempre lo spazio del codice), c'è un modo più compatto di gestirlo? Ecco perché ho chiesto: ci sono molte persone di talento là fuori che contribuiscono e mi piacerebbe sapere se hanno trovato qualcosa di meglio.
Bob,

Risposte:


6

Un buon approccio per eseguire la trigonometria in applicazioni incorporate consiste nell'utilizzare approssimazioni polinomiali per le funzioni necessarie. Il codice è compatto, i dati sono costituiti da alcuni coefficienti e le uniche operazioni richieste sono moltiplicare e aggiungere / sottrarre. Molti sistemi embedded hanno moltiplicatori hardware, che offrono buone prestazioni.


1
Qualcuno ha rilasciato una versione di questo in C ottimizzata per le applicazioni integrate che non utilizzano le istruzioni in virgola mobile? L'errore elevato ai lati dell'approssimazione polinomiale si presta all'utilizzo di trucchi per utilizzare diversi polinomi per segmenti diversi per ridurre l'errore, o qualche altro trucco ...
Bob

1
Il C generico non supporta direttamente tipi e operazioni di dati a punto fisso non interi, quindi le ottimizzazioni per questo tipo di dati tendono ad essere abbastanza specifiche per la piattaforma. Ad esempio, la maggior parte dei DSP supporta un tipo di dati frazionario a virgola fissa direttamente nel proprio hardware. Da C, accedi a questo tramite librerie proprietarie.
Dave Tweed,


Il C generico sta guadagnando supporto attraverso il tipo di dati _Fract, ma la maggior parte delle implementazioni di microcontrollori ha librerie specifiche del fornitore. Uso libmathq15 per tutte le mie esigenze in virgola fissa. Finora ha fatto il lavoro.
leggermente

_Fractè un pezzo di merda IMHO; Odio il fatto che sia stato "standardizzato" dal comitato C. Ti costringe a usare Q15 o Q31 per tutto, il che non ha senso in molte situazioni e ti lascia bloccato senza aiuto per quelle situazioni.
Jason S,

3

Sei contrario all'utilizzo delle librerie Cortex a virgola fissa per questo?

q31_t arm_sin_q31 (q31_t x)
Approssimazione rapida della funzione seno trigonometrica per i dati Q31.

a partire dal:

CMSIS-DSP: raccolta librerie DSP con oltre 60 funzioni per vari tipi di dati: punto fisso (frazionario q7, q15, q31) e virgola mobile a precisione singola (32 bit). La libreria è disponibile per Cortex-M0, Cortex-M3 e Cortex-M4.

Utilizza una tabella di ricerca con interpolazione quadratica, ma è piuttosto veloce. È possibile adattarlo all'interpolazione lineare per una maggiore velocità ma maggiore errore.

Si noti inoltre che anche Cortex M4 non ha necessariamente FPU. Li ho visti chiamati "M4F" se lo fanno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.