Livros / recursos para implementar várias funções matemáticas na aritmética de ponto fixo para fins de DSP

8

Estou procurando livros ou recursos que cubram o seguinte em detalhes:

  • implementar funções matemáticas (por exemplo, logaritmo, exponencial, seno, cosseno, inverso) na aritmética de ponto fixo para fins de DSP.

  • técnicas como o uso de tabelas de pesquisa, séries de Taylor etc.

Estou bastante familiarizado com a programação C e estou mais interessado nos algoritmos sobre como implementar várias funções matemáticas de maneira eficiente.

RuD
fonte
1
Este é apenas um truque, mas é muito útil. Trata-se de calcular a função atan2, ou seja, calcular o argumento de um número complexo a partir de suas partes reais e imaginárias.
Matt L.
1
posso oferecer algumas séries otimizadas de poder de ordem finita que desenvolvi há mais de uma década. além do cliente inicial, não recebi nenhum dinheiro por isso desde então, acho que posso torná-lo em domínio público. originalmente foi desenvolvido para ponto flutuante em um contexto em que o cliente não podia incluir o stdlib na compilação. e a avaliação não é nem um pouco perfeita. ou seja, há erro, mas muito pequeno e otimizado para a função específica que está sendo avaliada. Deixe-me encontrar esse arquivo, vou extrair os coeficientes e postar os da série.
Robert Bristow-johnson
@ robertbristow-johnson Estou ansioso para fazer uso da série e ver como ela vai! obrigado!
RuD
Ruchir, eu postei as séries abaixo. há coisas de bom senso que você precisa fazer para estender o alcance. gostar
2x=2k×2xk
E se kxk+1. coisa semelhante paralog2()e os sinusoides periódicos. para exp e log, isso exigirá uma mudança aritmética de bits do que sai (para exp) ou do que entra (para log). Eu acho que você pode descobrir isso. e, é claro, para exp e log de diferentes bases (comoe), você apenas dimensiona com a constante apropriada o que entra em 2x e o que vem log2(x).
22615 Robert Bristow-

Respostas:

9

a forma polinomial geral é:

f(u)=n=0N an un=a0+(a1+(a2+(a3+...(aN2+(aN1+aNu)u)u ...)u)u)u

a última forma está usando o método de Horner , que é altamente recomendado, especialmente se você estiver fazendo isso no ponto flutuante de precisão única.

depois, para algumas funções específicas:

raiz quadrada:

f(x1)x1x2N=4a0=1.0a1=0.49959804148061a2=0.12047308243453a3=0.04585425015501a4=0.01076564682800

E se 2x4, use o acima para avaliar x2 e multiplique esse resultado com 2 para obter x. como comlog2(x), aplique força de 2 scaling para dimensionar o argumento para o intervalo necessário.

logaritmo de base 2:

xf(x1)log2(x)1x2N=5a0=1.44254494359510a1=0.7181452567504a2=0.45754919692582a3=0.27790534462866a4=0.121797910687826a5=0.02584144982967

exponencial de base 2:

f(x)2x0x1N=4a0=1.0a1=0.69303212081966a2=0.24137976293709a3=0.05203236900844a4=0.01355574723481

seno:

xf(x2)sin(π2x)1x1N=4a0=1.57079632679490a1=0.64596406188166a2=0.07969158490912a3=0.00467687997706a4=0.00015303015470

cosseno (use seno):

cos(πx)=12sin2(π2x)

tangente:

tan(x)=sin(x)cos(x)

tangente inversa:

xf(x2)arctan(x)1x1N=4a0=1.0a1=0.33288950512027a2=0.08467922817644a3=0.03252232640125a4=0.00749305860992

arctan(x)=π2arctan(1x)1x

arctan(x)=π2arctan(1x)x1

seno inverso:

arcsin(x)=arctan(x1x2)

cosseno inverso:

