29.5 O altă privire la virgulă fixă versus mobilă

În acest ultim exemplu, am profitat de una din trăsăturile cheie ale SHARC DSP, capacitatea sa de a gestiona calcule cu virgulă mobilă. Chiar dacă eșantioanele sunt într-un format cu virgulă fixă atunci când sunt transmise la și de la codec, mergem la problema de a le converti în virgulă mobilă pentru algoritmul de filtrare FIR intermediar. Așa cum am discutat în ultimul capitol, există două motive pentru care dorim să procesăm datele cu ajutorul matematicii cu virgulă mobilă: ușurință în programare și performanță. Face ea într-adevăr o diferență?

Pentru programator, da, face o mare diferență. Codul în vigulă mobilă este mult mai ușor de scris. Priviți înapoi la programul de asamblare din Tabelul 29-2. Există doar două linii (41 și 42) în filtrul principal FIR. În schimb, programatorul în virgulă fixă trebuie să adauge un cod pentru a gestiona datele la fiecare calcul matematic. Pentru a evita depășirea în jos și sus, valorile trebuie să fie verificate pentru mărime și, dacă este necesar, să fie scalate corespunzător. Rezultatele intermediare vor trebui, de asemenea, stocate într-un acumulator de precizie extinsă pentru a evita efectele devastatoare ale erorilor de rotunjire repetate.

Problema performanței este mult mai subtilă. De exemplu, în figura 29-5a este prezentat un filtru low-pass FIR cu o cutoff ascuțită moderat, așa cum este descris în capitolul 16. Această curbă "la scară largă" ar părea la fel ca și virgula fixă sau mobilă utilizată în calcul. Pentru a vedea diferența dintre aceste două metode, trebuie să mărim amplitudinea cu un factor de câteva sute așa cum se arată în (b), (c) și (d). Aici putem vedea o diferență clară. Execuția în virgulă mobilă (b) are ca zgomot de rotunjire redus, astfel încât performanța sa este limitată de modul în care am proiectat kernelul de filtrare. Depășirea (overshoot) de 0,02% în apropierea tranziției este o caracteristică a ferestrei Blackman folosită în acest filtru. Ideea este că, dacă vrem să îmbunătățim performanța, trebuie să lucrăm la algoritm, nu la implementare. Curbele din (c) și (d) prezintă zgomotul de rotunjire introdus când fiecare punct din nucleul filtrului este reprezentat cu 16 și, respectiv, 14 biți. Un algoritm mai bun nu ar face nimic pentru a face aceste curbe mai bune; forma răspunsului real în frecvență este îngropată de zgomot.

Figura 29-5 Zgomotul de rotunjire din răspunsul în frecvență.

Figura (a) prezintă răspunsul în frecvență al unui filtru low-pass windowed-sinc, utilizând o fereastră Blackman și 150 de puncte în kernelul filtrului. Figurile (b), (c) și (d) arată o vedere mai detaliată a acestui răspuns prin efectuare de zoom-in pe amplitudine. Când kernelul filtrului este reprezentat în virgulă mobilă, (b), zgomotul de rotunjire este nesemnificativ comparat cu imperfecțiunile schemei windowed-sinc. Cum se arată în (c) și (d), reprezentarea kernelului de filtru în virgulă fixă face zgomotul de rotunjire imperfecțiunea dominantă.

Figura 29-6 prezintă diferența dintre virgula fixă și cea mobilă în domeniul timp. Figura (a) arată un semnal șerpuit, care scade exponențial în amplitudine. Aceasta ar putea reprezenta, de exemplu, undele sonore de la ciupitul corzilor sau tremuratul terenului dintr-o explozie îndepărtată. Ca și înainte, această formă de undă "la scară mare" ar arăta la fel, dacă virgula fixă sau mobilă au fost folosite pentru a reprezenta eșantioanele. Pentru a vedea diferența, trebuie să mărim amplitudinea, așa cum se arată în (b), (c) și (d). Așa cum am discutat în Capitolul 3, această cuantificare apare ca zgomot aleatoriu aditiv, limitând detectabilitatea componentelor mici în semnale.

Figura 29-6 Zgomotul de rotunjire în domeniul timp.

Figura (a) arată un semnal exemplu cu o amplitudine descrescând exponențial. Figurile (b), (c) și (d) arată o vedere mai detaliată prin zoom-in pe amplitudine. Când semnalul este reprezentat în virgulă mobilă, (b), zgomotul de rotunjire este atât de mic că nu poate fi văzut în acest grafic. Cum se arată în (c) și (d), reprezentarea semnalului în virgulă fixă produce nivele mult mai înalte ale zgomotului de rotunjire.

Aceste diferențe de performanță între virgula fixă și cea mobilă nu sunt adesea importante; de exemplu, ele nu pot fi nici măcar văzute în semnalele "la scară largă" din Figurile 29-5a și Fig.29-6a. Dar, există unele aplicații în care performanța suplimentară a virgulei mobile este utilă și poate fi chiar critică. De exemplu, sistemul audio de înaltă fidelitate pentru consumatori, cum ar fi playerele CD, reprezintă semnale cu virgulă fixă pe 16 biți. În majoritatea cazurilor, aceasta depășește capacitatea de auz umană. Cu toate acestea, cele mai bune sisteme audio profesionale eșantionează semnalele de până la 20-24 de biți, nelăsând absolut nici un spațiu pentru artefacte care ar putea să contamineze muzica. Virgula mobilă este aproape ideală pentru algoritmii care procesează aceste semnale digitale de înaltă precizie.

Un alt caz în care este necesară performanța mai înaltă a virgulei mobile este atunci când algoritmul este deosebit de sensibil la zgomot. De exemplu, FIR filtrele sunt destul de insensibile la efectele de rotunjire. Așa cum se arată în fig. 29-5, zgomotul de rotunjire nu modifică forma generală a răspunsului în frecvență; întreaga curbă devine doar mai zgomotoasă. Filtrele IIR sunt o poveste diferită; rotunjirea poate provoca tot felul de dezastre, inclusiv făcându-le instabile. Virgula mobilă permite acestor algoritmi să obțină o performanță mai bună în acuitatea frecvenței cutoff, atenuarea stopband și overshoot-ul răspunsului la treaptă.

Secțiunea următoare: Instrumente avansate de software