Esercizio 22filtro numerico a 8 bit, coefficienti, prodotti parziali ed errore di troncamento (esercizi del 4 dicembre 2020)
In questa pagina 7
Testo (esercizi del 4 dicembre 2020, problema 1). Un microcontrollore a 8 bit elabora il segnale del proprio convertitore A/D con il filtro numerico , con e (valori ideali). Il programmatore sceglie una normalizzazione frazionaria senza segno per tutte le grandezze, tranne la costante , che è rappresentata senza segno in formato 1.7 (7 bit frazionari, 1 intero). A un certo istante V e il registro a 8 bit di contiene . Il convertitore A/D ha V, 8 bit, e la frequenza di campionamento è 12 kHz. Determinare:
(a) il guadagno a frequenza zero del filtro; (b) la costante di tempo del filtro analogico equivalente (Eulero); (c) il valore in volt di riportato sulla scala del convertitore e l'ampiezza dell'intervallo di confidenza (profilo LSB); (d) la rappresentazione binaria interna di , , con arrotondamento, e l'errore assoluto di ciascuna; (e) i due prodotti richiesti dall'algoritmo su 16 bit e le operazioni di shift per riportare la parte alta di ciascuno al formato di ; (f) il valore binario di con arrotondamento nella riduzione dei prodotti parziali e l'errore assoluto (si assuma come reale il centro dell'intervallo di quantizzazione); l'errore nel caso di uso del troncamento.
Teoria usata: Realizzare un filtro o un regolatore a virgola fissaRealizzare in C un filtro a virgola fissa vuol dire scegliere per ogni dato il formato (coefficienti $<1$ in 0.16 U, coefficienti $>1$ in 1.15, 4.12, 5.11 S...), moltiplicare con aritmetica a 32 bit ($16\times16\to32$) e riportare il prodotto al formato di arrivo con uno shift a destrascorrimento dei bit verso destra: equivale a dividere per una potenza di 2; per sommare due prodotti con scale diverse si fa lo shift prima di sommare. Con $a+b=2^{16}$ il filtro $y=\big(a,y_{k-1}+b,(u\ll4)\big)\gg16$ non va in overflow in un uint32_t. Nel codice il formato di ogni variabile va dichiarato in un commento; la funzione $\sin x\approx x-\frac{x^3}6+\frac{x^5}{120}$ mostra come si approssima una funzione con polinomi a coefficienti in virgola fissa.Realizzare un filtro o un regolatore a virgola fissa →, Operazioni in virgola fissa - somma, prodotto e riallineamentoIn virgola fissa il processore opera sugli interi e non sa dov'è la virgola: tocca al programmatore. Regola 1: si sommano solo dati con lo stesso formato (stesso $m$). Regola 2: il prodotto di $n_1.m_1$ per $n_2.m_2$ ha $m_1+m_2$ bit frazionari e il doppio dei bit: va riallineato con uno shift a destra di $m_2$ posizioni (per riportarlo a $m_1$) o preso dalla parte alta. Con la normalizzazione frazionaria $1.15$ il prodotto è $2.30$ e basta uno shift a sinistra di 1 prima di prendere la parte alta. I fattori di scala si scelgono per evitare overflow e perdita di risoluzione.Operazioni in virgola fissa - somma, prodotto e riallineamento →, Filtri numerici IIR e FIRUn filtro numerico è una equazione alle differenzerelazione che dà il campione di uscita in funzione di campioni di ingresso e di uscita passati $y(k)=\sum_ib_ix(k-i)+\sum_ia_iy(k-i)$. IIR (ricorsivo: qualche $a_i\ne0$) ha risposta impulsiva infinita e bastano pochi termini; FIR (tutti $a_i=0$) è sempre stabile ma richiede molti termini. Il passa-basso IIR del primo ordine $y(k)=b,x(k)+a,y(k-1)$ con $a+b=1$ ha guadagno 1 ed è stabile se $|a|<1$; la risposta al gradino è $y(k)=1-a^{k+1}$. Il filtro analogico equivalente (Eulero) ha $\tau=\dfrac{a,T_c}{1-a}$ e $f_T=\dfrac1{2\pi\tau}$. La media mobile di $N$ campioni è un FIR passa-basso che si assesta in $N$ passi.Filtri numerici IIR e FIR →, Discretizzazione di Eulero e TustinPer realizzare numericamente un filtro o regolatore $F(s)$ si approssima $\frac1s$ con un integratore a tempo discreto. Eulero: $\boxed{s=\dfrac{1-z^{-1}}{T_c}}$ (da $\mathrm{Int}(nT)=\mathrm{Int}((n-1)T)+T,x(n)$). Così $\dfrac{1+s\tau_z}{1+s\tau_p}$ diventa $y(k)=\dfrac{\tau_p}{T_c+\tau_p}y(k-1)+\dfrac{T_c+\tau_z}{T_c+\tau_p}x(k)-\dfrac{\tau_z}{T_c+\tau_p}x(k-1)$. Il passaggio inverso (da algoritmo a $F(s)$) usa $z^{-1}\approx1-sT_c$. L'approssimazione è affidabile solo fino a circa $f_c/10$ (distorsione, warping); Tustin $s=\frac2{T_c}\frac{1-z^{-1}}{1+z^{-1}}$ è più fedele.Discretizzazione di Eulero e Tustin →.
(a) Guadagno in continua
.
(b) Costante di tempo
s. Con Eulero, .
(c) in volt
Con V e 8 bit, mV. : . Con il profilo uniforme ( LSB, 1 LSB, 1 LSB, ...) il codice 10 corrisponde a un intervallo di ampiezza 1 LSB (da a LSB): il valore vero è mV.
(d) Rappresentazione interna
- in 0.8 U: ; .
- in 1.7 U: ; .
- V è la frazione del fondo scala: in 0.8 U ; .
(e) Prodotti a 16 bit e riallineamento
- . I due fattori sono in 0.8: il prodotto ha bit frazionari; la sua parte alta (byte alto) ha già 8 bit frazionari, come : nessuno shift di riallineamento.
- . Qui ha 7 bit frazionari e 8: il prodotto ha bit frazionari. La parte alta (byte alto) ne avrebbe 7: per portarla a 8 bit frazionari (formato di , 0.8) serve uno shift a sinistra di 1 bit (equivale a prendere i bit 14-7 invece dei bit 15-8).
(f) Valore di ed errore
Con arrotondamento nella riduzione a 8 bit:
- : ();
- : () (shift sinistra di 1 della parte alta con arrotondamento). Somma: , cioè . Il valore "vero", con al centro dell'intervallo : . Errore assoluto .
Con troncamento (dati e prodotti troncati): , , ; ; ; ; errore : peggiore del caso con arrotondamento (e di segno sempre negativo).
Errori comuni
- Usare il formato 0.8 per (non rappresentabile: ).
- Dimenticare lo shift di 1 bit per il prodotto con in 1.7.
- Interpretare come V invece che come mV.
- Calcolare con senza il fattore .
Versione ripasso
Testo. Filtro su un µC a 8 bit ( in 1.7 U, il resto 0.8 U), V, , 3,3 V, 12 kHz (4 dicembre 2020).
- (a) guadagno . (b) µs. (c) mV, intervallo 12,89 mV.
- (d) (), (), ().
- (e) (nessuno shift), (shift sinistra di 1).
- (f) , errore ; con troncamento , errore .
- Errori: in 0.8; shift dimenticato;
0x0A≠ 0,10 V; senza (Realizzare un filtro o un regolatore a virgola fissaRealizzare in C un filtro a virgola fissa vuol dire scegliere per ogni dato il formato (coefficienti $<1$ in 0.16 U, coefficienti $>1$ in 1.15, 4.12, 5.11 S...), moltiplicare con aritmetica a 32 bit ($16\times16\to32$) e riportare il prodotto al formato di arrivo con uno shift a destrascorrimento dei bit verso destra: equivale a dividere per una potenza di 2; per sommare due prodotti con scale diverse si fa lo shift prima di sommare. Con $a+b=2^{16}$ il filtro $y=\big(a,y_{k-1}+b,(u\ll4)\big)\gg16$ non va in overflow in unuint32_t. Nel codice il formato di ogni variabile va dichiarato in un commento; la funzione $\sin x\approx x-\frac{x^3}6+\frac{x^5}{120}$ mostra come si approssima una funzione con polinomi a coefficienti in virgola fissa.Realizzare un filtro o un regolatore a virgola fissa →).