28.2 Buffer-area circulară

Procesoarele de semnal digital sunt proiectate pentru a efectua rapid filtre FIR și tehnici similare. Pentru a înțelege hardware-ul, trebuie să înțelegem mai întâi algoritmii. În această secțiune vom face o listă detaliată a pașilor necesari pentru implementarea unui filtru FIR. În secțiunea următoare vom vedea cum sunt proiectate DSP-urile pentru a realiza acești pași cât mai eficient posibil.

Pentru a începe, trebuie să facem o distincție între procesarea off-line și procesarea în timp real. În procesarea off-line, întregul semnal de intrare se află în același timp în computer. De exemplu, un geofizician ar putea folosi un seismometru pentru a înregistra mișcarea de la sol în timpul unui cutremur. După tremurat, informația poate fi citită într-un computer și analizată într-un fel. Un alt exemplu de procesare off-line este tomografia computerizată și RMN. Setul de date este obținut în timp ce pacientul se află în interiorul instalației, însă reconstrucția imaginii poate fi amânată până la o dată ulterioară. Punctul cheie este acela că toate informațiile sunt disponibile simultan programului de procesare. Acest lucru este obișnuit în cercetarea științifică și inginerie, dar nu în produsele de consum. Procesarea off-line este domeniul calculatoarelor personale și a mainframe-urilor.

În procesarea în timp real, semnalul de ieșire este produs în același timp în care se achiziționează semnalul de intrare. De exemplu, acest lucru este necesar în comunicarea prin telefon, aparate auditive și radar. Aceste aplicații trebuie să aibă imediat informațiile disponibile, deși pot fi amânate cu puțin timp. De exemplu, o întârziere de 10 milisecunde într-un apel telefonic nu poate fi detectată de vorbitor sau ascultător. De asemenea, nu are importanță dacă un semnal radar este întârziat cu câteva secunde înainte de a fi afișat operatorului. Aplicațiile în timp real introduc un eșantion, efectuează algoritmul și scot un eșantion, mereu și mereu. Alternativ, pot introduce un grup din eșantioane, efectuează algoritmul și extrag un grup de eșantioane. Aceasta este lumea Procesoarelor de Semnal Digital.

a. Buffer circular la un moment dat b. Buffer circular după următorul eșantion

Figura 28-3 Funcționarea buffer-ului circular.

Buffer-ele circulare sunt utilizate pentru a stoca cele mai recente valori ale unui semnal actualizat continuu. Această ilustrație arată cum apare un buffer circular de opt eșantioane la un moment de timp (a) și cum va apărea un eșantion mai târziu (b).

Acum, priviți înapoi la Fig.28-2 și imaginați-vă că acesta este un filtru FIR implementat în timp real. Pentru a calcula eșantionul de ieșire, trebuie să avem acces la un anumit număr din eșantioanele cele mai recente din intrare. De exemplu, să presupunem că folosim opt coeficienți în acest filtru, a0, a1, … a7. Aceasta înseamnă că trebuie să cunoaștem valoarea celor opt cele mai recente eșantioane din semnalul de intrare, x[n], x[n -1], ... x[n-7]. Aceste opt eșantioane trebuie să fie stocate în memorie și actualizate în mod continuu pe măsură ce sunt achiziționate noi eșantioane. Care este cel mai bun mod de a gestiona aceste eșantioane stocate? Răspunsul este buffer-area circulară.

Figura 28-3 ilustrează un buffer circular cu opt eșantioane. Am plasat acest buffer circular în opt locații de memorie consecutive, 20041 până în 20048. Figura (a) arată cum cele opt eșantioane din intrare pot fi stocate la o anumită clipă în timp, în timp ce (b) arată modificările după ce eșantionul următor este achiziționat. Ideea de buffer-are circulară este că sfârșitul acestei matrice liniare este conectat la începutul ei; locația de memorie 20041 este privită ca fiind lângă 20048, la fel cum 20044 este lângă 20045. Puteți urmări matricea printr-un pointer (o variabilă a cărei valoare este o adresă) care indică locul în care se află cel mai recent eșantion. De exemplu, în (a) pointerul conține adresa 20044, în timp ce în (b) conține 20045. Când se achiziționează un nou eșantion, acesta înlocuiește cel mai vechi eșantion din matrice și pointerul este mutat cu o adresă înainte. Buffer-ele circulare sunt eficiente, deoarece trebuie schimbată o singură valoare atunci când se achiziționează un nou eșantion.

