Documente Academic
Documente Profesional
Documente Cultură
calcula TFD direct, este nevoie de mulţi coeficienţi complecşi. Pentru a calcula TFD în N În general, convoluţia a două semnale este dată de
2
puncte, sunt necesari N coeficienţi complecşi. Pentru calculul într-un singur punct din cele ∞
−j
2 kπ Spre deosebire, un filtru FIR sau IIR calculează o nouă ieşire pentru fiecare
1 − e N z −1 eşantion de intrare. Calculul recursiv de ordinul 2 al TFD prin algoritmul Goertzel dă o
H ( z) =
2kπ −1
1 − 2 cos( ) z + z −2 nouă ieşire y(n) pentru fiecare eşantion de intrare x(n). Rezultatul TFD, X(k), este
N
echivalent cu y(n) când n = N .
Cum celelalte valori ale y(n), pentru n ≠ N , nu contribuie în nici un fel la
7.10.3 Implementarea algoritmului Goertzel rezultatul final X(k), nu este nevoie să calculăm y(n) până când n nu devine egal cu N.
Aceasta înseamnă că algoritmul Goertzel este echivalent funcţional cu un filtru IIR de ordin
Algoritmul va fi deci implementat sub forma unui filtru cu răspuns infinit la impuls doi, cu excepţia faptului că o nouă ieşire a filtrului este generată doar după ce au ajuns, au
(IIR) care arată ca în figură: fost prelucrate n eşantioane ale semnalului analizat.
Calculele privind realizarea algoritmului Goertzel pot fi împărţite în două etape:
prima implică calculele legate de calea de reacţie iar cea de a doua calculele privind calea
directă şi obţinerea X(k), aşa cum este arătat în figura 3.
Calea de reacţie x(n)
+
v(n)
Calea de reacţie este urmată de toate eşantioanele semnalului de intrare. De-a lungul
acestei căi, reprezentată separat în figura 4 sunt stocate în memorie sau în registre două z-1
valori intermediare: v(n-1) şi v(n-2). Acestea sunt calculate după cum urmează: v(n-1)
v(n) = x(n) + 2 cos(2πk / N )v(n − 1) − v(n − 1)
z-1
v(n-1) şi v(n-2) sunt două elemente de memorie pentru stocarea v(n) iar x(n) este 2cos(2πk/N)
eşantionul curent de intrare. x(n), v(n-1) şi v(n-2) sunt citite din memorie şi folosite la v(n-2)
calculul unui nou v(n). Acest nou v(n) este stocat în locul vechiului v(n) iar acel vechi v(n)
este stocat în locul lui v(n-1).
-1
Prin deplasări succesive se actualizează v(n-1) şi v(n-2) pentru fiecare nou eşantion
de intrare. Figura 4. Calea de reacţie
for(n=0;n<N;n++)
printf("%f\t%f\t\n",Xreal[n],Ximag[n]);
}
for(n=0;n<N;n++)
v[n]=v1[n]=v2[n]=0;