Professional Documents
Culture Documents
h0 h1 h2 hN 1
y ( n)
CAPITOLUL 6
Figura 5.1. Forma transversal pentru FIR
REALIZAREA FILTRELOR DIGITALE Pentru calculul ieirii y (n) trebuie memorate strile filtrului i
coeficienii funciei pondere.
Strile filtrului sunt stocate ntr-o list circular care conine ultimele N
6.1 IMPLEMENTAREA FILTRELOR CU RSPUNS FINIT LA
eantioane de intrare indexat modulo N.
IMPULS (FIR)
Coeficienii filtrului sunt stocai ntr-un vector de lungime N.
6.1.1 Forma transversal Se folosete o list circular de lungime N parcurs cu un index limitat
modulo N. Eantionul de intrare x(n) este introdus n list la indexul curent.
Ecuaia (6.2) poate fi implementat ntr-o structur transversal ca n Apoi este parcurs lista prin decrementarea indexului cu variabila k.
figura urmtoare. Calcului ieirii y(n) se face prin nmulire cu acumulare ntr-o variabila
sum iniializat cu 0 la fiecare iteraie.
Capitolul 6 Realizarea filtrelor digitale 153 154 Aplicaii ale procesoarelor de semnal n comunicaii
int main() Dac nu este ndeplinit condiia (6.4) atunci fie intrarea x(n) , fie
{
Word16 x[DataBlockSize],y[DataBlockSize],delay[N],h[N]; coeficienii hk trebuie scalai cu factorul s. Dac intrarea este mprit la s,
Word32 sum;
short n,i; atunci gama dinamic a semnalului la intrare se micoreaz, deci i raportul
long unsigned k,index;
semnal-zgomot al structurii se micoreaz. Pe de alt parte, dac sunt scalai
...
coeficienii, acetia vor putea fi reprezentai pe mai puini bii i este afectat
fread(x,sizeof(Word16),DataBlockSize,fpx);
rspunsul n frecven al filtrului. Aceste implicaii trebuie evaluate n funcie
for (n=0; n<DataBlockSize; n++) de aplicaie i aleas una din variante.
{
delay[index%N]=x[n];
sum=0;
for (k=0; k<N; k++)
{ 6.2 IMPLEMENTAREA FILTRELOR CU RSPUNS INFINIT
sum=L_mac(sum,h[k],delay[(index-k)%N]);
}
LA IMPULS (IIR)
y[n]=round(sum);
index++;
} Pentru un filtru IIR avem funcia de transfer de forma:
fwrite(y,sizeof(Word16),DataBlockSize,fpy); M
Y ( z) b z k
k
... H ( z) = = k =0
(6.5)
X ( z) N
}
1 + ak z k
k =1
(complexitate aritmetic memorie ocupat, transferuri paralele) difer n cu aceeai funcie de transfer i alocnd un numr suficient de bii pentru
funcie de structura aleas. coeficieni.
De asemenea, n proiectare i implementare trebuie evaluate efectele Cuantizarea semnalului are efecte n diferite noduri ale filtrului, putnd
reprezentrii semnalelor utiliznd un numr finit de bii. n cazul reprezentrii fi considerate ca surse de zgomot alb, aditiv, nrutind RSZ al ieirii. Aceste
numerelor n formate cu virgul fix apare o depire dac rezultatul unei erori pot fi minimizate realiznd nmulirea i acumularea rezultatului n
operaii aritmetice este de modul supraunitar. Acest lucru este posibil dup registre de lungime dublu-cuvnt.
operaiile de nsumare i de nmulire cu o constant de modul supraunitar. O cale de mijloc pentru evitarea nrutirii raportului semnal-zgomot
(RSZ) i, pe de alt parte, evitarea depirii gamei dinamice (overflow) este
Analiza posibilitii depirilor comport dou aspecte: scalarea. Nu este nevoie de scalare n fiecare nod al reelei deoarece
analiza funciei de transfer, H ( z ) i eventual scalarea acesteia astfel semnalele n unele noduri sunt doar ntrzieri ale semnalelor din alte noduri.
nct s se elimine sau s se reduc suficient de mult probabilitatea De asemenea, dac rezultatul final al adunrii semnalelor din mai multe
ca semnalul de ieire s fie de modul supraunitar; noduri este subunitar, n cazul adunrii n complement fa de doi n final se
analiza posibilitii depirilor n toate nodurile reelei, conducnd obine rezultatul corect indiferent dac n diferite noduri apar depiri la
(dac este necesar) la o scalare a semnalului compensat n final, sumele pariale. Trebuie astfel realizat o tehnic de scalare a semnalului la
astfel nct s nu afecteze realizarea funciei de transfer impuse. intrare pentru a evita depirile numai n nodurile unde acestea pot apare.
n filtrele digitale att amplitudinea semnalului ct i coeficienii sunt Se presupune c semnalul de intrare este n modul subunitar:
valori discrete sau cuantizate cu un numr finit de bii. Dei astfel de sisteme x ( n) 1 (6.7)
sunt neliniare, efectele acestor cuantizri pot fi interpretate ca fiind surse de Fie H m ( z ) funcia de transfer de la intrare la nodul m. Pentru a nu avea
zgomot aditiv. Erorile de cuantizare ale coeficienilor modific funcia de depire n nodul m trebuie ndeplinit condiia:
transfer a filtrului i se produc astfel variaii ale zerourilor i polilor, variaii ym ( n ) 1 (6.8)
care schimb nedorit rspunsul n frecven al filtrelor. Erorile de cuantizare a
Avem:
semnalului pot fi privite ca surse de zgomot aditiv n diferite noduri ale
reelei. ym ( n ) = h
k =0
m (k ) x(n k ) hm (k ) x(n k ) hm (k ) = km
k =0 k =0
(6.9)
n cazul n care intrarea este zero sau o constant, exist posibilitatea ca x ( n) b0 w(n) y ( n)
Scriind relaia intrare-ieire sub forma: pentru stocarea ieirilor anterioare ale filtrului.
M
W ( z ) = X ( z ) bk z k (6.11) x ( n) y ( n)
k =0
W ( z) z 1
Y ( z) = N
(6.12) a1
1 + ak z k y (n 1)
k =1
a2 z 1
Rezult ecuaiile cu diferene finite:
M
w(n) = bk z k (6.13)
k =0
aN z 1
N
y (n) = w(n) ak y (n k ) (6.14) y(n N )
k =1
Figura 5.7. Filtru IIR de ordin N numai cu poli
Capitolul 6 Realizarea filtrelor digitale 159 160 Aplicaii ale procesoarelor de semnal n comunicaii
int main()
{
Word16 x[DataBlockSize],y[DataBlockSize]; S considerm acum implementarea unui filtru de ordin 2 numai cu
Word16 delay_b[M+1],delay_a[N+1],b[M+1],a[N];
Word32 sum; poli, cu funcia de transfer de forma:
short n,i;
1
long unsigned k,ix,iy; H ( z) = (6.15)
1 + a1 z + a2 z 2
1
...
Ieirea va fi calculat cu formula:
fread(x,sizeof(Word16),DataBlockSize,fpx);
y (n) = x(n) a1 y (n 1) a2 y (n 2) (6.16)
for (n=0; n<DataBlockSize; n++)
{ Pentru un filtru de ordin 2 nu este necesar implementarea cu liste
delay_b[ix%(M+1)]=x[n];
sum=0;
circulare, strile filtrului putnd fi stocate n dou variabile de stare.
for (k=0; k<=M; k++) Coeficienii a1 i a2 se consider de modul subunitar.
{
sum=L_mac(sum,b[k],delay_b[(ix-k)%(M+1)]); y (n 2) a2
}
for (k=1; k<=N; k++) y ( n 1) a1
{
sum=L_msu(sum,a[k],delay_a[(iy-k)%(N+1)]); Figura 5.4. Organizarea memoriei pentru un filtru de ordin 2 numai cu poli
}
y[n]=round(sum);
delay_b[iy%(N+1)]=y[n];
Word16 x[DataBlockSize],y[DataBlockSize];
ix++; Word16 y1,y2,a[]={WORD16(a1), WORD16(a2)};
iy++; Word32 sum;
}
...
fwrite(y,sizeof(Word16),DataBlockSize,fpy);
fread(x,sizeof(Word16),DataBlockSize,fpx);
...
for (n=0; n<DataBlockSize; n++)
} {
sum=L_deposit_h(x[n]);
sum=L_msu(sum,a[0],y1);
y[n]=msu_r(sum,a[1],y2);
y2=y1;
y1=y[n];
}
fwrite(y,sizeof(Word16),DataBlockSize,fpy);
...
Capitolul 6 Realizarea filtrelor digitale 161 162 Aplicaii ale procesoarelor de semnal n comunicaii
Aceste relaii conduc la structura din figura urmtoare (cunoscut i cu Word16 x[DataBlockSize],y[DataBlockSize];
Word16 w1,w2;
denumirea de forma canonic): Word16 a[]={WORD16(a1), WORD16(a2)};
Word16 b[]={WORD16(b1), WORD16(b2)};
x ( n) w(n) b0 y ( n)
Word32 sum;
a1 z 1 b
1 ...
a2 z 1 b fread(x,sizeof(Word16),DataBlockSize,fpx);
2
x(n) 1/ 2 w(n) 2 y ( n) Forma cascad pentru dou structuri biquad este prezentat mai jos:
a1 / 2 z 1 b / 2
1
x ( n) w1 (n) w2 (n) y ( n)
a2 / 2 z 1 b / 2
2
a1,1 z 1 b1,1 a2,1 z 1 b2,1
Coeficienii sunt stocai in vectorii a i b mprii la 2. Valorile Figura 5.14. Forma cascad cu structuri biquad
intermediare w(n) trebuie stocate n memorie nescalate, adic rezultatul
sumatorului de la intrare trebuie nmulit cu 2 nainte de a fi stocat n celula de for (n=0; n<DataBlockSize; n++)
{
memorie. sum = L_deposit_h(x[n]);
Se realizeaz factorizarea funciei de transfer n funcii de ordin 2 cu n acest caz se pornete de la descompunerea n fracii simple a funciei
coeficieni reali implementate cu structuri biquad: H ( z ) . Funcia de transfer poate fi scris sub forma:
p
1 + bk ,1 z 1 + bk ,2 z 2 p
H ( z) = 1
= H k ( z) (6.27)
k =1 1 + ak ,1 z + ak ,2 z 2 k =1 P b0, p + b1, p z 1 P
H ( z) = C + = C + H p (z) (6.28)
Coeficienii seciunilor de ordin 2 au garantat modulul mai mic dect 2 p =1 1 + a1, p z 1 + a2, p z 2 p =1
y2 [ n ]
x[n] H 2 ( z)
y p [ n]
H p (z )
C y[n]
sum = L_mult(b[p][0],w);
sum = L_mac(sum,b[p][1],w1[k]);
y[n] = add(round(sum),y[n]);
w2[k] = w1[k];
w1[k] = w;
}
}