Sunt necesari patru parametri pentru a gestiona un buffer circular. În primul rând, trebuie să existe un indicator (pointer) care să indice începutul buffer-ului circular în memorie (în acest exemplu, 20041). În al doilea rând, trebuie să existe un pointer care să indice sfârșitul matricei (de exemplu, 20048) sau o variabilă care să țină lungimea sa (de exemplu, 8). În al treilea rând, dimensiunea pasului adresării memoriei trebuie specificată. În figura 28-3 dimensiunea pasului este unu, de exemplu: adresa 20043 conține un eșantion, adresa 20044 conține următorul eșantion și așa mai departe. Acest lucru nu este frecvent cazul. De exemplu, adresarea se poate referi la octeți și fiecare eșantion poate necesita doi sau patru octeți pentru a-și menține valoarea. În aceste cazuri, dimensiunea pasului ar trebui să fie de doi sau patru, respectiv.

Aceste trei valori definesc dimensiunea și configurația buffer-ului circular și nu se vor modifica în timpul operării programului. A patra valoare, pointerul pentru cel mai recent eșantion, trebuie să fie modificată pe măsură ce se achiziționează fiecare eșantion nou. Cu alte cuvinte, trebuie să existe o logică a programului care să controleze modul în care această a patra valoare este actualizată pe baza valorii primelor trei valori. În timp ce această logică este destul de simplă, ea trebuie să fie foarte rapidă. Acesta este întreaga idee a acestei discuții; DSP-urile ar trebui optimizate la gestionarea buffer-elor circulare pentru a atinge cea mai mare viteză de execuție posibilă.

Ca o alternativă, buffer-area circulară este utilă și în procesarea off-line. Considerați un program în care ambele semnale de intrare și ieșire sunt complet stocate în memorie. Buffer-area circulară nu este necesară pentru calculul convoluției, deoarece fiecare eșantion poate fi accesat imediat. Dar, mulți algoritmi sunt implementați în etape, cu un semnal intermediar fiind creat între fiecare etapă. De exemplu, un filtru recursiv efectuat ca o serie de biquad-uri funcționează în acest fel. Metoda forței brute este de a stoca întreaga lungime a fiecărui semnal intermediar în memorie. Buffer-area circulară oferă o altă opțiune: stocați numai acele eșantioane intermediare necesare pentru calcul la îndemână. Aceasta reduce cantitatea necesară de memorie, în detrimentul unui algoritm mai complicat. Ideea importantă este că buffer-ele circulare sunt utile pentru procesarea off-line, dar critice pentru aplicațiile în timp real.

Acum ne putem uita la pașii necesari pentru implementarea unui filtru FIR folosind buffer-e circulare atât pentru semnalul de intrare cât și pentru coeficienți. Această listă poate părea ușoară și supraexpusă - nu este! Manipularea eficientă a acestor sarcini individuale este ceea ce separă un DSP de un microprocesor tradițional. Pentru fiecare eșantion nou, trebuie luați toți pașii următori:

Scopul este ca acești pași să fie executați rapid. Deoarece pașii 6-12 vor fi repetați de mai multe ori (o dată pentru fiecare coeficient din filtru), trebuie acordată o atenție deosebită acestor operațiuni. Microprocesoarele tradiționale trebuie să efectueze, în general, acești 14 pași în serie (unul după altul), în timp ce DSP-urile sunt proiectate să le execute în paralel. În unele cazuri, toate operațiile din bucle (pașii 6-12) pot fi completate într-un singur ciclu de ceas. Să ne uităm la arhitectura internă care permite această performanță magnifică.

Secțiunea următoare: Arhitectura procesorului de semnal digital