26.6 Proiectare filtru recursiv

Capitolele 19 și 20 arată cum se proiectează filtrele recursive cu răspunsuri standard de frecvență: high-pass, low-pass, band-pass etc. Ce se întâmplă dacă aveți nevoie de ceva personalizat? Răspunsul este de a proiecta un filtru recursiv la fel cum ați face o rețea neuronală: începeți cu un set generic de coeficienți de recursivitate și folosiți iterația pentru a le transforma încet în ceea ce doriți. Această tehnică este importantă din două motive. În primul rând, permite filtrelor recursive personalizate să fie proiectate fără a fi nevoie să vă bateți capul cu matematica transformatei-z. În al doilea rând, arată că ideile din rețelele DSP convenționale și rețelele neuronale pot fi combinate pentru a forma algoritmi excelenți.

Programul principal pentru această metodă este prezentat în Tabelul 26-4, cu două subrutine din Tabelul 26-5. Șirul T[ ] conține răspunsul de frecvență dorit, un fel de curbă pe care am conceput-o manual. Deoarece acest program se bazează pe FFT, lungimea semnalelor trebuie să fie o putere a lui doi. Așa cum este scris, acest program folosește o lungime FFT de 256, așa cum este definită de variabila N% în linia 130. Aceasta înseamnă că T[0] până la T[128] corespund frecvențelor cuprinse între 0 și 0,5 din rata de eșantionare. Doar magnitudinea este conținută în acest șir; faza nu este controlată în acest model și devine orice devine.

Coeficienții de recursiune sunt setați la valorile lor inițiale în liniile 270-310, selectate tipic pentru a fi sistemul de identitate. Nu utilizați aici numere aleatorii sau filtrul inițial va fi instabil. Coeficienții de recursiune sunt păstrați în șirurile A[ ] și B[ ]. Variabila NP% stabilește numărul de poli în filtrul proiectat. De exemplu, dacă NP% este 5, coeficienții "a" rulează de la A[0] la A[5], în timp ce coeficienții "b" rulează de la B[1] la B[5].

După cum s-a menționat anterior, procedura iterativă necesită o singură valoare care descrie cât de bine funcționează sistemul actual. Aceasta este furnizată de variabila ER (pentru eroare) și este calculată în subrutina 3000. Liniile 3040 până la 3080 încarcă un impuls în șirul IMX[ ]. Apoi, liniile 3100-3150 utilizează acest impuls ca semnal de intrare pentru filtrul recursiv definit de valorile curente ale A[ ] și B[ ]. Ieșirea acestui filtru este astfel răspunsul la impuls al sistemului curent și este stocat în șirul REX[ ]. Răspunsul în frecvență al sistemului este găsit apoi prin aplicarea FFT la răspunsul la impuls, așa cum se arată în linia 3170. Subrutina 1000 este programul FFT listat în Tabelul 12-4 din Capitolul 12. Această subrutină FFT returnează răspunsul în frecvență în formă rectangulară, suprascriind șirurile REX[ ] și IMX[ ].

Liniile 3200-3250 calculează ER, eroarea medie pătrată între magnitudinea răspunsului în frecvență curent și răspunsul în frecvență dorit. Acordați o atenție deosebită modului în care se găsește această eroare. Acțiunea iterativă a acestui program optimizează această eroare, făcând astfel modul în care este definită foarte important. Bucla FOR-NEXT trece prin fiecare frecvență din răspunsul în frecvență. Pentru fiecare frecvență, linia 3220 calculează magnitudinea răspunsului în frecvență curent din datele dreptunghiulare. În linia 3230, eroarea la această frecvență se găsește scăzând magnitudinea dorită, T[ ], din magnitudinea curentă, MAG. Această eroare este apoi ridicată la pătrat și adăugată la variabila acumulatorului ER. După o buclă prin fiecare frecvență, linia 3250 completează calculul pentru a face ER eroarea medie pătrată a întregului răspuns în frecvență.

Liniile 340 până la 380 controlează bucla de iterație a programului. Subrutina 2000 este locul unde se fac modificările la coeficienții de recursiune. Prima acțiune în această subrutină este de a determina valoarea curentă a lui ER și de a o stoca într-o altă variabilă, EOLD (liniile 2040 și 2050). După ce subrutina actualizează coeficienții, valoarea lui ER este determinată din nou și atribuită variabilei ENEW (liniile 2270 și 2280).

