Salta al contenuto
Note per Studenti Esercizio 22 · filtro numerico a 8 bit, coefficienti, prodotti parziali ed errore di troncamento (esercizi del 4 dicembre 2020)

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 y(k)=a⋅y(k−1)+b⋅x(k)y(k)=a\cdot y(k-1)+b\cdot x(k), con a=0,35a=0{,}35 e b=1,3b=1{,}3 (valori ideali). Il programmatore sceglie una normalizzazione frazionaria senza segno per tutte le grandezze, tranne la costante bb, che è rappresentata senza segno in formato 1.7 (7 bit frazionari, 1 intero). A un certo istante x(k)=0,33x(k)=0{,}33 V e il registro a 8 bit di y(k−1)y(k-1) contiene 0x0A\texttt{0x0A}. Il convertitore A/D ha FSR=3,3FSR=3{,}3 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 y(k−1)y(k-1) riportato sulla scala del convertitore e l'ampiezza dell'intervallo di confidenza (profilo 12,1,1,…\frac12,1,1,\dots LSB); (d) la rappresentazione binaria interna di aa, bb, x(k)x(k) 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 y(k)y(k); (f) il valore binario di y(k)y(k) con arrotondamento nella riduzione dei prodotti parziali e l'errore assoluto (si assuma come y(k−1)y(k-1) 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

GDC=b1−a=1,31−0,35=1,30,65=2G_{DC}=\dfrac{b}{1-a}=\dfrac{1{,}3}{1-0{,}35}=\dfrac{1{,}3}{0{,}65}=\mathbf2.

(b) Costante di tempo

Tc=112 kHz=83,3 μT_c=\frac1{12\text{ kHz}}=83{,}3\ \mus. Con Eulero, a=τTc+τ⇒τ=a1−aTc=0,350,65⋅83,3 μs=44,9 μsa=\frac{\tau}{T_c+\tau}\Rightarrow\tau=\frac{a}{1-a}T_c=\frac{0{,}35}{0{,}65}\cdot83{,}3\ \mu\text{s}=\mathbf{44{,}9\ \mu s}.

(c) y(k−1)y(k-1) in volt

Con FSR=3,3FSR=3{,}3 V e 8 bit, LSB=3,3256=12,89LSB=\frac{3{,}3}{256}=12{,}89 mV. y(k−1)=0x0A=10y(k-1)=\texttt{0x0A}=10: V=10⋅12,89 mV=128,9 mVV=10\cdot12{,}89\ \text{mV}=\mathbf{128{,}9\ mV}. Con il profilo uniforme (12\frac12 LSB, 1 LSB, 1 LSB, ...) il codice 10 corrisponde a un intervallo di ampiezza 1 LSB =12,89 mV=\mathbf{12{,}89\ mV} (da 9,59{,}5 a 10,510{,}5 LSB): il valore vero è 128,9±6,4128{,}9\pm6{,}4 mV.

(d) Rappresentazione interna

  • a=0,35a=0{,}35 in 0.8 U: 0,35⋅256=89,6→90=0x5A=010110100{,}35\cdot256=89{,}6\to90=\texttt{0x5A}=\mathbf{01011010}; ε=90256−0,35=+1,56⋅10−3\varepsilon=\frac{90}{256}-0{,}35=\mathbf{+1{,}56\cdot10^{-3}}.
  • b=1,3b=1{,}3 in 1.7 U: 1,3⋅128=166,4→166=0xA6=101001101{,}3\cdot128=166{,}4\to166=\texttt{0xA6}=\mathbf{10100110}; ε=166128−1,3=−3,13⋅10−3\varepsilon=\frac{166}{128}-1{,}3=\mathbf{-3{,}13\cdot10^{-3}}.
  • x(k)=0,33x(k)=0{,}33 V è la frazione 0,333,3=0,1\frac{0{,}33}{3{,}3}=0{,}1 del fondo scala: in 0.8 U 0,1⋅256=25,6→26=0x1A=000110100{,}1\cdot256=25{,}6\to26=\texttt{0x1A}=\mathbf{00011010}; ε=26256−0,1=+1,56⋅10−3\varepsilon=\frac{26}{256}-0{,}1=\mathbf{+1{,}56\cdot10^{-3}}.

