Algoritmi Rapizi Pentru Transformata Fourier Discreta Si Transformata Hartley Discreta

CUPRINS

Algoritmi rapizi pentru transformata Fourier discretă și transformata Hartley discretă 2

1.1. Transformata Fourier discretă. Definiții 2

1.2. Algoritmi TFR în baza 2 cu decimare în timp 4

1.3. Algoritmi TFR în baza 2 cu decimare în frecvență 5

1.4. Algoritmi TFR pentru date reale în baza 2 cu decimare în timp 8

1.5. Transformata Hartley discretă. Definiții. Proprietăți 10

1.6. Algoritmi THR în baza 2 cu decimare în timp 11

1.7. Algoritmi THR în baza 2 cu decimare în frecvență 14

Efectul Gibbs…………………………………………………………………………….. 17

Caracteristici generale ale familiei de procesoare TMS320C3x …………………… 22

Implementarea algoritmilor rapizi pentru TFR și THD pe procesorul de semnal TMS320C31……………………………………………………………………………. 48

4.1. Programul pentru TFR în bază 2 cu decimare în frecvență 48

4.2. Implementarea ferestrei Hamming 65

4.3. Transformata Fourier inversă 66

4.4. Programul pentru THD în bază 2 cu decimare în frecvență 67

4.5. Transformata Hartley inversă 74

Implementarea în timp real a TFR și THR 75

Concluzii…………………………………………………………………………………77

=== Cap1 ===

Algoritmi rapizi pentru transformata Fourier discretă și transformata Hartley discretă

1.1. Transformata Fourier discretă. Definiții

Fie secvența de suport finit:

, (1.)

Se definește transformata Fourier discretă (TFD) a acestei secvențe prin:

, , (1.)

Cunoscând se poate determina cu ajutorul transformatei Fourier discretă inversă (TFDI) definită de relația:

, (1.)

În continuare sunt prezentate câteva teoreme și proprietăți utile:

Teorema de deplasare

Vom defini deplasarea ciclică a unei secvențe prin:

Se pot demonstra:

– o teoremă a deplasării circulare în timp:

– o teoremă a deplasării circulare în frecvență:

Teorema de simetrie

Dacă

atunci

Teorema de convoluție

– teorma convoluției ciclice în timp:

– teorma convoluției ciclice în timp:

Pentru efectuarea transformatei Fourier discrete (1.2) sunt necesare înmulțiri complexe și adunări complexe. Dacă o înmulțire complexă se efectuează în 4 înmulțiri și două adunări reale, rezultă un număr de înmulțiri reale și adunări reale. Complexitatea aritmetică este de forma deci crește cu .

Având în vedere proprietățile coeficienților ,

, , (1.4)

există algoritmi care permit efectuarea TFD cu un număr mai mic de operații. De exemplu, dacă , se poate descompune transformarea de ordin N în transformări de ordin și . Un caz important este acela în care , R numindu-se bază.

Pornind de la o reprezentare a indicilor sub forma:

(1.5)

în cazul algoritmilor în baza R sunt posibile următoarele moduri de reprezentare a indicilor:

(1.6)

ceea ce conduce la algoritmi cu decimare în timp și

(1.7)

ceea ce conduce la algoritmi cu decimare în frecvență.

1.2. Algoritmi TFR în baza 2 cu decimare în timp

Acești algoritmi au fost introduși de Cooley și Tukey pentru , .

În acest caz indicii se vor scrie:

(1.8)

și rezultă:

(1.9)

sau: (1.10)

Dar:

(1.11)

așa încât, scriind separat pentru și :

(1.12)

(1.13)

Fiecare din sumele ce apar în cele două relații de mai sus, reprezintă câte o TFD în puncte, primele pentru secvența formată cu eșantioanele pare, a doua, cu eșantioanele impare.

Rezultă schema din figura 1.1:

Figura 1.1. Descompunerea TFD de ordin N în transformate de ordin

Trecerea de la transformatele de ordin la transformata de ordin N se face prin intermediul unor structuri de tip fluture (figura 1.2). Această structură este constituită dintr-o înmulțire cu factorul , numit și factor de rotație, și o transformată Fourier discretă de ordinul doi.

Figura 1.2. Fluturele pentru TFD B2T

Procedeul descris mai înainte se va aplica recursiv pentru transformatele de ordin până se ajunge la transformate de ordinul 2.

Rezultă că pentru o transformată de ordin sunt necesare M etaje, fiecare conținând fluturi, deci în total sunt necesari fluturi.

1.3. Algoritmi TFR în baza 2 cu decimare în frecvență

În acest caz se reprezintă indicii sub forma:

(1.14)

deci

(1.15)

din care rezultă pentru k1=0 și k2=1

(1.16)

(1.17)

Se constată iarăși descompunerea transformatei de ordin N în două transformate de ordin N/2(figura 1.3).

Figura 1.3. Descompunerea TFD de ordin N în transformate de ordin

În continuare fiecare din cele două grupuri de câte N/2 semnale ce constituie intrările transformatelor în N/2 puncte se desparte în două, după același procedeu (primele N/4 și următoarele N/4).

De exemplu pentru N=8, se obțin succesiv grafurile din figurile 1.4 și 1.5

Figura 1.4.

Figura 1.5.

Ca și în cazul precedent, rezultă log2N etaje, în fiecare efectuâdu-se N/2 operațiide tip “fluture”. Structura fluturelui este însă cea din figura 1.6.

Figura 1.6. Fluturele pentru TFD B2F

Evident complexitatea, exprimată prin numerele de înmulțiri reale și de adunări reale este aceeși ca în algoritmul precedent.

În acest caz eșantioanele semnalului se iau în ordinea naturală, iar ale ieșirii, rezultă în ordinea inversată a biților.

1.4. Algoritmi TFR pentru date reale în baza 2 cu decimare în timp

În cazul secvențelor reale există proprietatea:

(1.18)

deci

, (1.19)

iar și au valori reale. În consecință este suficient să se calculeze:

, , , …, (1.20)

, , , …,

deci un număr de N cantități reale.

Există algoritmi specializați pentru date reale, care vor permite reducerea complexității aritmetice precum și a memoriei utilizate, cu prețul unei anumite complicări a programului.

a. Algoritmi pentru o singură secvență reală

Vom utiliza algoritmul în bază doi cu decimare în timp:

(1.21)

Pentru :

(1.22)

unde prin și s-au notat transformatele de ordin .

Pentru a pune în evidență simetria circulară pară a acestor transformate:

, (1.23)

evaluăm și:

(1.24)

Exprimând părțile reale și imaginare se obțin:

(1.25)

unde

(1.26)

Vom utiliza primele două relații pentru eșantioanele de ordin apoi ultimele două relații pentru exprimarea eșantioanelor de ordin .

Rezultă schema din figura 1.7:

Figura 1.7. Descompunerea TFD pentru date reale

b. Algoritmi pentru două secvențe reale

Dacă trebuie calculate simultan două secvențe de date reale și , se poate utiliza algoritmul pentru date complexe. TFD este o transformată liniară astfel că, dacă notăm:

(1.27)

atunci:

(1.28)

sau

(1.29)

având în vedere formulele (1.15) rezultă:

(1.30)

Se pot separa transformatele fiecărei secvențe din rezultatul algoritmului TFR pentru date complexe cu formulele:

, (1.31)

, (1.32)

Se observă că deoarece secvențele sunt reale, TFD are simetrie circular conjugat simetrică, deci este suficient calculul TFD pentru . De asemenea, pentru și avem:

(1.33)

1.5. Transformata Hartley discretă. Definiții. Proprietăți

Fie semnalul discret, real, de suport finit:

, (1.34)

Se definește transformata Hartley discretă (THD) prin:

, (1.35)

unde

(1.36)

Transformata Hartley discretă inversă (THDI) este definită de relația:

, (1.37)

Aceste relații pun în evidență că, exceptând înmulțirea cu , transformata directă și inversă au expresii identice.

a. Proprietăți de simetrie

Proprietățile de paritate și imparitate circulară se conservă prin transformare, adică:

– dacă , , rezultă de asemenea

, .

– dacă , rezultă de asemenea

.

b. Relații cu TFD

Deoarece:

(1.38)

rezultă

(1.39)

Invers, observând că

(1.40)

rezultă că

(1.41)

(1.42)

1.6. Algoritmi THR în baza 2 cu decimare în timp

Algoritmii în baza 2 cu decimare în timp pot fi introduși și pentru transformata Hartley. În acest caz indicii se vor scrie:

(1.43)

Relația (1.2) se poate scrie:

(1.44)

Se demonstrează relația:

(1.45)

așa încât rezultă:

(1.46)

Se observă descompunerea THD de ordin N în două THD de ordin , având drept intrări eșantioanele pare, respectiv impare ale secvențelor de intrare (figura 1.8).

Figura 1.8. Descompunerea THD de ordin N în transformate de ordin

Operația de decimare se va aplica în continuare transformatelor în puncte, și așa mai departe, până se ajunge la transformate de ordinul 2. În figură se observă structura fluturelui specific acestei transformări. Se vede că un asemenea fluture conține 4 înmulțiri și 6 adunări (toate reale). Pentru și se obțin structuri mai simple (figura 1.9) având doar două adunări.

Figura 1.9.

În total, într-un etaj de dimensiune N se găsesc fluturi cu structură complexă pentru și fluturi de tip , .

Este prezentat (ca exemplu) în figura 1.10 graful corespunzător unei THD cu decimare în timp pentru N=16.

Figura 1.10.

1.7. Algoritmi THR în baza 2 cu decimare în frecvență

Algoritmii cu decimare în frecvență, în baza R, sunt generați prin reprezentarea indicilor sub forma:

(1.47)

Pentru R=2, rezultă:

(1.48)

care se desparte în

(1.49)

Relațiile de mai sus conduc de asemenea la descompunerea transformatei de ordin N în două transformate de ordin N/2:

(1.50)

conform figuri 1.11.

Figura 1.11. Descompunerea THD de ordin N în transformate de ordin

Cele două metode prezentate până aici sunt echivalente ca număr de operații și permit stocarea rezultatelor în aceleași celule de memorie în care s-au aflat inițial operanzii, în fiecare etapă de calcul("in-place"). Ca și în cazul algoritmilor FFT, în cazul decimării în timp ordinea intrărilor va fi obținută prin procedeul "inversarea ordini biților", iar ordinea ieșirilor este ce naturală; situația se inversează în cazul decimării în frecvență. În figura 1.12 este prezentat graful corespunzător unei THD cu decimare în frecvență pentru N=16.

Figura 1.12.

=== Cap2 ===

Capitolul 2

Efectul Gibbs

Așa cum sa arătat în capitolul 1 transformata Fourier este definită pe secvența de lungime finită

, (2.)

Această secvență poate fi văzută ca o trunchiere abruptă a secvenței de lungime infinită sau ca o ponderare a semnalului cu o funcție pondere (fereastră) de lungime N notată , adică:

(2.2)

unde

(2.3)

Fereastra definită de ecuația (2.3) poartă numele de fereastră dreptunghiulară.

Această trunchiere conduce la efectul Gibbs care se manifestă prin apariția unor ondulații (ripluri) la transformata Fourier. Pentru reducerea acestor ripluri se pot folosi alte tipuri de ferestre, mai puțin abrupte decât cea dreptunghiulară. Dintre acestea cele mai uzuale sunt: fereastra Hamming generalizată și ferastra triunghiulară.

Fereastra Hamming generalizată

Se definește fereastra Hamming generalizată prin:

Definiția de mai sus este valabilă atât pentru N impar cât și pentru N par.

Dacă = 0,54 fereastra este denumită Hamming, iar dacă = 0,5 este denumită Hanning (sau fereastra lui von Hann). În figura 2.1 sunt prezentate cele două ferestre pentru N= 16.

