Convolutia

    Convolutia este o modalitate matematica de a combina doua semnale pentru a forma un al treilea. Ea este singura tehnica importanta in procesarea digitala a semnalelor. Folosind strategia descompunerii in impulsuri, sistemele sunt descris de un semnal numit raspuns la impuls. Convolutia este importanta deoarece leaga cele trei semnal de interes: semnalul de intrare, semnalul de iesire si raspunsul la impuls. Acest capitol prezinta convolutia din doua puncte diferite de vedere, numite algoritmul de intrare si algoritmul de iesire.

Functia delta si raspunsul la impuls

Figura de mai jos ilustreaza definitia a doi termeni importanti in DSP: functia delta si raspunsul la impuls.

Functia delta
Raspunsul la impuls


Functia delta este un impuls normalizat Toate esantioanele sale au valoarea zero cu exceptia unuia singur care are valoarea unu.

Raspunsul la impuls al unui sistem liniar, notat de regula prin h[n], este semnalul de iesire al unui sistem liniar atunci cand la intrarea s-a aplicat un semnal impuls unitar (functia delta).

Doua sisteme liniare vor avea desigur doua raspunsuri diferite la aplicarea functiei delta. Pe scurt doua raspunsuri la impuls diferite.

Orice impuls poate fi exprimat in functie de functia delta. Spre exemplu, un impuls a[n] care ia valoarea -3 pentru esantionul 7 se poate scrie

Daca h[n] este raspunsul la impul al unui sistem liniar ne putem intreba care este impulsul acestui sistem la semnalul anterior a[n]. Datorita proprietatilor sistemelor liniare se poate arata usor ca raspunsul sistemului este acum

Cu alte cuvinte semnalul de iesire este scalat si deplasat cu aceleasi valori ca si impulsul de intrare.

Convolutia

Sa rezumam acum modul in care un sistem modifica un semnal de intrare pentru a forma semnalul de iesire. 

  1. Semnalul de intrare poate fi descompus intr-un set de impulsuri, fiecare dintre ele putand fi privit ca fiind obtinut printr-o scalare si o deplasare a functiei delta.
  2. Semnalul de iesire rezultat din fiecare imuls este o versiune scalata si deplasata a functiei de raspuns la impuls.
  3. Semnalul de iesire complet poate fi gasit prin adunarea acestor raspunsuri scalate si deplasate.

Cu alte cuvinte, daca cunoastem raspunsul la semnalul delta, putem calcula care va fi raspunsul la orice semnal de intrare posibil. Aceasta insamna ca suntem in posesia intregii informatii despre sistemul liniar. In clar, raspunsul la impuls caracterizeaza complet un sistem liniar.

In anumite aplicatii specifice, functia raspuns la impuls mai poate fi intalnita si sub alte denumiri.

Daca sistemul este considerat un filtru, raspunsul la impuls este numit nucleul filtrului (the filter kernel), nucleul de convolutie, sau simplu nucleu.

In procesarea de imagine, functia raspuns la impuls este numita functia de imprastiere a punctului (the point spread function). 

In toate aceste cazuri, aceste denumiri se refera la acelasi lucru: semnalul produs de un sistem liniar la functia delta.

Convolutia este deci o peratie matematica formala precum adunarea, inmultirea sau integrarea. Asa cum o operatie matematica binara preia doi operanzi pentru a produce un al treilea, analog, convolutia combina doua semnale pentru a forma un al treilea semnal.

Convolutia este utilizata in matematica in multe domenii precum: calculul probabilitatilor si statistica. La sistemele liniare, convolutia este folosita pentru a descrie relatia dintre trei semnale de interes: semnalul de intrare, semnalul de raspuns la impuls i semnalul de iesire.

Figura urmatoare prezinta notatia folosita pentru semnale si pentru operatia de convolutie in cazul sistemelor liniare.

Un semnal de intrare, x[n], ce intra intr-un sistem liniar al carui raspuns la functia delta este h[n] produce la iesire un semnal y[n] care este rezultatul aplicarii operatie de convolutie asupra functiilor x[n] si h[n]

Cu alte cuvinte semnalul de intrare convolutat cu semnalul de raspuns la impuls reprezinta semnalul de iesire. De regula operatia de convolutie este notata folosind caracterul steluta (*) care, din nefericire, in toate limbajele de programare, desemneaza operatia de inmultire.

Fie doua exemple notabile:

Filtrul trece jos

Filtrul trece sus

Atenuatorul inversor

Derivata discreta

    Sa intram acum in detaliile matematice ale convolutiei. In domeniul procesarii digitale a semnalelor, convolutia poate fi inteleasa in doua moduri distincte.

De retinut ca aceste doua perspective reprezinta moduri diferite de concepere a aceleiasi operatie matematica.

    Primul punct de vedere este important deoarece el permite o intelegere conceptuala a modului in care convolutia opereaza in domeniul procesarii digitale a semnalelor. Al doilea punct de vedere descrie principiile matematice ale convolutiei.

Convolutia din punctul de vedere al semnalului de intrare

