Trigonometria de ponto fixo para aplicações incorporadas

9

Eu preciso fazer transformações rotacionais (e outras) em um aplicativo incorporado, exigindo as funções sin () cos () e tan (). Eu sei que você pode usar tabelas de consulta, e essa é a única solução que eu poderia encontrar fazendo minha própria pesquisa, mas existe uma boa biblioteca de triggers de ponto fixo por aí?

Estou pensando em usar um córtex M3 para o aplicativo, então quero ficar longe do ponto flutuante o máximo possível para manter os aplicativos compactos.

Prumo
fonte
Dois pensamentos: Uma implementação primitiva tradicional de rotação é o algoritmo CORDIC. Você também pode ver se seu fornecedor agora oferece um Cortex M4 competitivo com o M3 que você estava considerando.
Chris Stratton
4
Por que você não deseja usar tabelas de pesquisa? Isso funciona muito bem para o pecado e porque Fazer pecado e cos por algoritmo vai levar mais tempo. A única vantagem pode ser menos espaço usado na memória do programa, mas isso realmente importa no seu aplicativo?
amigos estão dizendo
@OlinLathrop, quero saber o que os outros descobriram: talvez haja uma maneira eficiente de resolver o problema rapidamente com pouco erro, poupando espaço na memória que não encontrei? Pelo que sei (e posso estar errado), o maior problema para resolver algoritmicamente com as bibliotecas padrão é que toda a matemática é feita em ponto flutuante, e sem uma FPU, tudo deve ser feito numericamente, o que é terrivelmente ineficiente. .. O maior problema com as tabelas de consulta é: quão preciso eu preciso ser? E se esse requisito de precisão mudar, ainda terei memória de programa suficiente?
Bob
Qual é a sua precisão? Uma tabela de pesquisa de tamanho modesto é suficiente para a maioria das necessidades incorporadas de sin / cos. Com 1025 entradas de tabela, você obtém uma resolução de ângulo de 4096. Nesse ponto, a interopulação linear fornece uma boa precisão entre as entradas da tabela. Parece haver muitos mitos incorretos sobre a pesquisa senoidal. Veja minha resposta em electronics.stackexchange.com/a/16516/4512 para obter mais detalhes.
Olin Lathrop
Eu ouço o que você está dizendo e entendo a idéia da tabela de consulta para a função seno, mas se eu sou limitado por código (os projetos sempre preenchem o espaço do código), existe uma maneira mais compacta de lidar com isso? Foi por isso que perguntei: há muitas pessoas talentosas contribuindo e gostaria de saber se encontraram algo melhor.
Bob

Respostas:

6

Uma boa abordagem para fazer trigonometria em aplicativos incorporados é usar aproximações polinomiais para as funções necessárias. O código é compacto, os dados consistem em alguns coeficientes e as únicas operações necessárias são multiplicar e adicionar / subtrair. Muitos sistemas embarcados possuem multiplicadores de hardware, oferecendo bom desempenho.

Dave Tweed
fonte
11
Alguém já lançou uma versão disso em C otimizada para aplicativos incorporados que não usam instruções de ponto flutuante? A alta de erro em ambos os lados da aproximação polinomial se presta à utilização truques para usar diferentes polinômios para diferentes segmentos para reduzir o erro, ou algum outro truque ...
Bob
11
O C genérico não suporta diretamente tipos e operações de dados de ponto fixo não inteiros, portanto, as otimizações para esse tipo de dados tendem a ser bastante específicas da plataforma. Por exemplo, a maioria dos DSPs suporta um tipo de dados fracionários de ponto fixo diretamente em seu hardware. Em C, você acessa isso através de bibliotecas proprietárias.
Dave Tweed
O C genérico está ganhando suporte por meio do tipo de dados _Fract, mas a maioria das implementações de microcontroladores tem bibliotecas específicas do fornecedor. Eu uso libmathq15 para todas as minhas necessidades de ponto fixo. Fez o trabalho até agora.
slightlynybbled
_Fracté um pedaço de porcaria IMHO; Eu odeio o fato de ter sido "padronizado" pelo comitê C. Obriga você a usar o Q15 ou Q31 para tudo, o que não faz sentido em muitas situações, e deixa você sem recursos para ajudá-lo.
Jason S
3

Você se opõe a usar as bibliotecas Cortex de ponto fixo para isso?

q31_t arm_sin_q31 (q31_t x)
Aproximação rápida à função seno trigonométrica para dados Q31.

de:

CMSIS-DSP: coleção de bibliotecas DSP com mais de 60 funções para vários tipos de dados: ponto de correção (q7 fracionário, q15, q31) e ponto flutuante de precisão única (32 bits). A biblioteca está disponível para Cortex-M0, Cortex-M3 e Cortex-M4.

Ele usa uma tabela de pesquisa com interpolação quadrática, mas é bem rápida. Você pode adaptá-lo à interpolação linear para obter velocidade mais rápida, mas com mais erros.

Observe também que mesmo o Cortex M4 não possui necessariamente FPU. Eu os vi chamados "M4F", se o fizerem.

endólito
fonte