Fereastra triunghiulară (ferastra Bartlett)

Se definește fereastra triunghiulară prin:

Definiția de mai sus este valabilă atât pentru N impar cât și pentru N par. În figura 2.2 este prezentată fereastra triunghiulară.

Figura 2.1

Figura 2.2

Pentru a pune în evidența efectul Gibbs și utilizare diferitelor tipuri de ferestre se va reprezenta în domeniul frecvență, utilizând mediul MATLAB, un semnal sinusoidal cu frecvența 5Hz (Figura 2.3).

Figura 2.3

Transformata Fourier rapidă a acestui semnal ponderat cu o fereastră dreptunghiulară de lungime N=200 este prezentată în figura 2.4.

Figura 2.4

Transformata Fourier rapidă a acestui semnal ponderat cu fereastra Hamming de lungime N=200 este prezentată în figura 2.5.

Figura 2.5

Transformata Fourier rapidă a acestui semnal ponderat cu fereastra Hanning de lungime N=200 este prezentată în figura 2.6.

Figura 2.6

Transformata Fourier rapidă a acestui semnal ponderat cu fereastra tiunghiulară de lungime N=200 este prezentată în figura 2.7.

Figura 2.7.

Se observă că în cazul folosirii ferestrei dreptunghiulare, energia nu este concentrată numai în componenta principală (cea de pe frecvența de 5Hz), ea distribuindu-se și pe alte componente secundare nedorite, ce apar datorită trunchierii abrupte. Acest lucru duce la o degradare a spectrului, putând compromite rezultatele unor aplicații mai complexe, aplicații care folosesc în algoritmul lor TFR.

Dacă se foloseșete o fereastră mai puțin abruptă, cum ar fi fereastra Hamming generalizată sau fereastra triunghiulară, componentele secundare din spectrul semnalului sunt atenuate foarte mult, rezultând un spectru destul de apropiat de cel ideal.

=== Cap3 ===

Capitolul 3

Caracteristici generale ale familiei de procesoare TMS320C3x

Generația TMS320C3x este prima familie de procesoare în virgulă mobilă produsă de Texas Instruments. Aceste procesoare se dovedesc a fi ușor de folosit, cu o arhitectură de înaltă performanță, ce permite utilizatorilor să-și dezvolte rapid produsele.

Procesoarele ‘C3x pot fi folosite într-o arie largă și variată de aplicații cum ar fi: audio digitale, automatizare și control industrial, comunicații de date, echipamente de birou (periferice multifuncționale, copiatoare și imprimante cu laser).

TMS320C3x – introducere

Procesoarele ‘C3x au o arhitectură de tip von Neumann, care este caracterizată de un spațiu unic de date și program. Pentru a îmbunătăți și mai mult performanțele, procesoarele sunt prevăzute cu patru bus-uri interne de date și cel puțin un bus extern de date. Arhitectura de bază este îmbunătățită cu numeroase dispozitive periferice on-chip.

Unitatea centrală de prelucrare (CPU) conține o unitate de multiplicare independentă și o unitate aritmetică și logică (ALU) ce oferă până la 60 de milioane de operații în virgulă mobilă pe secundă (MFLOPS) si până la 30 de milioane de instrucțiuni pe secundă (MIPS).

Controlerul de acces direct la memorie (DMA) are propriul bus de date și lucrează în paralel cu unitatea centrala de prelucrare. El este programat pentru a introduce și a scoate seturi de date din memorie, eliberând astfel CPU-ul pentru operațiile aritmetice. Controlerul DMA poate accesa orice adresă din harta de memorie fie ea internă, externă sau chiar memoria mapată pentru regiștri periferici.

Spațiul total de memorie al procesoarelor ‘C3x este de 16M de cuvinte pe 32-biți. Având datele, programele, si bufferele de intrare-iesire în aceste 16M de cuvinte, gama de adrese maximizează folsirea memoriei și permite alocarea spațiului de memorie așa cum se dorește. Ambele blocuri de memorie RAM de 1K cuvinte de 32-biți pot suporta două accesări de la CPU într-un singur ciclu. Bus-urile separate de program, date, si DMA permit executarea în paralel a instrucțiunilor de program, scrierea-citire datelor și chiar a operațiilor DMA. Pentru mențnerea unor bune performanțe când se folosește o memorie externă mai lentă procesorul este prevăzut cu o memorie cache de 64 de cuvinte.

Echipamentele necesare proiectării și dezvoltării aplicațiilor pe aceste procesoare sunt puse la dispoziție de Texas Instuments și includ: simulator software, compilator-asamblor-linker C, emulator hardware, modul de evaluare (EVM), și modul DSP Starter Kit.

Caracteristicile de bază ale familiei de procesoare TMS320C3x

Caracteristicile de bază ale familiei de procesoare TMS320C3x sunt enumerate în paragraful care urmeză.

CPU

Timpul de executie a unui singur ciclu-instrucțiune este de 33ns pentru o frecvență de ceas de 60MHz ( valabil pentru procesoarele ‘C31 și ‘C32)

60 MHz frecvență de ceas

60 MFLOPS

30 MIPS

Timpul de executie a unui singur ciclu-instrucțiune este de 40ns pentru o frecvență de ceas de 50MHz ( valabil pentru procesoarele ‘C31,‘C32 și ‘C30)

50 MHz frecvență de ceas

50 MFLOPS

25 MIPS

Timpul de executie a unui singur ciclu-instrucțiune este de 50ns pentru o frecvență de ceas de 40MHz ( valabil pentru procesoarele ‘C31,‘C32 și ‘C30)

40 MHz frecvență de ceas

40 MFLOPS

20 MIPS

Timpul de executie a unui singur ciclu-instrucțiune este de 60ns pentru o frecvență de ceas de 33MHz ( valabil pentru procesoarele ‘C31 și ‘C32)

33 MHz frecvență de ceas

33,3 MFLOPS

16,7 MIPS

instrucțiun pe 32-biți, datele sunt structurate în cuvinte de 32-biți, iar adresele pe 24-biți

întregii sunt reprezentați pe 24 sau 32 de biți, numerele în virgulă mobilă sunt reprezentate pe 32 sau 40 de biți iar operațiile logice pe 32-biți

instrucțiunile pot avea doi sau trei operanzi

se pot efectua în paralel instrucțiuni ALU și de multiplicare într-un singur ciclu

posibilitate de repetiție a unui bloc de program

salturi și bucle într-un singur ciclu

apelări și întoarceri condiționate

două generatoare de adrese cu opt regiștri auxiliari și doi regiștri auxiliari folosiți de unitatea aritmetică

opt regiștri de 40-biți cu precizie extinsă

un bloc de shiftare pe 32-biți

Periferice

controler integrat DMA cu mapare de memorie, cu funcționare paralelă cu CPU-ul și cu operațiile I/O

două canale cu prioritate configurabilă (doar la ‘C32)

port serial mapat în memorie ce suportă transfer full-duplex pe 8-, 16-, 24-, sau 32-biți

un singur port serial la procesoarele ‘C31 și ‘C32

două porturi seriale la procesorul ‘C30

două timere pe 32-biți mapate în memorie

două flaguri externe cu caracteristici generale și patru întreruperi externe

scanare logică de testare și evaluare

Memoria

memorie cache pentru instrucțiuni de 64 de cuvinte pe 32-biți

un bloc de memorie ROM de 4K de cuvinte pe 32-biți cu acces dual într-un singur ciclu (valabil pentru ‘C30)

două blocuri de memorie RAM de câte 1K cuvinte pe 32-biți cu acces dual într-un singur ciclu (valabil pentru ‘C30 și ‘C31)

două blocuri de memorie RAM de câte 256 cuvinte pe 32-biți cu acces dual într-un singur ciclu (valabil pentru ‘C32)

spațiu de adresare maxim de 16M cuvinte

bootloader preprogramabil (valabil pentru ‘C31 și ‘C32)

Interfețele memoriei

două bus-uri de extindere a memoriei (valabil pentru ‘C30)

un bus extern de memorie (valabil pentru ‘C31 și ‘C32)

dimensiune flexibilă a reprezentării datelor de 8-, 16- sau 32-biți în locații de memorie de 8-, 16- sau 32-biți (valabil pentru ‘C32)

Tehnologie CMOS

În figura 3.1 prezentăm schema bloc a procesoarelor TMS320C3x

Figura 3.1 Schema bloc a procesoarelor TMS320C3x

Unitatea centrală de prelucrare a familiei de procesoare TMS320C3x

Unitatea centrală de prelucrare are un multiplicator și un acumulator independent putând ajunge la o viteză de 60 MFLOPS. Rezultatele sunt stocate în unul in cei opt regiștri cu precizie extinsă. Aceștia sunt regiștri pe 40 de biți care stochează numere în virgulă mobilă cu mantisa reprezentată pe 32-biți și exponentul pe 8-biți. Acești regiștri pot fi folosiți atât ca sursă cât și ca destinație pentru orice operație aritmetică. Regiștri cu precizie extinsă sunt resurse extrem de valoroase pentru programarea în C sau Asamblare. Ei permit menținerea rezultatelor intermediare fără stocarea lor în memorie. Acest lucru are ca rezultat performanțe înalte pentru programele realizate în Asamblare sau în C.

Pentru menținerea vitezei de 60 de MFLOPS, CPU-ul are prevăzute doua unități independente de regiștri auxiliari aritmetici (ARAUs). Aceste două unități generează adrese pe 24-biți care sunt accesate prin intermediul a 8 regiștri auxiliari. Unitățile ARAU pot realiza oricare dintre funcțiile următoare:

pre- sau post-incrementare sau decrementare

index de offset pentru incrementări sau decrementări diferite de 1

adresare circulară pentru a realiza buffere circulare

adresare cu ordine inversată a biților necesară algoritmilor FFT.

Alte caracteristici ale CPU-ului:

60 MFLOPS

oprații de multiplicare pe 32- sau 40-biți (petru numere întregi sau în virgulă mobilă)

oprații aritmetice și logice pe 32- sau 40-biți (petru numere întregi sau în virgulă mobilă)

registru (barrel) de shiftare pe 32 –biți

opt regiștri de precizie extinsă

două generatoare de adrese

doi regiștri de index

opt regiștri pentru adresare indirectă.

În figura 3.2 este prezentată schema bloc a unității centrale de prelucrare a familiei ‘C3x.

