Libri / risorse per l'implementazione di varie funzioni matematiche in aritmetica in virgola fissa per scopi DSP


8

Sto cercando libri o risorse che trattino in dettaglio quanto segue:

  • implementare funzioni matematiche (es. logaritmo, esponenziale, seno, coseno, inverso) in aritmetica a punto fisso per scopi DSP.

  • tecniche come l'utilizzo di tabelle di ricerca, serie Taylor, ecc.

Conosco abbastanza bene la programmazione C e sono più interessato agli algoritmi su come implementare varie funzioni matematiche in modo efficiente.


1
Questo è solo un trucco, ma è molto utile. Si tratta di calcolare la funzione atan2, ovvero calcolare l'argomento di un numero complesso dalle sue parti reali e immaginarie.
Matt L.

1
posso darvi alcune serie di potenze ottimizzate per ordine finito che ho sviluppato più di un decennio fa. a parte il cliente iniziale, non ho avuto soldi per questo da allora, quindi penso che potrei anche renderlo di dominio pubblico. originariamente era stato sviluppato per il floating point in un contesto in cui il client non poteva includere lo stdlib nella build. e la valutazione non è un po 'perfetta. cioè c'è un errore, ma molto piccolo e ottimizzato per la particolare funzione da valutare. fammi trovare quel file, tirerò fuori i coefficienti e pubblicherò quelli della serie.
robert bristow-johnson,

@ robertbristow-johnson non vedo l'ora di utilizzare la serie e vedere come va! Grazie!
RuD,

Ruchir, ho pubblicato la serie qui sotto. ci sono cose di buonsenso che devi fare per estendere la portata. piace
2x=2k×2xk
Se kxk+1. cosa simile perlog2()e i sinusoidi periodici. per exp e log, ciò richiederà lo spostamento aritmetico dei bit di ciò che esce (per exp) o di ciò che accade (per log). Penso che puoi capirlo. e, naturalmente, per exp e log di basi diverse (comee), basta ridimensionare con la costante appropriata ciò che accade 2x e cosa viene fuori log2(x).
robert bristow-johnson,

Risposte:


9

la forma polinomiale generale è:

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

quest'ultima forma utilizza il metodo di Horner , che è altamente raccomandato, specialmente se lo stai facendo in virgola mobile a precisione singola.

quindi per alcune funzioni specifiche:

radice quadrata:

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

Se 2x4, utilizzare quanto sopra per valutare x2 e moltiplica quel risultato con 2 ottenere x. come conlog2(x), applicare il potere di 2 ridimensionamento per ridimensionare l'argomento nell'intervallo necessario.

logaritmo di base 2:

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

esponenziale di 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

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

Sembra abbastanza utile! Grazie mille per averlo condiviso. Ma la prima voce di riferimento man soxè la migliore;)
jojek

non lo so sox. cosa dice il manuale al riguardo?
robert bristow-johnson,

2
Semplicemente [1] R. Bristow-Johnson, Cookbook formulae for audio EQ biquad filter coefficients, http://musicdsp.org/files/Audio-EQ-Cookbook.txt:)
jojek

A proposito, la serie minimizza l' errore massimo ponderato . l'errore è ponderato in modo tale che abbia senso per la funzione. errore massimo uniforme perlog2(). errore massimo proporzionale perx e 2x. qualcosa di simile a proporzionale persin() avere a che fare con i coefficienti di calcolo per i filtri risonanti in modo che l'errore massimo di log(f0)è ridotto al minimo. non ricordo quale criterio ho usato perarctan(). e per qualche motivo non riesco a trovare il mio file che mi dice quali sono gli errori massimi, dato l'intervallo dix. qualcuno con MATLAB può scoprirlo.
robert bristow-johnson,

1
dovresti tracciare l'errore con il tuo pitone, se puoi. anche np.max(np.abs(sqrt_1px(xp)-np.sqrt(1+xp)))potrebbe essere invece lo np.max(np.abs((sqrt_1px(xp)-np.sqrt(1+xp))/np.sqrt(1+xp))) stesso per 2**x la ponderazione dell'errore per il peccato è diverso e dovrò trovare come l'ho fatto. ho vecchi script MATLAB che in qualche modo funzionavano in Octave, ma ora non riesco nemmeno a far girare Octave sul mio vecchio laptop G4 Mac.
robert bristow-johnson,

2

Sebbene non specifico per il punto fisso, consiglio vivamente il libro "Math Toolkit for Real-Time Programming" di Jack Crenshaw. Viene fornito con un CD con il codice sorgente.


2

TI ha librerie IQMath per tutti i loro microcontrollori a punto fisso. Ho trovato che erano una miniera d'oro di funzioni matematiche a punto fisso e DSP non necessariamente limitate ai chip TI.

MSP430 C28X


Sono più interessato agli algoritmi piuttosto che alla semplice implementazione delle funzioni
RuD

1

L'approssimazione di Chebyshev può aiutare a calcolare coefficienti polinomiali vicini all'ottimale per approssimare una funzione su un intervallo finito. Esegui la routine di approssimazione su un PC per ottenere un determinato insieme di coefficienti polinomiali, che puoi quindi applicare su qualsiasi piattaforma ti piaccia (ad esempio, incorporato / DSP) La stampa fine è più o meno come segue:

  • Funziona solo con le funzioni di una variabile; se hai qualche funzionez=f(x,y) allora l'approssimazione di Chebyshev non ti aiuterà.
  • La funzione che stai approssimando dovrebbe essere "simile al polinomio". Angoli, curve acuminate e molte oscillazioni richiedono polinomi di ordine superiore per raggiungere un determinato livello di precisione.
  • Mantenere basso l'ordine polinomiale è importante: oltre il 5 ° o giù di lì, potresti iniziare a vedere errori numerici.
  • L'approssimazione di Chebyshev utilizza i polinomi di Chebyshev valutati sul dominio [-1,1], quindi se l'intervallo di input per la propria funzione è significativamente diverso, potrebbe essere necessario ridimensionare / compensare l'input in modo appropriato prima di determinare i coefficienti e prima di applicarli. Ad esempio, se mi interessa una funzione nell'intervallo di inputx[0,20] allora potrei definire u=(x×0.1)1 così che u varia da -1 a +1 e posso valutare un polinomio in uper calcolare il risultato richiesto. Senza questo ridimensionamento, è possibile imbattersi in errori numerici più facilmente - o dichiarati in un altro modo, per la stessa precisione potrebbe essere necessario disporre di lunghezze di bit più elevate per calcolare i valori intermedi, e ciò è generalmente indesiderabile.

Jason, non ho usato i polinomi di Tchebyshev, ma ho usato un errore MinMax ponderato (a volte chiamato "Lnorm "on error), che è, pensavo, lo stesso dell'approssimazione di Tchebyshev. Il metodo che ho usato era Remez Exchange Algorithm.
robert bristow-johnson

Remez è superiore (sebbene più complesso) di Chebyshev. Chebyshev si avvicina alla condizione minimax, ma di solito è abbastanza buono.
Jason S
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.