6.4 Algoritmul de ieșire

Primul punct de vedere al convoluției analizează modul în care fiecare eșantion din semnalul de intrare afectează mai multe eșantioane din semnalul de ieșire. În acest al doilea punct de vedere, vom inversa acest lucru prin analizarea eșantioanelor individuale din semnalul de ieșire și găsirea punctelor contributive din intrare. Acest lucru este important atât din punct de vedere matematic, cât și din punct de vedere practic. Să presupunem că ni se dă un semnal de intrare și un răspuns la impuls și dorim să găsim convoluția celor două. Metoda cea mai directă ar fi aceea de a scrie un program care să circule prin semnalul de ieșire, calculând un eșantion pe fiecare ciclu de buclă. De asemenea, ecuațiile sunt scrise sub forma: y[n] = o combinație de alte variabile. Adică eșantionul n din semnalul de ieșire este egal cu o combinație între numeroasele valori din semnalul de intrare și răspunsul la impuls. Aceasta necesită o cunoaștere a modului în care fiecare eșantion din semnalul de ieșire poate fi calculat independent de toate celelalte eșantioane din semnalul de ieșire. Algoritmul pe partea de ieșire furnizează aceste informații.

Să arătăm un exemplu de modul în care un singur punct din semnalul de ieșire este influențat de mai multe puncte de la intrare. Punctul de exemplu pe care îl vom folosi este y[6] în figura 6-5. Acest punct este egal cu suma tuturor celor șase puncte din cele nouă componente de ieșire, prezentate în figura 6-6. Acum, uitați-vă atent la aceste nouă componente de ieșire și identificați care pot afecta y[6]. Adică, găsiți care dintre cele nouă semnale conține un eșantion de tip nonzero în poziția a șasea. Cinci dintre componentele de ieșire au adăugat numai zerouri (marcajele de diamant) la cel de-al șaselea eșantion și, prin urmare, pot fi ignorate. Numai patru dintre componentele de ieșire pot avea o valoare nenulă în poziția a șasea. Acestea sunt componentele de ieșire generate de eșantioanele de intrare: x[3], x [4], x[5] și x[6]. Prin adăugarea celui de al șasea eșantion din fiecare aceste componente de ieșire, y[6] este determinată ca: y[6] = x[3]h[3] + x[4]h[2] + x[5]h[1] + x[6]h[0]. Adică patru probe din semnalul de intrare sunt înmulțite cu cele patru eșantioane din răspunsul la impuls și produsele sunt adunate.

Figura 6-8 ilustrează algoritmul de pe partea de ieșire ca mașină de convoluție, o diagramă flux a modului în care are loc convoluția. Gândiți-vă la semnalul de intrare, x[n] și semnalul de ieșire, y[n], fixate pe pagină. Mașina de convoluție, tot ce se află în interiorul cutiei punctate, este liberă să se miște stânga și dreapta, după cum este necesar. Mașina de convoluție este poziționată astfel încât ieșirea să fie aliniată cu eșantionul de ieșire de calculat. Patru eșantioane din semnalul de intrare cad în intrările mașinii de convoluție. Aceste valori se înmulțesc cu eșantioanele indicate în răspunsul la impuls și se adună produsele. Aceasta produce valoarea pentru semnalul de ieșire, care cade în locul corespunzător. De exemplu, y[n] este afișat fiind calculat din cele patru eșantioane de intrare: x[3], x[4], x[5] și x[6].

Pentru a calcula y[7], mașina de convoluție deplasează un eșantion spre dreapta. Acest lucru duce la introducerea a încă patru probe în mașină, x[4] până la x[7], iar valoarea pentru y[7] coborând în locul corespunzător. Acest proces se repetă pentru toate punctele din semnalul de ieșire care trebuie calculate.

Figura 6-8 Mașina de convoluție

Aceasta este o diagramă flux ce arată cum fiecare eșantion din semnalul de ieșire este influențat de semnalul de intrare și răspunsul la impuls. Vezi textul pentru detalii.