arccos(x)=π2arcsin(x)=π2arctan(x1x2)
Robert Bristow-Johnson
fonte
Isso parece bastante útil! Muito obrigado por compartilhar isso. Mas a primeira entrada de referência ainda man soxé a melhor;)
jojek
não sei sox. o que o manual diz sobre isso?
22815 Robert Robinson-Johnson
2
Simplesmente [1] R. Bristow-Johnson, Cookbook formulae for audio EQ biquad filter coefficients, http://musicdsp.org/files/Audio-EQ-Cookbook.txt:)
jojek
BTW, a série minimiza o erro máximo ponderado . o erro é ponderado de maneira que faça sentido para a função. erro máximo uniforme pararegistro2(). erro máximo proporcional parax e 2x. algo semelhante ao proporcional parapecado() relacionado aos coeficientes de computação dos filtros ressonantes, para que o erro máximo de registro(f0 0)é minimizado. não lembro qual critério eu useiarctan(). e, por alguma razão, não consigo encontrar meu arquivo que diz quais são os erros máximos, considerando o intervalo dex. alguém com MATLAB pode descobrir.
Robert Bristow-Johnson
1
você deve plotar o erro com seu python, se puder. também np.max(np.abs(sqrt_1px(xp)-np.sqrt(1+xp)))pode ser o np.max(np.abs((sqrt_1px(xp)-np.sqrt(1+xp))/np.sqrt(1+xp))) mesmo, pois 2**x o peso do erro é diferente e terei que descobrir como fiz isso. Eu tenho scripts antigos do MATLAB que costumavam funcionar no Octave, mas agora eu não consigo nem o Octave plotar no meu antigo laptop G4 Mac.
Robert Bristow-Johnson
2

Embora não seja específico ao ponto fixo, eu recomendo o livro "Math Toolkit for Real-Time Programming" de Jack Crenshaw. Ele vem com um CD com o código fonte.

David
fonte
2

A TI possui bibliotecas IQMath para todos os seus microcontroladores de ponto fixo. Eu os achei uma mina de ouro de funções de matemática e DSP de ponto fixo, não necessariamente limitadas a chips de TI.

MSP430 C28X

Otto Hunt
fonte
Estou mais interessado nos algoritmos e não apenas a implementação das funções
Rud
1

A aproximação de Chebyshev pode ajudar a calcular coeficientes polinomiais próximos do ideal para aproximar uma função em um intervalo finito. Você executa a rotina de aproximação em um PC para obter um conjunto específico de coeficientes polinomiais, que podem ser aplicados em qualquer plataforma que você desejar (por exemplo, incorporado / DSP). A impressão fina é mais ou menos a seguinte:

  • Isso funciona apenas para funções de uma variável; se você tem alguma funçãoz=f(x,y) então a aproximação de Chebyshev não vai ajudá-lo.
  • A função que você está aproximando deve ser "parecida com um polinômio". Cantos, curvas acentuadas e muitas manobras requerem polinômios de ordem superior para atingir um determinado nível de precisão.
  • Manter a ordem polinomial baixa é importante - acima da quinta ou mais, você pode começar a ver erros numéricos.
  • A aproximação de Chebyshev usa os polinômios de Chebyshev avaliados sobre o domínio [-1,1]; portanto, se o intervalo de entrada para sua função for significativamente diferente, talvez seja necessário dimensionar / compensar a entrada adequadamente antes de determinar os coeficientes e antes de aplicá-los. Por exemplo, se eu me preocupo com uma função no intervalo de entradax[0 0,20] então eu posso definir você=(x×0,1)-1 de modo a você varia de -1 a +1 e posso avaliar um polinômio em vocêpara calcular o resultado necessário. Sem esse dimensionamento, você pode encontrar erros numéricos mais facilmente - ou declarado de outra maneira. Para a mesma precisão, você pode precisar de comprimentos de bits mais altos para calcular valores intermediários, e isso geralmente é indesejável.
Jason S
fonte
Jason, não usei polinômios Tchebyshev, mas usei um erro ponderado de MinMax (às vezes chamado de "eu. norma" em caso de erro), que é, eu pensei, o mesmo que Tchebyshev aproximação do método que usei foi Remez algoritmo de troca.
Robert Bristow-johnson
Remez é superior (embora mais complexo) que Chebyshev. Chebyshev apenas aproxima a condição minimax, mas geralmente é boa o suficiente.
Jason S #