(e) Prodotti a 16 bit e riallineamento

  • a⋅y(k−1)=90⋅10=900=0x0384=0000 0011 1000 0100a\cdot y(k-1)=90\cdot10=900=\texttt{0x0384}=\mathbf{0000\,0011\,1000\,0100}. I due fattori sono in 0.8: il prodotto ha 8+8=168+8=16 bit frazionari; la sua parte alta (byte alto) ha già 8 bit frazionari, come yy: nessuno shift di riallineamento.
  • b⋅x(k)=166⋅26=4316=0x10DC=0001 0000 1101 1100b\cdot x(k)=166\cdot26=4316=\texttt{0x10DC}=\mathbf{0001\,0000\,1101\,1100}. Qui bb ha 7 bit frazionari e xx 8: il prodotto ha 7+8=157+8=15 bit frazionari. La parte alta (byte alto) ne avrebbe 7: per portarla a 8 bit frazionari (formato di yy, 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 y(k)y(k) ed errore

Con arrotondamento nella riduzione a 8 bit:

  • a y(k−1)a\,y(k-1): 900/256=3,516→4900/256=3{,}516\to\mathbf4 (0x04\texttt{0x04});
  • b x(k)b\,x(k): 4316/128=33,72→344316/128=33{,}72\to\mathbf{34} (0x22\texttt{0x22}) (shift sinistra di 1 della parte alta con arrotondamento). Somma: 4+34=38=0x26=001001104+34=38=\texttt{0x26}=\mathbf{00100110}, cioè y(k)=38256=0,1484y(k)=\frac{38}{256}=0{,}1484. Il valore "vero", con y(k−1)y(k-1) al centro dell'intervallo 10256=0,0391\frac{10}{256}=0{,}0391: 0,35⋅0,0391+1,3⋅0,1=0,01367+0,13=0,143670{,}35\cdot0{,}0391+1{,}3\cdot0{,}1=0{,}01367+0{,}13=0{,}14367. Errore assoluto 0,14844−0,14367=+4,77⋅10−30{,}14844-0{,}14367=\mathbf{+4{,}77\cdot10^{-3}}.

Con troncamento (dati e prodotti troncati): a=⌊89,6⌋=89a=\lfloor89{,}6\rfloor=89, b=⌊166,4⌋=166b=\lfloor166{,}4\rfloor=166, x=⌊25,6⌋=25x=\lfloor25{,}6\rfloor=25; a y(k−1)=890≫8=3a\,y(k-1)=890\gg8=3; b x(k)=166⋅25=4150→⌊4150/128⌋=32b\,x(k)=166\cdot25=4150\to\lfloor4150/128\rfloor=32; y(k)=35=35256=0,1367y(k)=35=\frac{35}{256}=0{,}1367; errore 0,1367−0,14367=−6,95⋅10−30{,}1367-0{,}14367=\mathbf{-6{,}95\cdot10^{-3}}: peggiore del caso con arrotondamento (e di segno sempre negativo).

Errori comuni

  • Usare il formato 0.8 per b=1,3b=1{,}3 (non rappresentabile: >1>1).
  • Dimenticare lo shift di 1 bit per il prodotto con bb in 1.7.
  • Interpretare 0x0A\texttt{0x0A} come 0,100{,}10 V invece che come 10⋅LSB=128,910\cdot LSB=128{,}9 mV.
  • Calcolare τ\tau con a Tca\,T_c senza il fattore 11−a\frac1{1-a}.

Versione ripasso

Testo. Filtro y=0,35 y(k−1)+1,3 x(k)y=0{,}35\,y(k-1)+1{,}3\,x(k) su un µC a 8 bit (bb in 1.7 U, il resto 0.8 U), x=0,33x=0{,}33 V, y(k−1)=0x0Ay(k-1)=\texttt{0x0A}, 3,3 V, 12 kHz (4 dicembre 2020).

Teoria collegata