Aranjamentul răspunsului la impuls în interiorul mașinii de convoluție este foarte important. Răspunsul la impuls este răsturnat de la stânga la dreapta. Acest lucru plasează eșantionul cu numărul zero în partea dreaptă, iar numerele eșantionului din ce în ce mai pozitive merg spre stânga. Comparați acest lucru cu răspunsul la impuls normal din figura 6-5 pentru a înțelege geometria acestei schimbări. De ce este nevoie de această schimbare? Pur și simplu cade afară din matematică. Răspunsul la impuls descrie modul în care fiecare punct din semnalul de intrare afectează semnalul de ieșire. Acest lucru are ca rezultat faptul că fiecare punct al semnalului de ieșire este afectat de punctele din semnalul de intrare ponderate printr-un răspuns la impuls răsturnat.

Figura 6-9 Mașina de convoluție în acțiune.

Figurile (a) la (d) prezintă mașina de convoluție setată pentru a calcula patru eșantioane diferite ale semnalului de ieșire y[0], y[3], y[8] și y[11].

Figura 6-9 prezintă mașina de convoluție utilizată pentru a calcula mai multe eșantioane în semnalul de ieșire. Această diagramă ilustrează, de asemenea, o adevărată pacoste în convoluție. În (a), mașina de convoluție este situată complet spre stânga, cu ieșirea către ea. În această poziție, încearcă să primească date de la eșantioanele: x[-3], x[-2], x[-1] și x[0]. Problema este că trei dintre aceste eșantioane: x[-3], x[-2] și x[-1] nu există! Această dilemă apare în (d), unde mașina de convoluție încearcă să accepte eșantioane din dreapta semnalului de intrare definit, punctele x[9], x[10] și x[11].

O modalitate de a face față acestei probleme este inventarea eșantioanelor inexistente. Aceasta implică adăugarea eșantioanelor la capetele semnalului de intrare, fiecare dintre eșantioanele adăugate având o valoare zero. Aceasta se numește padding (umplutura) semnalului cu zerouri. În loc să încercați să accesați o valoare inexistentă, mașina de convoluție primește un eșantion care are o valoare zero. Deoarece acest zero este eliminat în timpul multiplicării, rezultatul este matematic la fel ca ignorarea intrărilor inexistente.

Partea importantă este că eșantioanele de la extrema stânga și de la extrema dreaptă din semnalul de ieșire se bazează pe informații incomplete. În jargonul DSP, răspunsul la impuls nu este complet scufundat în semnalul de intrare. Dacă răspunsul la impuls este M puncte în lungime, primul și ultimul eșantion M-1 din semnalul de ieșire se bazează pe mai puține informații decât eșantioanele dintre. Aceasta este analog cu un circuit electronic necesitând o anumită cantitate de timp pentru stabilizare după aplicarea alimentării. Diferența este că această tranziție este ușor de ignorat în electronică, dar foarte proeminentă în DSP.

Figura 6-10 prezintă un exemplu al problemei pe care aceste efecte de capăt le pot provoca. Semnalul de intrare este o undă sinus plus o componentă DC. Dorința este de a scoate partea DC a semnalului, lăsând în același timp unda sinus intactă. Aceasta necesită un filtru de trece-sus, cum ar fi răspunsul la impuls prezentat în figură. Problema este că primele și ultimele 30 de puncte sunt în încurcătură! Forma acestor regiuni de capăt poate fi înțeleasă prin imaginarea semnalului de intrare unplut cu 30 de zerouri pe partea stângă, eșantioanele x[-1] până la x[-30] și 30 de zerouri în partea dreaptă, eșantioanele x[81] până la x[110]. Semnalul de ieșire poate fi apoi vizualizat ca o versiune filtrată a acestei forme de undă mai lungi. Aceste probleme de "efect de capăt" sunt răspândite în DSP. Ca regulă generală, se așteaptă ca eșantioanele de început și de sfârșit în semnalele procesate să fie destul de inutile.

Acum, matematica. Folosind mașina de convoluție ca îndrumar, putem scrie ecuația standard pentru convoluție. Dacă x[n] este un semnal de N puncte care rulează de la 0 la N-1 și h[n] este un semnal de M puncte care rulează de la 0 la M-1, convoluția celor două: y[n] = x[n]*h[n], este un semnal cu N+M-1puncte care rulează de la 0 la N+M-2, dat de:

Ecuația 6-1 Insumarea convoluției.

Aceasta este definiția formală a convoluției, scrisă în forma scurtă: y[n] = x[n] * h[n]. În această ecuație, h[n] este un semnal de M puncte cu indici rulând de la 0 la M-1.