Observam ca daca xk este esantionul k al semnalului de intrare x[n] atunci acesta contribuie la iesire cu un semnal yyk = xk h[n-k] (prin h[n-k] intelegem semnalul functie de raspuns deplasat la dreapta cu k unitati).

    Mai precis, daca nucleul are M elemente de valori hj, cu j intre 1 si M, vor fi afectate elementele cu indicii de la k la k+M-1 ale semnalului de iesire prin adaugarea valorilor

(yyk)i+k-1= xk hi, cu i de la 1 la M.

Astfel, algoritmul de calcul al convolutiei semnalului de intrare x[n] format din N esantioane cu un nucleu h[n] de M elemente se poate scrie

  1. Pentru k de la 1 la N+M-1 initializeaza yk = 0.
  2. Pentru k de la 1 la N si i de la 1 la M calculeaza yi+k-1 = yi+k-1 + xk hi.

Exemplu de convolutie 9x4

Fie convolutia unui semnal format din 9 esantioane convolutat cu un nucleu format din 4 esantioane.

Componentele semnalului de iesire pentru aceasta convolutie sunt urmatoarele

Exemplu de convolutie 4x9

Inversam acum nucleul cu semnalul de intrare din exemplul anterior. Avem astfel convolutia unui semnal format din 4 esantioane convolutat cu un nucleu format din 9 esantioane.

Componentele semnalului de iesire pentru aceasta convolutie sunt urmatoarele

Convolutia este o operatie comutativa

O simpla comparare a semnalelor de iesire din exemplele anterioare arata ca ele reprezinta o aceeasi functie. Concluzia nu poate fi decat una singura: convolutia este o operatie comutativa. Adica 

a[n]*b[n] = b[n]*a[n]

Algoritmul de convolutie din punctul de vedere al semnalului de intrare

Deoarece in limbajul C vectorii incep cu indicele 0 algoritmul de mai sus trebuie rescris

  1. Pentru k de la 0 la N+M-2 initializeaza yk = 0.
  2. Pentru k de la 0 la N-1 si i de la 0 la M-1 calculeaza yi+k = yi+k + xk hi.

Se obtine astfel algoritmul

#define N 81
#define M 31

long double x[N],h[M],y[N+M-1];

for(int k=0;k<N+M-1;k++)y[k]=0;
for(int k=0;k<N;k++)
  for(int i=0;i<M;i++)
    y[i+k]=y[i+k]+x[k]*h[i];
  }

Programul e mai sus permite convolutarea unui semnal de intrare format din 81 de esantioane cu o functie de raspuns de 31 puncte si produce la iesire un semnal format din 111 puncte (adica 81+31-1).

Convolutia din punctul de vedere al semnalului de iesire

Suntem acum interesati de a analiza care sunt contributiile la fiecare element al semnalului de iesire.

In algoritmul de convolutie identificat anterior

  1. Pentru k de la 1 la N+M-1 initializeaza yk = 0.
  2. Pentru k de la 1 la N si i de la 1 la M calculeaza yi+k-1 = yi+k-1 + xk hi.

observam ca elementul j = i+k-1 primeste contributii de forma xj-i+1 hi, pentru i de la 1 la M. Din punct de vedere matematica asta inseamna 

pentru toate valorile j de la 1 la N+M-1 cu j-i+1>0 si j-i+1<=N (deoarece indicii semnalului x[n] trebuie sa fie mai mari sau egali cu 1). Astfel observam ca:

y1 = h1x1
y2 = h1x2 + h2x1
y3 = h1x3 + h2x2+ h3x1
...
yM = h1xM + h2xM-1 + ... + hMx1
yM+1 = h1xM+1 + h2xM + ... + hMx2
...
yN = h1xN + h2xN-1 + ... + hMxN-M+1
...
yM+N-3 = hM-2xN + hM-1xN-1  + hMxN-2
yM+N-2 = hM-1xN + hMxN-1
yM+N-1 = hMxN

Algoritmul de convolutie din punctul de vedere al semnalului de iesire

Pe baza observatiilor anterioare se poate construi algoritmul

#define N 81
#define M 31

long double x[N],h[M],y[N+M-1];

for(int j=0;j<N+M-1;j++)y[j]=0;
for(int j=0;j<N+M-1;j++)
  for(int i=0;i<M;i++)
    if(j-i>=0 && j-i<N) y[j]=y[j]+x[j-i]*h[i];
  }

Adica datorita indicilor bazati la 0 in C algoritmul anterior se traduce in

y0 = h0x0
y1 = h0x1 + h1x0
y2 = h0x2 + h1x1+ h2x0
...
yM-1 = h0xM-1 + h1xM-2 + ... + hM-1x0
yM = h0xM + h1xM-1 + ... + hM-1x1
...
yN-1 = h0xN-1 + h1xN-2 + ... + hM-1xN-M
...
yM+N-4 = hM-3xN-1 + hM-2xN-2  + hM-1xN-3
yM+N-3 = hM-2xN-1 + hM-1xN-2
yM+N-2 = hM-1xN-1

© Cornel Mironel Niculae, 2004-2005

25-Mar-2008