Sunteți pe pagina 1din 4

irelevant n aplicaiile de detecie a DTMF.

Avantajul acestei modificri este acela c

7.10 Algoritmul Goertzel


7.10.1 Utilizare i avantaje
O tehnic eficient de a calcula rezultatele doar pentru unele din cele N frecvene este algoritmul Goertzel, care calculeaz rezultatul pentru o singur component spectral, la fiecare N eantioane ale semnalului analizat. Algoritmul Goertzel este utilizat n decodarea i detecia DTMF (dual-tone multifrequency) precum i la realizarea modemurilor ce utilizeaz PSK (phase-shift keying) sau FSK (frequency shift keying). Algoritmul Goertzel poate fi folosit i la calculul TFD. A decoda un semnal DTMF nseamn a extrage cele dou tonuri (frecvene) prezente n semnal i a determina, tiind valorile lor, numrul sau caracterul codat de acestea. Detecia tonurilor DTMF se face foarte uor transpunnd semnalul ce le conine din domeniul timp n domeniul frecven prin transformare Fourier. Transformata Fourier Rapid calculeaz eficient rezultatele pentru toate cele N puncte ale Transformatei Fourier Discrete. Pe de alt parte, TFD poate fi calculat direct pentru a obine rezultatele n doar cteva puncte. n mod tipic, dac se cer a fi calculate mai mult de log2N din cele N puncte, este mai rapid s se calculeze rezultatele pentru toate cele N puncte, aplicnd TFR i nelund n seam punctele nedorite. Dac este nevoie doar de cteva puncte, TFD este mai rapid de aplicat dect TFR. TFD este mai rapid n a gsi doar 8 frecvene (tonurile DTMF sunt compuse din 2 frecvene alese dintr-un set standard de 8) n banda ntregului canal telefonic. Algoritmul Goertzel evalueaz TFD cu o economie de calcule i timp. Pentru a calcula TFD direct, este nevoie de muli coeficieni compleci. Pentru a calcula TFD n N puncte, sunt necesari N coeficieni compleci. Pentru calculul ntr-un singur punct din cele N trebuie calculai N coeficieni compleci. Spre deosebire de TFD, algoritmul Goertzel utilizeaz doar doi coeficieni (unul complex i unul real), pentru calculul ntr-un singur punct. Algoritmul Goertzel calculeaz rezultate complexe, aa cum face i TFD dar algoritmul Goertzel poate fi modificat algebric astfel nct rezultatul su s fie ptratul amplitudinii componentei spectrale respective (o valoare real). Aceast modificare terge informaia de faz care este
2

algoritmul permite detecia unui ton folosind doar un coeficient real. Un alt avantaj al algoritmului Goertzel, pe lng c se reduce astfel numrul coeficienilor folosii, este acela c algoritmul poate prelucra fiecare eantion pe msur ce acesta sosete, eliminnd asfel nevoia utilizrii unui buffer de memorie n care s se stocheze N eantioane, ca n cazul TFD. n plus, nu este necesar nici un mecanism bit reversed de adresare a memoriei, ca n cazul FFT.

7.10.2 Deducerea algoritmului


Algoritmul Goertzel exploateaz proprietatea de periodicitate a coeficienilor de rotaie {w N } i permite exprimarea formulei de definiie a TFD ca pe o filtrare liniar.
k

Deoarece
w NkN = e j 2 ( kN ) N

= e j 2k = 1
2 N

putem multiplica relaia de definiie a TFD:

X N (k ) =
cu acest factor i obinem:

N 1 n =0

nk x(n) wN , k = 0...N 1, wN = e

X N (k ) = w kN X N (k ) = w kN
Fie

N 1 n =0

nk x ( n) w N

N 1 n =0

x(n) wNk ( N n)

y k ( m) =

N 1 n =0

x(n) wNk ( mn)

= x(m) * w Nkm u (m)

n general, convoluia a dou semnale este dat de

( x1 * x 2 )(n) =
Pentru m = N obinem:

k =

x1 (k ) x2 (n k )

yk ( N ) =

N 1 n=0

x(n) wNk ( N n) = X (k )

deci este evident c yk (N ) este convoluia ntre o secven de intrare x(n) de lungime N cu un filtru cu funcia pondere
wNkm u (m)

x(n)

v(n) z-1 v(n-1) z-1 v(n-2)

y(n)

hk (n) =

Ieirea acestui filtru la m = N d valoarea calculat de TFD pe frecvena k.

y(N)=X(k) -e-j2k/N

X (k ) = y k ( N ) m= N
Pentru orice alt moment m N , ieirea filtrului, y (m) , nu este egal cu X (k ) . Filtrul cu funcia rspuns la impuls
hk (n) = wNkm u (m)

2cos(2k/N)

are funcia de transfer

-1

H k ( z) = H k ( z) =
1 ( w Nk z 1 ) N 1 w Nk z 1

N 1 m =0

wNkm u (m) z m 1 w NkN z N

calea de reacie (feedback)

calea direct (feedforward)

w Nk z 1 j
2 k N

1 e j 2 k z N 1 e
2 k j N

Figura 3. Implementarea algoritmului Goertzel ca filtru IIR Rezultatul TFD i TFR este un vector de dimensiune N ce conine valorile complexe (amplitudine i faz) ale componentelor spectrale ale unui vector de intrare tot de dimensiune N. Transformarea este ndeplinit prin procesarea mai nti a unui