Această ecuație se numește sumă de convoluție. Permite ca fiecare punct din semnalul de ieșire să fie calculat independent de toate celelalte puncte din semnalul de ieșire. Indicele, i, determină ce eșantion din semnalul de ieșire este calculat și, prin urmare, corespunde poziției stânga-dreapta a mașinii de convoluție. În programele de calculator care efectuează convoluție, o buclă face ca acest index să ruleze prin fiecare eșantion din semnalul de ieșire. Pentru a calcula una dintre eșantioanele de ieșire, indicele j este utilizat în interiorul mașinii de convoluție. Pe măsură ce j trece de la 0 la M-1, fiecare eșantion din răspunsul la impuls, h[j], se înmulțește cu eșantionul corespunzătoare din semnalul de intrare, x[i-j]. Toate aceste produse sunt adunate pentru a produce eșantionul de ieșire calculat. Studiați Ec. 6-1 până când înțelegeți complet modul în care este implementată de mașina de convoluție. O mare parte din DSP se bazează pe această ecuație. (Nu confundați cu n în y[n] = x[n] * h[n]. Acest lucru este doar un suport pentru a indica faptul că o anumită variabilă este indice în matrice. Uneori ecuațiile sunt scrise: y[ ] = x[ ] * h[ ], doar pentru a evita nevoia de a aduce un simbol fără sens).

Tabelul 6-2 prezintă un program pentru realizarea convoluțiilor utilizând algoritmul de ieșire, o utilizare directă a ec. 6-1. Acest program produce același semnal de ieșire ca și programul pentru algoritmul de intrare, prezentat anterior în Tabelul 6-1. Observați diferența principală dintre aceste două programe: algoritmul de intrare trece prin fiecare eșantion din semnalul de intrare (linia 220 din Tabelul 6-1), în timp ce algoritmul de pe partea de ieșire trece prin fiecare eșantion din semnalul de ieșire (linia 180 din Tabelul 6 -2).

Iată o operație detaliată a acestui program. Bucla FOR-NEXT din liniile 180 la 250 trece prin fiecare eșantion din semnalul de ieșire, utilizând I% ca indice. Pentru fiecare dintre aceste valori, o buclă interioară, compusă din liniile 200-230, calculează valoarea eșantionului de ieșire, Y[I%]. Valoarea lui Y[I%] este setată la zero în linia 190, permițându-i să acumuleze produsele din interiorul mașinii de convoluție. Bucla FOR-NEXT din liniile 200-240 oferă o implementare directă a ec. 6-2. Indicele, J%, trece prin fiecare eșantion în răspunsul la impuls. Linia 230 furnizează multiplicarea fiecărui eșantion în răspunsul la impuls, H[J%], cu eșantionul corespunzător din semnalul de intrare, X[I% -J%] și adaugă rezultatul la acumulator.

Figura 6-10 Efectele de capăt în convoluție.

Când un semnal de intrare este în convoluție cu un răspuns la impuls de M puncte, primul și ultimul din cele M-1 puncte din semnalul de ieșire pot să nu fie utilizabile. În acest exemplu, răspunsul la impuls este un filtru trece-sus utilizat pentru a elimina componenta DC din semnalul de intrare.

În linia 230, eșantionul prelevat din semnalul de intrare este: X[I%-J%]. Liniile 210 și 220 împiedică acest lucru de a fi afară din matricea definită, X[0] la X[80]. Cu alte cuvinte, acest program se ocupă de eșantioane nedefinite în semnalul de intrare prin ignorarea acestora. O altă alternativă ar fi definirea matricei semnalului de intrare de la X[-30] la X[110], permițând 30 de zerouri să fie umplute pe fiecare parte a datelor adevărate. Ca a treia alternativă, bucla FOR-NEXT din linia 180 ar putea fi schimbată pentru a rula de la 30 la 80, mai degrabă decât de la 0 la 110. Aceasta înseamnă că programul va calcula numai eșantioanele din semnalul de ieșire unde răspunsul la impuls este complet imersat în semnalul de intrare. Cel mai important lucru este că trebuie să utilizați una dintre aceste trei tehnici. Dacă nu, programul va cădea atunci când încearcă să citească datele din afara limitelor.

Secțiunea următoare: Suma intrărilor ponderate