Figura 3.2 Schema bloc CPU ('C3x)

Unitatea de multiplicare a numerelor în virgulă mobilă sau a întregilor

Multiplicatorul realizează într-un singur ciclu înmulțirea întregilor reprezentați pe 24-biți și a numerelor în virgulă mobilă reprezentate pe 32-biți. Implementarea aritmeticii în virgulă mobilă pe procesoarele 'C3x permite realizarea operațiilor în virgulă mobilă sau fixă la viteze de maxim 33ns pe ciclu instrucțiune. Pentru realizarea unei viteze și mai mari de ieșire se pot implementa instrucțiuni în paralel pentru execuția de înmulțiri și de operații ALU într-un singur ciclu.

Când multiplicatorul realizează operații de înmulțire în virgulă mobilă, datele de intrare sunt numere reprezentate pe 32-biți iar rezultatele sunt în virgulă mobilă pe 40-biți. Când multiplicatorul realizează operații de înmulțire cu numere întregi, datele de intrare sunt numere reprezentate pe 24-biți iar rezultatele sunt pe 32-biți.

Unitatea aritmetică și logică (ALU) și bus-urile interne

ALU realizează operații cu întregi pe 32-biți, cu operanzi logici pe 32-biți și date în virgulă mobilă pe 40-biți, și chiar conversii întreg – virgulă mobilă într-un singur ciclu. Rezultatele sunt mereu stocate pe 32-biți întergii sau pe 40-biți pentru formatul în virgulă mobilă. Containerul (barrel) de shiftare este folosit pentru shiftări de maxim 32-biți la stânga sau la dreapta într-un singur ciclu.

În ceea ce privește bus-urile interne, CPU1, CPU2, REG1 și REG2, ele transportă doi operanzi din memorie și doi operanzi din regiștri, permițând înmulțiri în paralel cu adunări și scăderi cu patru operanzi întergi sau în virgulă mobilă într-un singur ciclu.

Unitatea de regiștri auxiliari aritmetici (ARAUs)

Două unități de regiștri auxiliari aritmetici (ARAU0 și ARAU1) pot genera două adrese într-un singur ciclu. Ele lucrează în paralel cu multiplicatorul și cu ALU. Suportă adresări cu deplasament, cu doi regiștri de index ( IR0 și IR1), adresări circulare și cu ordinea inversată a biților (bit-reversed).

Regiștri primari ai unității centrale de prelucrare

Procesoarele 'C3x dețin 28 de regiștri într-un fișier de regiștri multiport care este în strânsă legătură cu CPU-ul. În tabelul x.x sunt trecuți în revistă numele și funcțiile lor.

Regiștri de precizie extinsă (R0R7) pot stoca și suporta operații cu numere întregi pe 32-biți sau în virgulă mobilă pe 40-biți. Orice instrucțiune al cărei operand este în virgulă mobilă folosește biții 390. Dacă operandul este întreg cu sau fară semn se folosesc biții 310, biții 3932 păstrându-se neschimbați. Acest lucru este valabil pentru toate operațiile cu shiftare.

Regiștri auxiliari (AR0AR7) sunt accesați de CPU și modificați de cei doi ARAUs. Funcția lor primară este generarea de adrese pe 24-biți. Pot fi folosiți pe post de contoare de bucle sau ca regiștri generali pe 32-biți, în acest caz fiind modificați de ALU.

Pointer-ul paginii de date (DP) este un registru pe 32-biți ai cărui cei mai puțin semnificativi 8-biți (LSBs) sunt folosiți pentru adresarea directă ca pointer în pagina de date adresată. Paginile de date sunt lungime de 64K-cuvinte în număr total de 256-pagini. Biții 318 sunt rezervați și trebuie menținuți tot timpul la 0.

Regiștri index (IR0IR1) conțin valorile folosite de ARAUs pentru a calcula adresele indexate.

Registrul dimensiune de bloc (BK) este pe 32-biți și este folosit de ARAU în adresările circulare pentru a specifica dimensiunea blocului de date.

Pointer-ul stivei sistemului (SP) este un registru pe 32-biți ce conține adresa vârfului stivei sistemului. El pointerizează mereu spre ultimul element pus în stivă. Instrucțiunea push realizează preincrementarea; iar pop realizează postdecrementarea SP-ului. El este controlat de întreruperi, salturi, întoarceri și de instrucțiunile push și pop.

Registrul de stare (ST) conține informații globale în legătură cu starea CPU-ului. De obicei operațiile setează fanioanele de condiție ale ST-ului în concordanță cu rezultatele lor. Acestea includ operațiile de încărcare și stocare a regiștrilor și operații aritmetice sau logice.

Registrul de activare a întreruperilor CPU-ului sau DMA-ului (IE) este un registru pe 32-biți. Biții de activare a întreruperii CPU-ului sunt plasați pe poziția 100. Biții de activare a întreruperii DMA-ului sunt plasați pe poziția 2616. Un 1 pe una din aceste poziții indică activarea întreruperii respective ( un 0 o dezactivează ).

Fanionul pentru întreruperile CPU-ului (IF) este un registru pe 32-biți. Dacă fanionul de întrerupere este 1 asta indică că respectiva întrerupere este setată ( iar 0 indică absența setării).

Fanionul pentru intrare-ieșire (IOF) controlează funcționarea pinilor externi dedicați XF0 și XF1. Acești pini pot fi configurați ca intrare sau ieșire și la fel de bine pot fi citiți sau scriși.

Registrul contor ciclu (RC) este un registru pe 32-biți care specifică de câte ori trebuie să se repete un bloc de instrucțiuni când se cere acest lucru. Când procesorul lucrează în modul repetiție, registrul (pe 32-biți) care indică adresa de start a unui ciclu (RS) conține adresa de început a blocului de program care trebuie repetat, iar registrul (pe 32-biți) care indică adresa de sfârșit a unui ciclu (RE) conține adresa finală a blocului de program.

Alți regiștri

Contorul de program (PC) este un registru pe 32-biți ce conține adresa instrucțiuni următoare din program. Chiar dacă nu face parte dintre regiștri CPU-uluim, el poate fi modificat de instrucțiunile ce controlează execuția programului.

Registrul instrucțiune (IR) este un registru pe 32-biți ce păstrează codul instrucțiuni în timpul procesului de decodare a instrucțiunii. Acest registru este folosit de circuitul de decodare de instrucțiuni și nu este accesibil CPU-ului.

Memoria familiei de procesoare TMS320C3x

Pentru ca unitatea centrală de prelucrare să lucreze la performanțele sale maxime, este important să aibă o arhitectură a memoriei și un bus care să țină pasul cu ea. Procesorul poate lucra cu până la patru cuvinte pe ciclu. Asta se reflectă în codul de program in doi operanzi de date ai CPU-ului și datele transferate de DMA. Bus-ul intern poate transfera în paralel toate cele patru cuvinte bizuindu-se pe șapte surse de memorie pntru date.

'C3x folosește pentru accesul la resurse șapte bus-uri interne:

Un bus de date și unul de adrese pentru program; CPU-ul le folosește pentru a păstra o instrucțiune într-un ciclu.

Un bus de date și două de adrese pentru date; În orice ciclu, CPU-ul poate aduce doi operanzi de date deoarece are două bus-uri de adrese și un bus de date ce poate fi accesat de două ori într-un singur ciclu.

Un bus de date și unul de adrese pentru DMA; DMA-ul folosește aceste bus-uri pentru a realiza transferuri direct în memorie în paralel cu operațiile CPU-ului.

Cu aceste bus-uri interne ce servesc DMA-ul și CPU-ul, procesoarele di familia 'C3x pot folosi atât memoria internă cât și cea externă de date sau program. Procesoarele 'C30 și 'C31 au două blocuri cu acces dual de memorie RAM de 1K cuvinte de 32-biți, iar 'C32 are două blocuri cu acces dual de memorie RAM de 256 cuvinte de 32-biți. Această memorie poate furniza până la patru cuvinte de date sau program într-un ciclu. Toate procesoarele din familia 'C3x au memorie cache integrată pentru a mări performanțele sistemului. Bus-ul primar al fiecarui procesor are posibilitatea de a adresa 16M cuvinte. Procesorul 'C30 este prevăzut cu un bus de extensie a memoriei, care are capacitatea de a adresa 8K-cuvinte și care este deseori folosit pentru interfațarea cu dispozitivele periferice.

În figura 3.3 este prezentată diagrama bloc a memoriei familiei 'C3x.

Moduri de adresare a memoriei

Familia de procesoare 'C3x suportă un set de bază de instrucțiuni cu caracter general și un set particular de instrucțiuni aritmetice proprii procesării digitale de semnal și altor aplicații numerice. Există patru grupuri de moduri de adresare. Fiecare grup folosește două sau mai multe din tipurile de adresare existente. În lista următoare sunt prezentate modurile de adresare cu tipurile lor de adresare:

Moduri de adresare pentru instrucțiuni generale:

Modul registru. Operandul este un registru al CPU-ului;

Modul valoare imediată. Operandul este o valoare imediată pe 16-, 24-biți;

Modul direct. Operandul este conținutul unei adrese pe 24-biți formată prin concatenarea a 8-biți din DP și un operand pe 16-biți;

Modul indirect. Un registru auxiliar indică adresa operandului.

Modul de adresare pentru instrucțiuni cu trei operanzi:

Modul registru. Operandul este un registru al CPU-ului;

Modul indirect. Un registru auxiliar indică adresa operandului.

Modul de adresare pentru instrucțiuni paralele:

Modul registru. Operandul este un registru de precizie extinsă;

Modul indirect. Un registru auxiliar indică adresa operandului.

Modul de adresare pentru instrucțiunile de tip branch (salt):

Modul registru. Operandul este un registru al CPU-ului;

Modul relativ-PC. Un deplasament pe 16- sau 24-biți cu semn este adunat la registrul PC.

Fgura 3.3 Schema bloc a memoriei familiei de procesoare 'C3x

Controlerul DMA al familiei de procesoare TMS320C3x

Controlerul DMA transferă date între resursele de memorie. Porturile seriale și ceasurile sunt mapate în memorie, permițând transferuri de către DMA spre sau dinspre aceste periferice. Pentru a realiza transferul, DMA-ul citește locația de memorie pointerizată de registrul de adresare sursă și apoi scrie în locația de memorie pointerizată de registrul de adresare destinație. Adresele sursei sau destinației sunt incrementate sau decrementate după fiecare transfer, depinzând de valoarea registrului de control global. Controlerul DMA realizează transferuri continuu prin bus-ul DMA până când valoare din registrul contor de transfer ajunge la 0, și este transmisă la CPU o întrerupere programabilă.

De exemplu, o aplicție poate folosi DMA-ul pentru a transfera 512 cuvinte dintr-o memorie externă înceată în memoria internă RAM. La terminarea transferului, o întrerupere este trimisă la CPU pentru a procesa și a scoate rezultate, în timp ce DMA-ul va transfera un nou set de 512 cuvinte spre RAM-ul intern. Prin această descărcare a datelor de intrare controlerul DMA ridică performanțele calcului arimetic al CPU-ului, deoarece în acest caz el nu va avea niciodată vre-o stare de așteptare generată de accesul la date, chiar dacă memoria externă cere una sau mai multe astfel de stări.

Procesorul 'C32 oferă programatorului posibilitatea de a programa prioritățile pe bus-ul DMA-ului.

Există trei opțiuni:

CPU-ul are prioritate mereu față de DMA ('C30 și 'C31).

Controlerul DMA are prioritate față de CPU.

CPU-ul și DMA-ul își împart prin rotație prioritățile, cu condiția ca CPU-ul să aibe primul accesul.

Alte caracteristici ale controlerului DMA mai sunt:

Mărirea performanțelor CPU-ului prin eliminarea virtuală a intrarilor și ieșirilor CPU.

Transfer de la memorie la alta.

Două canale cu prioritate configurabilă (pentru 'C32).

Incrementare si decrementare programabilă a adreselor.

În figura 3.4 este prezentată diagrama bloc a controlerului DMA.

Dispozitivele periferice

Toate dispozitivele periferice ale familiei de procesoare 'C3x sunt controlate de regiștri mapați în memorie printr-un bus periferic dedicat. Acest bus periferic este alcătuit dintr-un bus de date pe 32-biți și un bus de adrese de 24-biți. el permite comunicația drectă cu dispozitivele periferice.

Fgura 3.4 Schema bloc a DMA-ului familiei de procesoare 'C3x

Perifericele familiei de procesoare 'C3x include două cesuri și două porturi seriale (doar un port serial și un coprocesor DMA este disponibil la 'C31 și un port serial și două canale DMA la 'C32). În figura 3.5 sunt prezentate împreună cu bus-urile și semnalele lor asociate.

Ceasurile

Cele două dispozitive de ceas sunt numărătoare pe 32-biți cu două moduri de semnalizare și cu clock intern sau extern. Pot semnaliza intern spre procesorul 'C3x sau spre exterior în intervale specificate sau pot contoriza evenimente externe. Fiecare ceas are un pin de intrare-ieșire ce poate fi folosit ca clock spre ceas sau ca semnal de ieșire gestionat de ceas sau chiar ca un pin I/O general.

Porturile seriale

Porturile seriale bidirecționale (două la 'C30 și câte unul la 'C31 și 'C32) sunt total independente. Ele au regiștri de control. Fiecare port serial poate fi configurat pentru transfer de 8-, 16-, 24- sau 32-biți de date pe cuvânt. Ceasul fiecărui port serial poate fi obținut intern sau extern. Intern este prevăzut un divizor de ceas. Pini sunt configurați ca pini generali de intrare-ieșire. Deasemenea porturile seriale pot fi configurate ca ceasuri. Există pentru procesoarele 'C3x un mod special de conectare prin porturile lor seriale care garantează sincronizarea.

Figura 3.5 Dispozitivele periferice

Procesorul TMS320C30

Procesorul 'C30 are un al doilea bus extern de date, două ceasuri și două porturi. Bus-ul de extensie este împărțit intr-un bus de adrese pe 13-biți și unul de date pe 32-biți. Fiecare port serial are două secțiuni independente cu buffere duble de emisie recepție și cu rată maximă de 15Mbps la un ceas de intrare de 60MHz.

Caracteristici ale procesorului TMS320C30:

Timpi pe ciclu instrucțiune de 40-, 50-, 60-ns;

Gama de adresare externă de 16M-cuvinte;

Operații de multiplicare și adunare într-un singur ciclu;

Două porturi seriale;

Două ceasuri;

Memorie ROM internă de 4K-cuvinte;

Compilator ANSI C optimizat;

Controler DMA intern;

Capsulă:

PGA 181-pini

PQFP 208-pini

Figura 3.6 Schema bloc a procesorului TMS320C30

Procesorul TMS320C31

Procesorul 'C31 este cel de-al doilea membru al generației 'C3x iar codul de program este compatibil cu 'C30. 'C31 are același CPU rapid ca și ceilalți membri din generația 'C3x, dar oferă o gamă de periferice diferite.

Față de 'C30 el nu mai are bus-ul de extensie și unul din cele două porturi seriale și a înlocuit memoria ROM internă de 4K-cuvinte pe 32-biți cu o memorie boot-ROM.

Caracteristici ale procesorului TMS320C31:

Timpi pe ciclu instrucțiune de 33-, 40-, 50-, 60-ns;

Gama de adresare externă de 16M-cuvinte;

Operații de multiplicare și adunare într-un singur ciclu;

Un port serial;

Două ceasuri pe 32-biți;

Memorie boot-ROM internă;

Compilator ANSI C optimizat;

Controler DMA intern;

Tensiune de alimentare de 3,3V pentru o frecvențe de ceas de 33-, 40MHz;

Două moduri de consum mic;

Memorie cache de 64-cuvinte;

Capsulă:

PQFP 208-pini

Figura 3.7 Schema bloc a procesorului TMS320C31

Procesorul TMS320C32

Procesorul TMS320C32 este cel mai ieftin procesor în virgulă mobilă oferit de Texas Instruments. Codul de program este compatibil cu 'C30 și 'C31. Are o interfață de memorie flexibilă ce suportă date pe 8-, 16- și 32-biți. În plus el poate stoca programele în memorii de 16 sau 32-biți. Acest lucru conduce la micșorarea considerabilă a prețului sistemului.

Prezintă și el două moduri de consum redus. Unul reduce rata de ceas a procesorului dar cu continuarea execuției, iar celălalt suspendă execuția instructiuni și-l pune în stare de așteptare. Aceste caracteristici sunt valoroase în aplicațiile care necesită puteri mici de consum.

Are același boot-ROM de la 'C31 și două blocuri de memorie internă RAM de 256-cuvinte pe 32-biți.

Caracteristici ale procesorului TMS320C32:

Timpi pe ciclu instrucțiune de 33-, 40-, 50-ns;

Gama de adresare externă de 16M-cuvinte;

Operații de multiplicare și adunare într-un singur ciclu;

Memorie cache de 64-cuvinte;

Două ceasuri pe 32-biți;

Memorie boot-ROM internă;

Compilator ANSI C optimizat;

Două canale DMA cu priorități configurabile;

Două moduri de consum mic;

Capsulă:

PQFP 144-pini

TQFP 144-pini

Figura 3.8 Schema bloc a procesorului TMS320C32

Prezentarea DSK-ului echipat cu procesorul TMS320C31

În acest capitol se face o scurtă prezentare a plăcii de prelucrare de semnal echipată cu procesorul TMS320C31 (TMS320C3x DSP Starter Kit). C3x DSK este o placă ce permite dezvoltarea rapidă, eficientă și cu un cost redus a unor aplicații de timp real. Această placă este echipată cu procesorul TMS320C31, pentru a putea verifica codurile de asamblare dezvoltate pentru diverse aplicații. DSK-ul îți permite să dezvolți propriile sisteme, să-ți creezi softul necesar pe un calculator gazdă, să transferi softul de pe calculator direct în memoria procesorului și să-l rulezi pe DSK, testându-ți astfel aplicațiile. Debuggerul cu care este prevăzută această placă este orientat pe ferestre și permite siplificarea codului dezvoltat și capacitatea de depanare a lui.

Caracteristici de bază ale DSK-ului.

În continuare sunt enumerate caracteristicile principale ale plăcii DSK.

echipată cu procesorul standard în virgulă mobilă TMS320C31

timpul unui ciclu instrucțiune este de 40-ns, adică 50 MFLOPS, 25 MIPS

este echipată cu o interfață standard de port paralel (de imprimantă) care să permită procesorului să comunice cu calculatorul gazdă în vedera transferului de date și de programe

achiziție de date analogice prin intermediul circuitului de interfațare analogică TLC32040:

acest codec este prevăzut cu convertoare A/D și D/A cu rată de eșantionare variabilă și cu o rezoluție de 14 biți la o frecvență de eșantionare de 20 KHz

este prevăzut cu un filtru de reconstrucție trece bandă la ieșire și cu un filtru antialiere la intrare

conectori standard RCA pentru semnalele analogice de intrare și de ieșire care permit conectarea directă la un microfon și un difuzor

conector pentru emulatorul XDS510

conectori de extensie, prin care se permite procesorului să comunice cu plăci secundare.

Arhitectura DSK-ului

În figura 3.9 se prezintă diagrama bloc a plăcii TMS320C3x DSP Starter Kit. Componentele de bază ale DSK-ului sunt procesorul TMS320C31, codecul TLC32040, conectorii de extensie, interfața pentru portul paralel, ceasul sistemului și ledul ce indică starea procesorului. Portul paralel conectează DSK-ul cu un calculator gazdă, permițând procesorului să comunice cu programele de pe PC.

Toate semnalele de la pinii procesorului se găsesc pe conectorii de extensie. Conectorii de extensie includ patru headere de câte 32 de pini, un bloc de jumperi și conectorul de 12 emulatorului XDS510.

Codecul TLC32040 este interfațează procesorul prin portul serial. Blocul de jumperi permite eliminarea codecului de pe portul serial și conectarea acestuia la un DSK fiică (placă de extensie). Placa este prevăzută cu două mufe RCA pentru a intra și a scoate semnalele analogice prelucrate.

Figura 3.9 Schema bloc a TMS320C3x DSK

Introducere în mediul de dezvoltare a codului de programare și în sistemul de depanare (debugger)

DSP Starter Kit (DSK) îți permite să experimentezi și să folosești procesoarele de semnal pentru aplicații de timp real. DSK-ul îți dă libertatea să creezi propriul soft, să-l rulezi direct pe placă și să proiectezi noi configrații hardware.

Debugger-ul și assembler-ul sunt interfețe sofware care te ajută să dezvolți, să testezi și să optimizezi codul de program.

Descrierea assembler-ului

Asamblorul este ușor și simplu de folosit. Pentru DSK s-au implementat doar cele mai importante caracteristici. Dacă se dorește folosirea unui limbaj general de asamblare, atunci va fi nevoie de crearea unui fișier de tip COFF și apoi convertirea lui în limbajul prupriu al DSK-ului.

Caracteristici de bază ale asamlorului:

Rapiditate. Asamblorul DSK-ului diferă de celelalte asmbloare deoarece nu are nevoie de faza de linkare pentru a crea fișierele de ieșire. Oricum, DSK-ul folosește directive speciale pentru a crea codul de asamblare. Rezultatul este crearea de programe de dimensiuni reduse, rapide și ușoare.

Ușor de folosit. Dacă vrei să creezi programe mai lungi, se pot linka mai multe fișiere prin simpla folosire a directivei .include.

Descrierea debuggerului

Debuggerul este ușor de învățat și de folosit. Este prietenos cu o interfață grafică orientată pe ferestre, eliminând timpul necesar memorări unor comenzi complexe. Debugerul poate încărca și executa codul fie pas cu pas, folosind puncte de pauză sau rulare continuă cu posibilitate de stop.

În figura 3.10 este prezentat mediul de lucru al debugerului cu ferestrele corespunzătoare.

Caracteristici de bază ale debugerului

Ușor de folosit, cu o interfață orientată pe ferestre. Debuggerul DSK-ului separă progrmul,datele, și comenzile în zone ușor de manevrat.

Un set puternic de comenzi. Spre deosebire de alte sisteme de acest tip nu te obligă să înveți un set de comenzi stricte. El suportă un set mic și puternic de comenzi.

Mod de comandă flexibil. Există două moduri de a introduce comenzile. Pot fi introduse în linia de comandă sau cu tastele de funcți.

Figura 3.10

Dezvoltarea programelor pentru DSK

În figura 3.11 este prezentată calea care trebuie urmată pentru dezvoltarea programelor.

Asamblorul traduce fișierul sursă din limbajul de asamblare al DSK-ului într-un fișier obiect în cod mașină pentru familia de procesoare TMS320C3x. Sunt înglobate cele mai importante caracteristici de asamblor. Fișierele create de asamblor sunt într-un format special necesar încărcării și rulării directe pe procesor.

Debuggerul. Principalul scop al procesului de proiectare este crearea unor module care pot fi executate pe DSK. Debuggerul poate fi folosit pentru a corecta și rafina codul de program.

Figura 3.11

=== Cap4 ===

Capitolul 4

Implementarea algoritmilor rapizi pentru TFD și THD pe procesorul de semnal TMS320C31

4.1 Programul pentru TFR în bază 2 cu decimare în frecvență

Graful complet al unei transformate de ordinul opt este ilustrat în figura 4.1. În constituirea acestuia s-a ținut seama de relațiile între coeficienții de rotație: , etc. Fiecare pereche de săgeți reprezintă un fluture. Întregul calcul al TFR este efectuat cu fluturi organizați în diferite structuri numite grupuri și etaje. Primul etaj constă într-un grup cu patru fluturi. Al doilea etaj are două grupuri cu doi fluturi, iar ultimul etaj are patru grupuri cu cîte un fluture. Fiecare etaj conține N/2 (patru în acest exemplu) fluturi. Fiecare fluture are două intrări, numite nod primar și nod dual. Spațiul între aceste noduri este numit distanța între nodurile duale. Fiecărui fluture îi este asociat un factor de rotație W, al cărui exponent depinde de grupul și etajul în care este fluturele.

Figura 4.1. Transformata TFR B2F în opt puncte

Din graful transformatei se observă că intrările sunt ordonate secvențial iar ieșirile nu. Aceasta se datorează divizării repetate a ieșirii în sub-secvențe de eșantioane de ordin par și impar. Există și posibilitatea efectuării TFR având intrările și ieșirile în altă ordine dar implementarea acestor algoritmi complică adresarea în programul TFR și pot cere un alt tip de fluture. Reordonarea secvenței de ieșire se face cu un procedeu numit inversarea ordinii biților care va fi descris în acest capitol.

Caracteristicile unei transformate în N puncte cu decimare în frecvență sunt descrise în tabelul următor:

În figura 0.2 este prezentat graful general al unui fluture. Variabilele x și y reprezintă partea reală și, respectiv, partea imaginară a unui eșantion. Factorul de rotație poate fi scris în funcție de partea sa reală și partea sa imaginară astfel:

(4.)

În programul de calcul al transformatei, factorii de rotație sunt inițializați în memorie cu valorile funcțiilor cos și –sin (în loc de +sin). Din acest motiv factorul de rotație este reprezentat în figura 4.2 cu C + j (-S). C reprezintă cosinus și –S reprezintă –sinus.

Figura 4.2. Fluturele pentru TFR în baza 2 cu decimare în timp

Nodul dual (x4 + j y4) este adunat la nodul primar (x0 + j y0), obținându-se (x0’+ j y0’), respectiv scăzut din nodul primar și multiplicat cu factorul de rotație C + j (-S), obținându-se (x4’+ j y4’). Ecuațiile (4.2) până la (4.5) calculează partea reală și partea imaginară a ieșirilor fluturelui.

(4.2)

(4.3)

(4.4)

(4.5)

Ieșirile complexe ale fluturelui devin intrări în etajul următor al TFR. Deoarece fiecare etaj are același număr de fluturi (), numărul de intrări și de ieșiri ale fluturilor rămâne constant de la un etaj la altul. O implementare “in-place” scrie rezultatul de la ieșirea fluturelui în locul intrării corespunzătoare (x0’ suprascrie x0, etc.). De aceea, o astfel de implementare a algoritmului TFR ocupă în final numai memoria destinată intrărilor inițiale.

În figura 0.3 este prezentat algoritmul corespunzător programului de calcul a TFR. Programul este împărțit în două rutine. Prima rutină calculează TFR, iar a doua rutină inversează ordinea biților pentru secvența de ieșire. Sunt create trei module. În modulul principal sunt declarate și inițializate cadrele cu date. Celelalte două module conțin subrutinele pentru calculul TFR și inversarea ordinii biților.

Figura 4.3.Algoritmul corespunzător TFR

Modulul principal

Modulul principal este listat în continuare. În acest modul sunt declarate constantele folosite în calculul TFR, sunt inițializați vectorii pentru datele de intrare și ieșire (reale și imaginare), sunt inițializați vectorii ce conțin valorile pentru cosinus și pentru sinus și sunt declarate varibilele pentru pointerizarea datelor reale, imaginare și a factorilor de rotație.

N .set 256

N2 .set 128

PI .set 3.1415926

PI2N.set 2.0*PI/N

PIN .set PI/N

N este numărul de puncte în care se efectuează TFR. Constantele N2, PI, Pi2N sunt folosite pentru calculul vectorilor ce conțin valorile pentru cosinus și sinus. Pentru inițializarea acestor vectori cât și pentru inițializarea vectorilor care vor conține datele de intrare și de ieșire se folosește directiva specială . loop K astfel:

…..

. endloop

TR

.loop N2

.floatcos(br($-TR,2)*PI2N)

.endloop

TI

.loop N2

.float -sin(br($-TI,2)*PI2N)

.endloop

DR

.loop N

.float 0

.endloop

DI

.loop N

.float 0

.endloop

BFR

.loop N

.float 0

.endloop

BFI

.loop N

.float 0

.endloop

Vectorul TR este inițializat cu 128 de valori pentru cosinus, iar vectorul TI este inițializat cu 128 de valori pentru (-)sinus. Vectorul DR este inițializat cu 0 și va conține 256 de eșantioane reale a semnalului de intrare. Vectorul DI este inițializat cu 0 și va conține 256 de eșantioane imaginare a semnalului de intrare. Vectorii BFR și BFI sunt inițializați cu 0 și vor contine parte reală, respectiv partea imaginară a TFR.

FFTSIZE .word N

TR_ADDR .word TR

TI_ADDR .word TI

DR_ADDR .word DR

DI_ADDR .word DI

BFR_ADDR .word BFR

BFI_ADDR .word BFI

Variabila FFTSIZE va conține numărul de puncte în care este calculată TFR. Variabilele TR_ADDR și TI_ADDR vor conține adresele de început a vectorilor ce conțin factorii de rotație, variabilele DR_ADDR și DI_ADDR vor conține adresele de start a vectorilor ce conțin partea reală, respectiv imaginară a datelor de intrare, iar variabilele BFR_ADDR și BFI_ADDR vor conține adresele de start a vectorilor ce conțin partea reală, respectiv imaginară a datelor de ieșire (TFR).

Modulul în care se calculează TFR

Rutina TFR conține două cicluri. Un ciclu în care calculează fluturii (FLUTURI) și un ciclu în care se controlează gruparea acestor fluturi și caracteristicile fiecărui etaj al TFR (ETAJ_nou).

Ciclul etaje (ETAJ_nou)

Ciclul etajelor controlează caracteristicile grupurilor din TFR. Acestea sunt: numărul de grupuri dintr-un etaj, numărul de fluturi din fiecare grup și spațiul între noduri.

Programul corespunzător ciclului etajelor inițializează AR0, AR1 cu adresele nodurilor de intrare ale primului fluture din primul grup. AR2 și AR3 sunt inițializate cu adresele factorilor de rotație necesari pentru calculul primului fluture. Sunt inițializați, de asemenea, contorul pentru ciclul fluturilor, distanța între nodurile duale așa încât pointerii să poată fi actualizați pentru grupurile noi, contorul pentru numărul de etaje și contorul pentru numărul de grupuri pe etaj.

TFR

ldi 0,IR0

ldi @FFTSIZE,IR1

ETAJ_nou

ldi @FFTSIZE,RC

ldi @FFTSIZE,BK

ldi @DR_ADDR,AR0

ldi @DI_ADDR,AR1

ldi @TR_ADDR,AR2

ldi @TI_ADDR,AR3

lsh -1,RC

lsh -1,BK

subi 1,RC

lsh 1,IR0

ldi 0,R1

cmpi IR0,R1

ldiz 1,IR0

lsh -1,IR1

ldi IR1,R2

ldi IR1,R0

bz TFR_END

Contorul pentru ciclul fluturilor va indica de câte ori se repetă rutina care calculeză un

fluture. Acesta este setat de instrucțiunile ldi @FFTSIZE,RC

lsh -1,RC

Prima instrucțiune încarcă în registrul RC ( registru care specifică de câte ori trebuie să se repete un bloc de instrucțiuni, respectiv rutina de calcul a unui fluture) numărul de puncte în care se calculează TFR, adică N. A doua instrucțiune shifteză la dreapta cu o unitate conținutul acestui registru (operație echivalentă cu o împărțire la doi), deci în final RC va conține numărul de fluturi dintr-un etaj, adică .

Distanța dintre nodurile duale este folosită pentru a adresa datele de intrare, valoarea acestei distanțe este încărcată într-un registru de index (IR1) folosit în rutina de calcul a fluturilor. În cazul algoritmului cu decimare în frecvență valoarea acestui index va fi pentru primul etaj. El va fi actualizat automat la fiecare apel al ciclului ETAJ_nou în concordanță cu etajul la care a ajuns algoritmul de către instrucțiunea lsh -1,IR1. Așa cum sa arătat mai sus registul index IR1 va conține, inițial, o constantă egală cu numărul de puncte în care se calculeză TFR. La fiecare apel al ciclului ETAJ_nou conținutul acestui registru va fi shiftat cu o unitate le dreapta, adică va fi împărțit la 2. Cum numărul de puncte în care se efectuează TFR este de forma , unde M este numărul de etaje, acest registru poate fi folosit și ca un contor care să indice etajul la care s-a ajuns în calculul TFR. El va fi testat la fiecare ciclu, iar în momentul în care va fi 0 (adică s-au parcurs toate etajele TFR) se va chema rutina de inversare a ordini biților (TFR_END).

ldi IR1,R0

bz TFR_END

Numărul de grupuri este contorizat de registrul index IR0. În primul etaj el este inițializat cu 1, adică numărul de grupuri corespunzător acestui etaj (conform TFR cu decimare în frecvență). Registrul index IR0 este folosit, deasemenea și pentru adresarea factorilor de rotație. El este actualizat automat (în funcție de etajul la care a ajuns algoritmul) la fiecare apelare a rutinei ETAJ_nou de intrucțiunile:

lsh 1,IR0

ldi 0,R1

cmpi IR0,R1

ldiz 1,IR0

Numărul de fluturi dint-un grup este contorizat de registrul index IR1. În figura 4.4 este prezentat algoritmul corespunzător acestui etaj.

Figura 4.4 Algoritmul corespunzător ciclului etaje

Ciclul fluturilor (FLUTURI)

Comform figurii 4.5 calculul fluturilor implică o înmulțire complexă, o adunare și o scădere complexe.

Figura 4.5

Așa cum s-a precizat calculul (algoritmul) TFR se face "in place", adică datele de ieșire dintr-un fluture (sau mai precis din întreg etajul) se vor scrie peste datele de intrare, devenind la rândul lor date de intrare în următorul fluture (etaj). Acestă tehnică are avantajul economisirii spațiului de stocare a datelor, deoarece se vor folosi doar două buffere de lungime N (unul pentru partea reală și unul pentru partea imaginară), pentru manipularea datelor de-a lungul algoritmului TFR.

În consecință graful din figura 4.5 se va reduce la următorul set de ecuații:

(4.)

(4.)

(4.)

(4.)

În momentul în care se apelează rutina de calcul a uni fluture (de fapt ciclul ce calculează toți fluturii dintr-un etaj) trebuie să fie cunoscuți următorii parametri:

Adresele locațiilor de memorie care conțin datele de intrare (eșantioanele semnalului de intrare). Pentru simplitate sau pentru a economisi resursele procesorului se încarcă intr-un registru auxiliar AR0 (funcția lui primară este generarea de adrese pe 24-biți; pot fi folosiți pe post de contoare de bucle sau ca regiștri generali pe 32-biți, în acest caz fiind modificați de ALU) adresa locației de memorie în care se află x0 (nodul primar), iar în AR1 adresa lui y0. Pentru adresarea celuilalt nod de intrare în fluture (nodul dual) se folosește distanța dintre nodurile duale care este inițializată în rutina anterioară (ETAJ_nou) cu valoarea corespunzătoare pentru etajul curent. Aceasta este încărcată în registrul index IR0 (acest tip de regiștri conțin valorile folosite de ARAUs pentru a calcula adresele indexate); deasemenea registrul auxiliar AR0 este inițializat tot în rutina anterioară.

Adresele locațiilor de memorie care conțin valorile pentru cosinus și pentru (-)sinus. Acestea sunt încărcate în regiștri auxilari AR2, respectiv AR3.

Distanța dintre nodurile duale.

Numărul de grupuri dintr-un etaj. Acesta este inițializat în rutina anterioară (ETAJ_nou) și este incărcat in registrul index IR0.

Numărul de fluturi dintr-un grup. Acesta este inițializat în rutina anterioară (ETAJ_nou) și este incărcat in registrul index IR1.

Programul care realizează ciclul pentru calculul fluturilor dintr-un etaj este listat în continuare:

rptb FLUTURI {repeta FLUTURI}

ldf *+AR0(IR1),R0 {x4->R0}

||ldf *AR0,R1 {x0->R1}

ldf *+AR1(IR1),R2 {y4->R2}

||ldf *AR1,R3 {y0->R3}

ldf *AR2++(IR0)%,R4 {c->R4}

||ldf *AR3++(IR0)%,R5 {(-s)->R5}

addf3 R0,R1,R6 {x0+x4->R6}

addf3 *+AR1(IR1),R3,R7 {y4+y0->R7}

||stf R6,*AR0 {stocheaza R6 la adresa lui x0}

{stocheaza R7 la adresa lui y0}

subf3 R0,R1,R6 {x0-x4->R6}

stf R7,*AR1 {y0-y4->R7}

subf3 *+AR1(IR1),R3,R7 {(x0-x4)c->R1}

mpyf3 R6,R4,R1 {(y0-y4)(-s)->R3}

mpyf3 R7,R5,R3 {(x0-x4)c -(y0-y4)(-s)->R1}

subf R3,R1 {stocheaza R1 la adresa lui x4}

stf R1,*+AR0(IR1) {AR0+1}

nop *++AR0 {(x0-x4)(-s)->R1}

mpyf3 R6,R5,R1 {(y0-y4)(c)->R3}

mpyf3 R7,R4,R3 {(x0+x4)c +(y0-y4)(-s)->R1}

addf R3,R1 {stocheaza R1 la adresa lui y4}

stf R1,*+AR1(IR1) {AR1+1}

nop *++AR1 {R2-1}

subi 1,R2 {compara 0 cu R2}

cmpi 0,R2 {daca R2=0 IR1->R2}

ldiz IR1,R2 {daca R2 diferit de 0 IR1->R7}

ldinz IR1,R7 {daca R2 diferit de 0 0->R7}

ldinz 0,R7 {AR0+R7}

addi R7,AR0 {AR1+R7}

FLUTUR addi R7,AR1 {no operation}

nop {trece la etajul urmator}

b ETAJ_nou

Pentru optimizarea codului se folosește pentru adresarea factorilor de rotație o tehnică specială numita adresare circulară. Acest lucru elimină din rutina de calcul a fluturilor eventualele variabile suplimentare care ar fi trebuit să fie folosite pentru a indica ce valori de cosinus și de sinus sunt necesare pentru etajul curent.

Mulți algoritmi de prelucrare digitală de semnal, cum ar fi convoluția și corelația, necesită existența unui buffer circular în memorie. La algoritmi de convoluție și de corelație bufferul circular se comportă ca o fereastră glisantă care conține datele cele mai recente. În momentul în care intră un nou eșantion, data cea mai nouă se scrie peste ce veche și se incrementeză automat un pointer care indică către noul eșantion intrat în buffer. Când acest pointer ajunge la sfârșitul bufferului, procesorul îl inițializeză automat cu adresa de început. În figura 4.6a este prezentat un astfel de buffer care poate ține șase eșantioane. În figura 4.6b este prezentată imlementarea acestui buffer in memoria procesorului 'C3x. În figura 4.7a este prezentat acest buffer în care s-au scris trei eșantioane, iar figura 4.8 după ce s-au scris 8 eșantioane.

Figura 4.6

Figura 4.7

Figura 4.8

Pentru implementarea unui buffer circular pe procesorul 'C3x, trebuiesc stisfăcute următoarele condții:

Pot fi implementate mai mult de un buffer circular cu condiția să aibă aceiași lungime;

Specificarea dimensiuni (R) bufferului se face prin încărcarea lungimi sale în registru special BK. Dimensiunea bufferului poate să fie de cel mult 64K.

Adresa de start a bufferului trebuie aliniată astfel încât sa se satisfacă formula:

unde K este numărul de zerouri din LSB-ul adresi de start a vectorului circular.

În figura 4.9 este prezentat un exemplu de alegere a adresei de start pentru buffere de diferite lungimi.

Figura 4.9

Când se utilizează o adresare circulară trebuiesc urmați următorii pași:

Pasul cu care se adreseaza în vector trebuie să fie mai mic sau egal ca dimeniunea bufferului. Valoarea acestui pas trebuie tratată ca un intreg fară semn. Dacă este folosit pentru acest pas un registru index (IR) deasemenea trebuie tratat ca un intreg fară semn.

Prima oară când se adreseaza un buffer circular, registrul auxiliar folosit trebuie să pointerizeze către o adresă din buffer.

Algoritmul pentru adresarea circulară este următorul:

dacă 0≤index+pas≤BK index=index+pas

altfel dacă index+pas<BK index=index+pas-BK

altfel dacă index+pas<0 index=index+pas+BK

În figura 4.10 este prezentat un exemplu de adresare circulară. Presupunem că toate AR-urile sunt pe 4 biți, fie AR0=0000 și BK=0110 (6)

Figura 4.10

Modulul în care în care se realizează inversarea ordinii biților

Inversarea ordinii biților este o tehnică de adresare utilizată în calculul TFR pentru obținerea rezultatelor în ordine secvențială. Toți algoritmii rapizi în baza 2 pot fi calculați fie cu reordonarea secvenței de intrare, fie a secvenței de ieșire. De asemenea factorii de rotație pot fi reordonați funcție de ordinea secvențelor de intrare, respectiv ieșire. Pentru simplitatea programului, în această implementare se reordonează ieșirea, astfel încât factorii de rotație să rămână în ordinea firească.

Un exemplu de inversare a ordinii biților este prezentat mai jos. Inversarea ordinii biților operează asupra numerelor binare care reprezintă poziția unui eșantion într-un cadru. În exemplul dat avem opt eșantioane, deci sunt necesari trei biți pentru reprezentarea celor opt poziții. Prin inversarea ordinii celor trei biți se obține secvența de intrare corespunzătoare unei transformări în baza doi cu decimare în timp, în opt puncte.

Procesoarele din familia ‘C3x pot implementa TFR folosind adresare cu ordinea inverstă a biților. Așa cum am spus în cazul algoritmului de calcul al TFR cu decimare în frecvență detele sunt citite în ordine iar rezultatul este scris în ordine inversată a biților. Pentru a regăsi datele în ordinea corectă ele trebuiesc reordunate în memorie. Acest lucru nu este necesar deoarece CPU-ul poate adresa datele din memorie în ordinea inversată a biților. Pentru ca o adresare de acest tip să fie corectă adresa de bază (de început) a vectorului trebuie să îndeplinească următoarele condiții:

Numărulde zerouri din LSB-ul adresei de început trebuie să indeplinească următoarea condiție:

unde R = lungimea vectorului

K = numărul de zerouri din LSB-ul adresei de start.

Dimensiune vectorului nu poate să fie mai mare de 64K.

Pentru a explica modul în care unitatea centrală de prelucrare realizează acest tip de adresare vom presupune că avem un vector cu TFR de dimensiune . Când datele imaginare și reale sunt stocate în vectori separați ultimi n biți ai LSB-ului trebuie să fie egali cu 0, iar registrul index folosit în acestă adresare (IR0) trebuie să fie inițializat cu valoarea (adică jumătate din dimensiunea TFR). Când datele imaginare și reale sunt stocate în locații de memorie consecutive (R0,I0,R1,I1,R2,I2…), ultimi n+1 biți ai LSB-ului trebuie să fie egali cu 0, iar registrul index folusit în acestă adresare (IR0) trebuie să fie inițializat cu valoarea (dimensiunea TFR). Registrul index IR0 este tratat ca un întreg fără semn.

Pentru a ilustra modul în care se face adresarea cu urdinea inverstă a biților să presupunem că avem un registru auxiliar de 8 biți. Fie AR2 care conține valoarea 0110 000 (96). Aceasta este adresa de start unui vector de lungime 16 care conține datele. Fie IR0 care conține valoare 0000 1000 (8). În figura 4.11 este prezentat modul în care se modifică AR2 și relația între valoarea indexului și ultimi 4 biți ai LSB-ului registrului AR2.

Figura 4.11

Secvența de program care realizează operația de inversare a ordini biților pentru datele de ieșire este listată în continuare.

FFT_END

ldi @FFTSIZE,IR0

ldi @FFTSIZE,RC

ldi @BFR_ADDR,AR0

ldi @BFI_ADDR,AR1

ldi @DR_ADDR,AR2

ldi @DI_ADDR,AR3

lsh -1,IR0

subi 1,RC

rptb BITREV

ldf *AR2,R1

ldf *AR3,R2

stf R1,*AR0++

stf R2,*AR1++

nop *AR2++(IR0)B

BITREV nop *AR3++(IR0)B

În continuare este prezentatată, ca rezultat experimental, transformata Fourier (figura 4.13) în 128 de puncte, a semnalului din figura 4.12.

Figura 4.12. Semnalul în domeniul timp

Figura 4.13. Semnalul în domeniul frecvență

În figurile 4.14 și 4.15 sunt afișate valorile pentru coefiecienții de rotație, mai precis valorile pentru cosinus, respectiv sinus.

Figura 4.14.

Figura 4.15

4.2 Implementarea ferestrei Hamming

Așa cum s-a arătat în capitolul 2, pentru obținerea unei TFR cât mai exacte este de preferat să se pondereze eșantioanele semnalului de intrare cu o fereastră Hamming.

Algoritmul TFR va suferii următoarele modificări:

În modulul principal de declarare a constantelor, a variabilelor și inițializare a datelor se va defini fereastra Hamming. Pentru aceasta se creează un vector (HR) care va conține N valori ale ferestrei, folosind directiva

HR

.loop N

.float 0.54+(1-0.54)*cos((br($-HR,2)+0.5)*PI2N)

.endloop

De asemenea se definește și varibila folosită, pentru adresarea acestui vector în algoritmul TFR. HR_ADDR .word HR

În modulul care calculează TFR se introduce un nou ciclu. În acest ciclu se va realiza ponderarea (înmulțirea) eșantioanelor semnalului cu eșantioanele ferestrei Hamming. Ciclul HAMMING este listat în continuare.

ldi DR_ADDR,AR0

ldi DI_ADDR,AR1

ldi HR_ADDR,AR2

ldi FFTSIZE,RC

subi 1,RC

rptb HAMMING

ldf *AR0,R0

ldf *AR0,R1

ldf *AR0,R2

mpyf R0,R2

|| stf R1,AR0++

mpyf R0,R2

HAMMING || stf R1,AR0++

4.3 Transformata Fourier inversă

Formula pentru transformata Fourier discretă inversă (TFDI) este:

, (4.)

Algoritmii prezentați în acest capitol pentru calculul TFD pot fi folosiți și pentru calculul TFDI cu mici modificări. Se observă că diferențele care apar între formula transformatei directe și cea a transformatei inverse sunt: împărțirea cu și semnul fazei factorilor de rotație .

Pentru factorii de rotație se poate utiliza un alt vector decât cel utilizat la transformata directă, sau se poate folosi același vector, dar citirea valorilor factorilor de rotație ai transformatei inverse să se facă de la sfârșitul la începutul acestuia, avându-se în vedere formula:

(4.)

4.4 Programul pentru THD în bază 2 cu decimare în frecvență

Așa cum s-a arătat în capitolul 1, algoritmul pentru calculul THD B2F utilizează un fluture complex alcătuit dintr-un fluture trigonometric (ca în figura 4.16 a) și un fluture banal, care conține numai adunări și scăderi (figura 0.16 b).

Figura 4.16 a) Fluture trigonometric b) Fluture banal

Unde (4.)

Ecuațiile de calcul al fluturilor prezentați în figura 4.16 sunt:

– fluturi trigonometrici:

(4.)

(4.)

– fluturi banali:

(4.)

(4.)

Graful complet al unei transformate de ordinul șaisprezece este ilustrat în figura 4.17. Se observă că fluturii banali sunt distribuiți similar ca în TFD în baza 2 cu decimare în frecvență, ceea ce permite utilizarea programului pentru TFD, cu mici modificări, și în cazul transformatei Hartley.

Figura 4.17. Transformata THD B2F în 16 puncte

Trebuie observat că, deoarece transformata Hartley discretă este o transformare reală, pentru date reale, toate calculele efectuate în fluturii specifici THD sunt pe mulțimea numerelor reale, ceea ce simplifică mult complexitatea aritmetică și memoria ocupată de date.

Modificările aduse programului TFD pentru efectuarea transformatei Hartley sunt:

Calcule reale, variabile reale (fără parte imaginară);

Toți fluturii din TFD devin fluturi banali;

Etajele 3 și 4 ale algoritmului au structuri identice cu cele din TFD;

Se calculează mai întâi fluturi banali și apoi fluturii trigonometrici.

Trei module sunt create. În modulul principal sunt declarate și inițializate cadrele cu date. Celelalte două module conțin subrutinele pentru calculul THD și inversarea ordinii biților.

Modulul principal

Modulul principal este listat în continuare. În acest modul sunt declarate constantele folosite în calculul THD, sunt inițializați vectorii pentru datele de intrare și ieșire, sunt inițializați vectorii ce conțin valorile pentru cosinus și pentru sinus și sunt declarate varibilele pentru pointerizarea datelor și a factorilor de rotație.

N .set 256

N4 .set 64

PI .set 3.1415926

PI2N.set 2.0*PI/N

PIN .set PI/N

N este numărul de puncte în care se efectuează THD. Constantele N4, PI, Pi2N sunt folosite pentru calculul vectorilor ce conțin valorile pentru cosinus și sinus. Pentru inițializarea acestor vectori cât și pentru inițializarea vectorilor care vor conține datele de intrare și de ieșire se folosește directiva specială .loop

… (expresia ce se dorește a fi evaluată)

.endloop

DR

.loop N

.float 0.0

.endloop

BF

.loop N

.float 0.0

.endloop

TR

.loop N4

.float cos(br($-TR,2)*PI2N)

.endloop

TI

.loop N4

.float sin(br($-TI,2)*PI2N)

.endloop

Vectorul TR este inițializat cu N/4 valori pentru cosinus, iar vectorul TI este inițializat cu N/4 valori pentru sinus. Vectorul DR este inițializat cu 0 și va conține 256 de eșantioane reale a semnalului de intrare. Vectorii BF este inițializat cu 0 și va conține rezultatul THD.

THDSIZE .word N

TR_ADDR .word TR

TI_ADDR .word TI

DR_ADDR .word DR

BF_ADDR .word BFR

Variabila THDSIZE va conține numărul de puncte în care este calculată TFR. Variabilele TR_ADDR și TI_ADDR vor conține adresele de început a vectorilor cu factorii de rotație, variabila DR_ADDR va conține adresa de start a vectorului cu datele de intrare, iar variabila BF_ADDR va conține adresa de start a vectorului cu rezultatul TFR.

Figura 4.18 Algoritmul corespunzător THD

Modulul THD B2F

Rutina de calcul al THD conține două cicluri, la fel ca la TFR. Modificările apar în ciclul fluturilor, care va conține, separat, calculul fluturilor trigonometrici și calculul fluturilor banali așa cum se arată în figura 4.18.

Ciclul etajelor (ETAJ_nou)

Ciclul etajelor controlează caracteristicile etajelor din THD. Acestea sunt: numărul de grupuri dintr-un etaj, numărul de fluturi din fiecare grup și distanța dintre noduri.

Programul corespunzător ciclului etajelor inițializează AR0 cu adresele nodurilor de intrare ale primului fluture din primul grup. Sunt inițializați, de asemenea, contorul pentru ciclul fluturilor banali, distanța între nodurile duale așa încât pointerii să poată fi actualizați pentru grupurile noi, contorul pentru numărul de etaje și contorul pentru numărul de grupuri pe etaj.

THD

ldi @THDSIZE,IR1 {N->IR1}

ldi 1,IR0 {1->IR1}

ETAJ_nou {eticheta ciclu etaje}

ldi @THDSIZE,RC {N->RC}

ldi @DR_ADDR,AR0 {adresa inceput vector date->AR0 }

lsh -1,RC {N/2->RC}

subi 1,RC {RC-1}

lsh -1,IR1 {N/2->IR1}

ldi IR1,R6 {IR1->R6}

bz THD_END {daca R6=0 cheama THD_END}

Ciclul fluturilor banali (FLT banali)

Conform ecuațiilor (0.12) și (0.13), acest tip de fluturi conțin o adunare și o scădere. Secvența de program corespunzătoare acestui ciclu este listată mai jos.

rptb FLT_banali {repeta FLT_banali}

addf3 *+AR0(IR1),*AR0,R0 {x0+x4->R0}

subf3 *+AR0(IR1),*AR0,R1 {x0-x4->R1}

stf R1,*+AR0(IR1) {stocheaza R1 la adresa lui x4}

stf R0,*AR0++ {stocheaza R0 la adresa lui x0}

subi 1,R6 {R6-1}

ldiz IR1,R7 {daca R6=0 IR1->R7}

ldiz IR1,R6 {daca R6=0 IR1->R6}

ldinz 0,R7 {daca R6 diferit de 0 0->R7}

FLT_banali addi R7,AR0 {AR0+R7}

cmpi 2,IR1 {compara 2 cu IR1}

ble New_Stg {daca <= salt la etajul urmator}

Distribuția fluturilor banali este ca și în cazul TFR, de aceea numărul de fluturi și distanța între nodurile duale sunt inițializate similar. După ce s-au parcurs toți fluturii banali din etaj se testează dacă etajul curent are și fluturi trigonometrici. Această testare este realizată de instucțiunile:

cmpi 2,IR1

ble New_Stg

Registru index IR1 (inițializat in ciclul ETAJ_nou) conține numărul etajului la care a ajuns algoritmul. Dacă valoarea din IR1 este mai mică ca M-2 (M este numărul de etaje a THD), atunci însemnă că etajul curent conține și fluturi trigonometrici deci se va apela ciclul de calcul al acestora. Dacă însă este ca M–2, atunci se trece la următorul etaj.

Ciclul fluturilor trigonometrici (FLT_trg)

Ecuațiile (0.10) și (0.11) descriu calculele care apar în acest tip de fluturi. Trebuie efectuate două înmulțiri reale, o adunare și o scădere. Calculul fluturilor trigonometrici apare începând cu etajul 1 al algoritmului până la etajul M-2, pentru fiecare grup din etaj, după calculul fluturilor banali. Secvența de program care calculează acești fluturi este listată în continuare.

ldi @DR_ADDR,AR0 {adresa inceput vector date->AR0}

ldi @TR_ADDR,AR1 {adresa inceput cos->AR1}

ldi @TI_ADDR,AR2 {adresa inceput sin->AR1}

ldi IR1,R0 {IR0->R0}

lsh -1,R0 {R0/2->R0}

subi 1,R0 {R0-1}

ldi R0,R6 {R0->R6}

mpyi3 IR0,R0,RC {R0*IR0->RC}

subi 1,RC {RC-1}

addi3 AR0,IR1,AR3 {AR0+IR1->AR3}

addi3 AR3,IR1,AR4 {AR3+IR1->AR4}

rptb FLT_trg {repeta FLT_trg}

ldf *++AR3,R3 {x9->R3}

|| ldf *–AR4,R4 {x15->R4}

mpyf3 R3,*++AR1(IR0),R1 {x9*cos1->R1}

mpyf3 R4,*++AR2(IR0),R2 {x15*sin1->R2}

mpyf *AR2,R3 {x9*sin1->R3}

mpyf *AR1,R4 {x15*cos1->R4}

addf R1,R2 {x9*cos1+x15*sin1->R2}

subf R4,R3 {x9*sin1-x15*cos1->R3}

stf R2,*AR3 {stocheaza R2 la adresa lui x9}

|| stf R3,*AR4 {stocheaza R3 la adresa lui x15}

subi 1,R6 {R6-1}

callz Init {daca R6=0 cheama Init}

FLT_trg nop

lsh 1,IR0 {IR0/2->IR0}

b ETAJ_nou {salt la urmatorul etaj}

Regiștri auxiliari AR0 și AR1 sunt inițializați cu adresle de început a vectorilor ce conțin valorile de cosinus și respectiv sinus. Registrul AR2 inițializat cu adresa de început a vectorului ce conține datele intrare.

Distanța între nodurile duale din acești fluturi nu mai rămâne constantă. Din graful de descompunere a transformatei de ordin N în transformate de ordin , se observă că această distanță este , unde . În programul de calcul al fluturelui aceasta este contorizată de registrul index IR0. La fiecare scriere în memorie a rezultatului din nodul dual, adresa acestuia este decrementată, în timp ce adresa nodului primar este incrementată (la scrierea la adresa acestuia).

ldf *++AR3,R3

|| ldf *–AR4,R4

După ce s-au parcurs toți fluturi trigonometrici dintr-un grup se apeleză o rutină de reinițializare pentru grupul următor (Init). Acest lucru este făcut de instrucțiunea

callz Init.Acestă rutină este listată în continuare.

INIT ldi R0,R6 {R0->R6}

addi IR1,AR4 {AR4+IR1}

addi3 R0,AR4,AR3 {AR4+R0->AR3}

addi3 AR3,IR1,AR4 {AR3+IR1->AR4}

ldi @TR_ADDR,AR1 {adresa inceput cos->AR1}

ldi @TI_ADDR,AR2 {adresa inceput sin->AR2}

rets {intoarcete la intrerupere}

Modulul în care în care se realizează inversarea ordinii biților

Așa cum am spus în cazul algoritmului de calcul al THD cu decimare în frecvență detele sunt citite în ordine iar rezultatul este scris în ordine inversată a biților. Pentru a regăsi datele în ordinea corectă ele trebuiesc reordonate în memorie. Acest lucru nu este necesar deoarece CPU-ul poate adresa datele din memorie în ordinea inversată a biților.

Secvența de program care realizează operația de inversare a ordini biților pentru datele de ieșire este listată în continuare.

THD_END ldi @SIZE,IR0

ldi @SIZE,RC

ldi @BF_ADDR,AR0

ldi @DR_ADDR,AR1

lsh -1,IR0

subi 1,RC

rptb BITREV

ldf *AR1++(IR0)B,R0

BITREV stf R0,*AR0++

rets

4.5 Transformata Hartley inversă

Formula pentru transformata Hartley discretă inversă (THDI) este:

, (4.)

unde (4.)

Se observă că, exceptând factorul , transformata directă și transformata inversă au expresii identice, ceea ce permite utilizarea aceleiași subrutine pentru revenirea în domeniul timp. Împărțirea cu se poate realiza printr-o deplasare la dreapta cu biți a datelor (avându-se în vedere că N este o putere a lui 2).

=== Cap5 ===

Capitolul 5

Implementarea în timp real a TFR

Implementarea algoritmilor prezentați în capitolul anterior a fost realizată atât în configurație de evaluare a algoritmilor cât și în configurație de sisteme de timp real. Implementările de timp real corespunzătoare sunt prezentate în anexă. Trebuiesc însă făcute câteva specificații cu privire la codurile programelor de implementare, și anume cu privire la inițializarea circuitului de interfațare analogică (TLC32040), la modalitatea de sincronizare a intrării și ieșirii și modalitatea de folosire a lor corecte, a setării frecvențelor de eșantionare de conversie A/D și D/A, a folosirii filtrelor de antialiere, de adresare a memoriei și deloc de neglijat a optimizării algoritmilor.

Astfel, primul lucru care trebuie stabilit este valoarea frecvențelor de eșantionare de conversie A/D și D/A cu care se face achiziția datelor de la intrare și reconstrucția lor la ieșire. Pentru a controla aceste frecvențe există mai mulți regiștri speciali cu ajutorul cărora se setează AIC-ul (analog circuit interface). Regiștri TA și TB controlează intrarea pe când regiștri RA și RB controlează ieșirea. Valoarea încărcată în ei stabilește valoarea frecvențelor de eșantionare respective. Circuitul de interfață trebuie să comunice prin serială cu procesorul și de aceea este necesară o sincronizare a celor două dispozitive. Un tact primar de sincronizare furnizat de procesor este folosit pentru derivarea tuturor frecvențelor secundare din AIC. Acest tact primar poate fi și el setat prin stabilirea unuia din cele două moduri disponibile: primul în care MCLK=12,5 MHz sau al doile pentru care MCLK=6,25 MHz. Folosind formula

se poate stabili frecvența de eșantionare la intrare respectiv la ieșire.

Inițializarea modului de lucru a DSK-ului se face într-o rutină specială (START), ce este executată o singură dată la începutul oricărui program. Memoria ocupată de această rutină poate fi rescrisă și utilizată de programul principal. Ea resetează și inițializează procesorul și intrerfața analogică.

Schimbul de date pe serială între codec și procesor se face prin deservirea unor întreruperi de recepție sau emisie semnalizate procesorului, de umplerea bufferelor interfeței analogice. Apariția acestor întreruperi este așteptată de procesor în bucla “main” principală. La apariția unei astfel de întreruperi este chemată subrutina respectivă (emisie sau recepție). Drept urmare programul va fi compus din: rutina specială de inițializare (START), bucla “main” principală în sunt așteptate cererile de întrerupere, subrutina de deservire a întreruperilor de recepție (recepționare a eșantioanelor semnalului de intrare), subrutina de deservire a întreruperilor de emisie și blocul de program ce implementează algoritmul dorit.

=== Cap6 ===

Capitolul 6

Concluzii și observații

Procesoarele TMS320C3x sunt primele procesoare din generația TMS320 care au aritmetica în virgulă mobilă. Multe din caracteristicile lor, din punct de vedere al arhitecturii, permit implementări foarte eficiente de algoritmi de timp real.

Cele mai importante caracteristici ale procesorului ‘C31 sunt viteza mare de lucru (50MHz) și aritmetica în virgulă mobilă. Viteza mare fac implementările aplicațiilor de timp real mai ușoare decât la procesoarele anterioare, chiar dacă nu se iau în considerare și alte avantaje arhitecturale. Fiecare instrucțiune se execută într-un singur ciclu cu restricții de tip pipeline. Procesorul rezolvă orice conflict potențial, avantajul structurii pipeline fiind observată doar în cazul codurilor de program optimizate pentru viteză mare.

Capacitatea de aritmetică în virgulă mobilă îi permite să folosească numere cu o gamă dinamică înaltă fără a duce la depășiri (în algoritmi TFR valorile calculate tind să crească de la un etaj la altul). Toate considerațiile de scalare necesare procesoarelor în virgulă fixă nu mai sunt acum necesare, iar operațiile aritmetice în virgulă mobilă au aceeași viteză ca cele în virgulă fixă, nefiind sacrificată nici o caracteristică de performanță.

Procesorul este prevăzut cu opt regiștri de precizie extinsă R0-R7, care pot fi folosiți ca regiștri acumulatori de uz generali, opt regițtri auxiliari AR0-AR7, pentru adresare și aritmetica numerelor întregi. Pentru multe aplicații acești regiștri sunt suficienți pentru stocarea temporară a valorilor, și nu este necesară folosirea locațiilor de memorie. Acesta este cazul algoritmului pentru TFR prezentat, unde nu este necesară nici o locație de memorie suplimentară, în afara celor ocupate de datele de intrare și ieșire. Folsirea acestor regiștri în calculele aritmetice duce la creșterea eficienței de programare. Cei doi regiștri de index IR0-IR1 sunt folosiți pentu indexarea adreselor, făcând simplă accesare factorilor de rotație dintr-un fluture.

O altă caracteristică importantă în algoritmi este capacitatea de repetare a unui bloc de instrucțiuni (rptb). Folosind această instrucțiune se obține același efect ca și cum blocul de instrucțiuni ar fi scris de un număr de ori (conținutul registrului RC+1), fără a plăti în vre-un fel saltul de întoarcere, ba chiar se ocupă mai puțină memorie de program. În acest mod, ciclul fluturilor TFR pot fi implementați sub forma “bloc-repeat”, salvând din timpul de execuție și pastrând claritate programului și spațiul de memorie.

Modul de adresare cu ordinea inversată a biților este folosit pentru eliminarea unei eventuale proceduri de ordonare a datelor (la intrare sau ieșire).

În continoare sunt prezentate câteva concluzii cu privire la complexitatea aritmetică a algoritmilor implementați.

Evaluarea complexității aritmetice pentru TFR cu date complexe

Fluturele specific TFR cu decimare în timp în baza 2 necesită calculul unei înmulțiri complexe și a două adunări complexe (figura6.1).

Figura.6.1. Fluturele pentru TFR în baza 2 cu decimare în frecvență

Rezultă un număr de 4 înmulțiri reale și 2 adunări reale corespunzător unei înmulțiri complexe. Ecuațiile corespunzătoare ieșirilor fluturelui sunt:

(6.1)

(6.2)

(6.3)

(6.4)

Pentru tot fluturele rezultă 4 înmulțiri reale și 6 adunări reale.

Pentru procesorul de semnal TMS320C3x această metodă este cea mai avantajoasă. Aceasta rezultă din specificul unității aritmetice de înmulțire care permite efectuarea unei înmulțiri și adunarea rezultatului la rezultatul anterior în același ciclu mașină. Studiind ecuațiile (6.1) la (6.4) se observă că pot fi efectuate succesiv următoarele calcule:

addf3 R0,R1,R6

addf R3,R7

|| stf R6,*AR0

subf3 R0,R1,R6

stf R7,*AR1

subf3 *+AR1(IR1),R3,R7

mpyf3 R6,R4,R1

mpyf3 R7,R5,R3

subf R3,R1

stf R1,*+AR0(IR1)

nop *++AR0

mpyf3 R6,R5,R1

mpyf3 R7,R4,R3

addf R3,R1

stf R1,*+AR1(IR1)

nop *++AR1

Rezultă numai 15 cicluri mașină pentru calculele efective. La acestea se adaugă inițializările fiecăror operanzi. Deoarece procesorul TMS320C3x permite efectuarea citirii/scrieri în memorie și a unei operații aritmetice în același ciclu, inițializările operanzilor pot fi făcute, în mare măsură, simultan cu calculele.

Putem evalua întreaga complexitate aritmetică a TFR dacă luăm în considerare următoarele fapte:

numărul total de etaje pentru o transformată în N puncte este: ;

numărul de fluturi pe etaj este același ();

există fluturi banali pentru care și nu mai este necesară înmulțirea complexă.

Numărul total maxim de înmulțiri reale (NMR) și de adunări reale (NAR) este pentru varianta 4 cu 6:

(6.5)

(6.6)

Dacă se elimină toate operațiile banale, în cazul ideal, rezultă următoarele formule pentru calculul complexității aritmetice minime:

(6.7)

(6.8)

Un tabel comparativ este prezentat mai jos:

Totuși, eliminarea tuturor operațiilor banale conduce la o complicare a programului (instrucțiuni de decizie, inițializări suplimentare) deci o creștere a timpului de execuție.

O optimizare a programului se poate face avându-se în vedere că ultimul etaj al TFR conține numai fluturi banali și nu este necesară împărțirea în grupuri deoarece există un singur fluture pe grup. De asemenea, primul etaj conține un singur grup de fluturi și nu mai sunt necesare unele inițializări.

În continuare este prezentat un tabel comparativ cu timpii de execuție ai algoritmului TFR pe procesorul TMS320C3x măsurați cu simulatorul (dezasamblorul) inclus în setul de programe. Testarea a fost efectuată pentru un program optimizat așa cum s-a arătat mai sus. Timpul de execuție este calculat avându-se în vedere că o instrucțiune durează 40ns.

Evaluarea complexității aritmetice pentru TFR cu date reale

a. Algoritmi pentru două secvențe reale

Pornind de la evaluarea făcută pentru algoritmul pentru date complexe, și având în vedere și rezultatele din capitolul 1.3 b, se observă că în cazul utilizării algoritmului TFR pentru două secvențe reale, este necesară separarea rezultatelor din secvența de ieșire. Complexitatea aritmetică crește prin efectuarea a adunări suplimentare pentru separarea transformatelor celor două secvențe. Deoarece se calculează două transformate simultan, este normal ca să împărțim cu doi formulele complexității aritmetice și, având în vedere și adunările suplimentare, rezultă pentru numărul maxim de operații:

(6.9)

(6.10)

Iar, prin eliminarea cazurilor banale, numărul minim de operații va fi:

(6.11)

(6.12)

Programul care implementează acest algoritm va avea suplimentar un ciclu de separare a transformatelor, în care pe lângă adunările respective, vor mai fi necesare unele inițializări. Totuși, timpul de execuție al programului nu va crește semnificativ.

b. Algoritmi pentru o singură secvență reală

În evaluarea complexității aritmetice trebuie avut în vedere că într-un etaj există:

un fluture de tipul caracterizat prin 2 adunări;

un fluture de tipul care nu necesită nici o operație;

un fluture de tipul care necesită 2 înmulțiri și 6 adunări;

fluturi complecși cu 4 înmulțiri și 6 adunări;

Rezultă următoarele ecuații de calcul a complexității aritmetice:

(6.13)

(6.14)

Aceste formule corespund complexității aritmetice minime (obținută prin deselectarea operațiilor banale). Programul este însă cel mai complex dintre metodele prezentate, datorită nesimetriei distribuției fluturilor și a secvenței de ieșire care nu este ordonată secvențial (parte reală, parte imaginară).

Evaluarea complexității aritmetice pentru THR

Într-un etaj de dimensiune N se găsesc fluturi trigonometrici cu structura din figura 6.2 a. care conțin 4 înmulțiri și 2 adunări și fluturi banali ca în figura 6.2 b. care au numai 2 adunări.

Figura 6.2 a) Fluture trigonometric b) Fluture banal