z 1

1 1 e
2 k j N

1 e (1 e
2 k j N

z 1 z 1 )

z 1

2 k j z 1 )(1 e N

numr de N eantioane de intrare, apoi calculnd rezultatele de ieire, adic cele N componente spectrale. Spre deosebire, un filtru FIR sau IIR calculeaz o nou ieire pentru fiecare eantion de intrare. Calculul recursiv de ordinul 2 al TFD prin algoritmul Goertzel d o nou ieire y(n) pentru fiecare eantion de intrare x(n). Rezultatul TFD, X(k), este echivalent cu y(n) cnd n = N . Cum celelalte valori ale y(n), pentru n N , nu contribuie n nici un fel la rezultatul final X(k), nu este nevoie s calculm y(n) pn cnd n nu devine egal cu N. Aceasta nseamn c algoritmul Goertzel este echivalent funcional cu un filtru IIR de ordin doi, cu excepia faptului c o nou ieire a filtrului este generat doar dup ce au ajuns, au fost prelucrate n eantioane ale semnalului analizat. Calculele privind realizarea algoritmului Goertzel pot fi mprite n dou etape: prima implic calculele legate de calea de reacie iar cea de a doua calculele privind calea direct i obinerea X(k), aa cum este artat n figura 3.

Deci

1 e N z 1 H ( z) = 2k 1 1 2 cos( ) z + z 2 N

2 k

7.10.3 Implementarea algoritmului Goertzel


Algoritmul va fi deci implementat sub forma unui filtru cu rspuns infinit la impuls (IIR) care arat ca n figur:

Calea de reacie
Calea de reacie este urmat de toate eantioanele semnalului de intrare. De-a lungul acestei ci, reprezentat separat n figura 4 sunt stocate n memorie sau n registre dou valori intermediare: v(n-1) i v(n-2). Acestea sunt calculate dup cum urmeaz:

x(n)

v(n) z-1 v(n-1) z-1 v(n-2)

v(n) = x(n) + 2 cos(2k / N )v(n 1) v(n 1)


v(n-1) i v(n-2) sunt dou elemente de memorie pentru stocarea v(n) iar x(n) este eantionul curent de intrare. x(n), v(n-1) i v(n-2) sunt citite din memorie i folosite la 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). Prin deplasri succesive se actualizeaz v(n-1) i v(n-2) pentru fiecare nou eantion de intrare. La nceput, cele dou valori sunt iniializate cu 0: -1 Figura 4. Calea de reacie

2cos(2k/N)

v(1) = v(2) = 0
v(n)

y(n)

Calea direct
Pe calea direct se fac calcule o singur dat, la momentul N, dup ce s-au realizat calculele pe calea de reacie pentru toate cele N eantioane. X(k) este calculat folosind dou valori intermediare, v(n) i v(n-1) obinute n urma calculelor efectuate pe calea de reacie. Aa cum arat figura 5, unde este reprezentat doar calea direct,

z-1 v(n-1)

-e-j2k/N Figura 5. Calea direct

y ( N ) = v(n) e j 2k / N v(n 1) = X (k )
n acest moment, cele dou valori intermediare sunt v(N-1) i v(N-2) deoarece n = N-1.

Ecuaiile cu diferene finite pentru filtrul Geortzel


Ecuaiile cu diferene finite, n domeniul timp ce implementeaz filtrul Goertzel sunt cele ce realizeaz cele dou ci, de reacie i direct date mai sus:

v(n) = x(n) + 2 cos(2k / N )v(n 1) v(n 1)


i

y (n) = v(n) e j 2k / N v(n 1)


cu condiiile iniiale

v(1) = v(2) = 0

7.10.4 Programul pentru implementarea algoritmului Goertzel


#include <stdio.h> #include <math.h> #define M 8 #define N 8 // M - lungimea semnalului // N - lungimea transformatei

for(k=0;k<N;k++) { for(n=0;n<N;n++) { v2[k]=v1[k]; v1[k]=v[k]; v[k]=sign[n]+2*c[k]*v1[k]-v2[k]; } v2[k]=v1[k]; v1[k]=v[k]; v[k]=2*c[k]*v1[k]-v2[k]; SGN_real[k]=v[k]-v1[k]*c[k]; SGN_imag[k]=v1[k]*s[k]; } } void sin_cos(int L_DFT) { int k; for(k=0;k<L_DFT;k++) { c[k]=cos(2*pi*k/L_DFT); s[k]=sin(2*pi*k/L_DFT); } }

#define pi 3.141592 float c[N],s[N]; // n vectorii c[ ] i s[ ] se pstreaz valorile coeficienilor // cos(2k/N) i sin(2k/N) void sin_cos(int L_DFT); void goertzel( float sign[],float SGN_real[],float SGN_imag[]); main() { int n; float Xreal[N],Ximag[N]; float x[]={0.9003,-0.5377,0.2137, -0.0280,0.7826,0.5242,-0.0871,-0.9630}; sin_cos(N); goertzel(x,Xreal,Ximag); for(n=0;n<N;n++) printf("%f\t%f\t\n",Xreal[n],Ximag[n]); } void goertzel(float sign[],float SGN_real[],float SGN_imag[]) { int n,k; float v[N],v1[N],v2[N]; for(n=0;n<N;n++) v[n]=v1[n]=v2[n]=0;

S-ar putea să vă placă și