Libros / recursos para implementar diversas funciones matemáticas en aritmética de punto fijo para fines DSP

8

Estoy buscando libros o recursos que cubran lo siguiente en detalle:

  • implementar funciones matemáticas (p. ej., logaritmo, exponencial, seno, coseno, inverso) en aritmética de punto fijo para fines de DSP.

  • técnicas como el uso de tablas de búsqueda, series de Taylor, etc.

Estoy bastante familiarizado con la programación en C y estoy más interesado en los algoritmos sobre cómo implementar diversas funciones matemáticas de manera eficiente.

RuD
fuente
1
Este es solo un truco, pero es muy útil. Se trata de calcular la función atan2, es decir, calcular el argumento de un número complejo a partir de sus partes reales e imaginarias.
Matt L.
1
Puedo darle algunas series optimizadas de potencia de orden finito que desarrollé hace más de una década. aparte del cliente inicial, no he recibido dinero desde entonces, así que creo que también podría hacerlo de dominio público. originalmente se desarrolló para coma flotante en un contexto en el que el cliente no podía incluir el stdlib en la compilación. y la evaluación no es perfecta. es decir, hay un error, pero muy pequeño y optimizado para la función particular que se está evaluando. déjame encontrar ese archivo, sacaré los coeficientes y publicaré las series.
robert bristow-johnson
@ robertbristow-johnson, ¡espero hacer uso de la serie y ver cómo va! ¡Gracias!
RuD
Ruchir, publiqué la serie a continuación. Hay cosas de sentido común que debe hacer para ampliar el rango. me gusta
2x=2k×2xk
Si kxk+1. algo similar paralog2()y los sinusoides periódicos. para exp y log, esto requerirá un desplazamiento de bits aritméticos de lo que sale (para exp) o lo que entra (para log). Creo que puedes averiguarlo. y, por supuesto, para exp y log de diferentes bases (comoe), simplemente escala con la constante apropiada lo que entra 2x y lo que sale de log2(x).
robert bristow-johnson

Respuestas:

9

La forma polinómica general es:

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

la última forma está utilizando el método de Horner , que es muy recomendable, especialmente si lo está haciendo en coma flotante de precisión simple.

luego para algunas funciones específicas:

raíz cuadrada:

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

Si 2x4, use lo anterior para evaluar x2 y multiplica ese resultado con 2 Llegar x. Al igual que conlog2(x), aplicar el poder de 2 escalar para escalar el argumento al rango necesario.

logaritmo de base 2:

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

base 2 exponencial:

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

coseno (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)

coseno inverso:

arccos(x)=π2arcsin(x)=π2arctan(x1x2)
robert bristow-johnson
fuente
Eso parece bastante útil! Muchas gracias por compartir eso. Pero aún así, la primera entrada de referencia man soxes la mejor;)
jojek
No sé sox. ¿Qué dice el manual al respecto?
robert bristow-johnson
2
Simplemente [1] R. Bristow-Johnson, Cookbook formulae for audio EQ biquad filter coefficients, http://musicdsp.org/files/Audio-EQ-Cookbook.txt:)
jojek
Por cierto, la serie minimiza el error ponderado máximo . El error se pondera de tal manera que tenga sentido para la función. error máximo uniforme paralog2(). error máximo proporcional parax y 2x. algo similar a proporcional parasin() que tiene que ver con coeficientes de cálculo para filtros resonantes para que el error máximo de log(f0)se minimiza no puedo recordar para qué criterio utilicéarctan(). y por alguna razón no puedo encontrar mi archivo que me dice cuáles son los errores máximos, dado el rango dex. alguien con MATLAB puede averiguarlo.
robert bristow-johnson
1
deberías trazar el error con tu python, si puedes. También np.max(np.abs(sqrt_1px(xp)-np.sqrt(1+xp)))podría ser el np.max(np.abs((sqrt_1px(xp)-np.sqrt(1+xp))/np.sqrt(1+xp))) mismo, ya que 2**x la ponderación del error por el pecado es diferente y tendré que encontrar cómo lo hice. Tengo viejos scripts de MATLAB que solían funcionar en Octave, pero ahora ni siquiera puedo hacer que Octave trace en mi vieja computadora portátil G4 Mac.
robert bristow-johnson
2

Aunque no es específico para un punto fijo, recomendaría encarecidamente el libro "Math Toolkit for Real-Time Programming" de Jack Crenshaw. Viene con un CD con el código fuente.

David
fuente
2

TI tiene bibliotecas IQMath para todos sus microcontroladores de punto fijo. He descubierto que son una mina de oro de las funciones matemáticas y DSP de punto fijo, no necesariamente limitadas a chips TI.

MSP430 C28X

Otto Hunt
fuente
Estoy más interesado en los algoritmos que en la implementación de las funciones
RuD
1

La aproximación de Chebyshev puede ayudar a calcular coeficientes polinomiales que están cerca del óptimo para aproximar una función en un rango finito. Ejecuta la rutina de aproximación en una PC para lograr un conjunto particular de coeficientes polinómicos, que luego puede aplicar en cualquier plataforma que desee (por ejemplo, incrustada / DSP) La letra pequeña es más o menos de la siguiente manera:

  • Esto solo funciona para funciones de una variable; si tienes alguna funciónz=f(x,y) entonces la aproximación de Chebyshev no te va a ayudar.
  • La función que estás aproximando debería ser "polinomial". Las esquinas, las curvas cerradas y muchos meneos requerirán polinomios de orden superior para lograr un nivel de precisión determinado.
  • Mantener el orden polinómico bajo es importante: por encima de la quinta parte, puede comenzar a ver errores numéricos.
  • La aproximación de Chebyshev utiliza los polinomios de Chebyshev evaluados sobre el dominio [-1,1], por lo que si el rango de entrada para su función es significativamente diferente, es posible que deba escalar / compensar la entrada de manera apropiada antes de determinar los coeficientes y antes de aplicarlos. Por ejemplo, si me importa una función en el rango de entradax[0,20] entonces podría definir u=(x×0.1)1 así que eso u varía de -1 a +1 y puedo evaluar un polinomio en upara calcular el resultado requerido. Sin esta escala, puede encontrar errores numéricos más fácilmente, o dicho de otra manera, para la misma precisión puede necesitar mayores longitudes de bits para calcular valores intermedios, y esto generalmente no es deseable.
Jason S
fuente
Jason, no utilicé polinomios de Tchebyshev, pero sí utilicé un error MinMax ponderado (a veces llamado "Lnorma "en caso de error), que es, pensé, lo mismo que la aproximación de Tchebyshev. El método que utilicé fue el Algoritmo de Intercambio Remez.
Robert Bristow-Johnson
Remez es superior (aunque más complejo) que Chebyshev. Chebyshev solo se aproxima a la condición minimax, pero generalmente es lo suficientemente bueno.
Jason S