Rezultă că într-un asemenea etaj vor trebui efectuate

înmulțiri reale

adunări reale.

Rezultă următoarele ecuații de calcul a complexității aritmetice:

(6.15)

(6.16)

Se observă că numărul de înmulțiri este același ca în cazul algoritmului TFD pentru date reale, în baza 2 cu decimare în timp, dar numărul de adunări reale este puțin mai mare (cu ).

Din punct de vedere al eficienței programului pentru transformata Hartley, calculele care sunt efectuate pentru fluturii trigonometrici, respectiv fluturii banali sunt prezentate mai jos. Trebuie avut în vedere că se pot efectua două înmulțiri și o adunare în două cicluri mașină, deci pentru fluturii trigonometrici succesiunea operațiilor este:

mpyf3 R3,*++AR1(IR0),R1

mpyf3 R4,*++AR2(IR0),R2

mpyf *AR2,R3

mpyf *AR1,R4

|| addf R1,R2

subf R4,R3

Iar pentru fluturii banali sunt necesare două adunări:

addf3 *+AR0(IR1),*AR0,R0

subf3 *+AR0(IR1),*AR0,R1

La aceste operații se adaugă inițializările fiecăror operanzi și eventualele scalări sau testări ale creșterii biților. Un tabel care arată numărul total de cicluri mașină pentru calculul fluturilor este prezentat mai jos:

O optimizare a programului se poate face avându-se în vedere că ultimele două etaje ale THR conțin numai fluturi banali și nu sunt necesare inițializările pentru fluturii trigonometrici.

Similar Posts