Variabila MU controlează mărimea pasului de iterație, la fel ca în programul rețelei neuronale anterior. O caracteristică avansată este folosită în acest program: o ajustare automată a valorii UM. Acesta este motivul pentru care avem cele două variabile, EOLD și ENEW. Când începe programul, MU este setat la valoarea relativ ridicată de 0,2 (linia 160). Acest lucru permite convergența să funcționeze rapid, dar va limita cât de aproape poate ajunge filtrul la o soluție optimă. Pe măsură ce se fac iterațiile, se vor atinge puncte în care nu se înregistrează progrese, identificate de ENEW fiind mai mari decât EOLD. De fiecare dată când se întâmplă acest lucru, linia 370 reduce valoarea lui UM.

Subroutina 2000 actualizează coeficienții de recursiune în conformitate cu metoda cea mai abruptă scădere: calculați panta pentru fiecare coeficient și apoi modificați coeficientul în valoare proporțională cu panta sa. Linile 2080-2130 calculează pantele pentru coeficienții "a", stocându-le în șirul SA[ ]. De asemenea, liniile 2150-2200 calculează pantele pentru coeficienții "b", stocându-le în șirul, SB[ ]. Liniile 2220-2250 modifică apoi fiecare dintre coeficienții de recursiune cu o valoare proporțională cu aceste pante. În acest program, constanta de proporționalitate este pur și simplu dimensiunea pasului, MU. Nu este necesar nici un termen de eroare în constanta de proporționalitate, deoarece există doar un exemplu care să se potrivească: răspunsul în frecvență dorit.

Ultimul subiect este modul în care programul calculează pantele coeficienților de recursiune. În cazul rețelei neuronale, a fost derivată o ecuație pentru pantă. Această procedură nu poate fi utilizată aici deoarece ar necesita derivarea peste DFT. În schimb, se aplică o metodă de forță brută: de fapt, se schimbă coeficientul de recursiune cu un increment mic și apoi se calculează direct noua valoare a ER. Panta este apoi găsită ca schimbarea în ER împărțită la valoarea incrementului. În mod specific, valoarea curentă a ER se găsește în liniile 2040-2050 și este stocată în variabila EOLD. Bucla din liniile 2080-2130 trece prin fiecare dintre coeficienții "a". Prima acțiune în interiorul acestei bucle este de a adăuga un increment mic, DELTA, la coeficientul de recursiune cu care se lucrează (linia 2090). Subrutina 3000 este invocată în linia 2100 pentru a găsi valoarea ER cu coeficientul modificat. Linia 2110 calculează apoi panta acestui coeficient ca: (ER - EOLD)/DELTA. Linia 2120 readuce apoi coeficientul modificat prin scăderea valorii lui DELTA.

Figura 26-13 Proiectarea iterativă a filtrelor recursive.

Figura (a) arată un filtru low-pass cu 8 poli cu eroarea egal distribuită între 0 și 0,5. În (b), eroarea a fost ponderată pentru a forța o performanță mai bună în stopband, în detrimentul erorii din passband. Figura (c) arată un filtru cu 2 poli utilizat pentru corecția 1/sinc(x) în conversia digital-analogică. Răspunsul în frecvență din (d) este complet personalizat. În fiecare figură, răspunsul în frecvență dorit este arătat prin linie punctată, iar răspunsul în frecvență real prin curbă solidă.

Figura 26-13 prezintă câteva exemple de filtre proiectate folosind acest program. Linia punctată este răspunsul de frecvență dorit, în timp ce linia solidă este răspunsul de frecvență al filtrului proiectat. Fiecare dintre aceste filtre necesită câteva minute pentru a converge pe un Pentium de 100 MHz. Figura (a) este un filtru low-pass cu 8 poli, unde eroarea este egal ponderată pe întregul spectru de frecvență (programul ca scris). Figura (b) este același filtru, cu excepția faptului că eroarea din banda de oprire este înmulțită cu opt atunci când se calculează ER. Acest lucru obligă filtrul să aibă un ripplu al benzii de oprire mai mic, în detrimentul unei ripllu mai mare în banda de trecere.

Figura (c) prezintă un filtru cu 2 poli pentru: 1/sinc (x). Așa cum am discutat în Capitolul 3, acest lucru poate fi folosit pentru a contracara reținerea de ordin zero (zeroth-order) în timpul conversiei digital-analogice (vezi Fig. 3-6). Eroarea în acest filtru a fost însumată numai între 0 și 0,45, rezultând o mai bună potrivire pe acest interval, în detrimentul unei potriviri mai rele între 0,45 și 0,5. În cele din urmă, (d) este un răspuns în frecvență cu 6 poli foarte neregulat care include o scădere bruscă. Pentru a realiza convergența, coeficienții de recursiune au fost inițial stabiliți ca cei ai unui filtru notch.