Oulun yliopisto Elektroniikan piirit ja järjestelmät 2017 Aktiivisen melunhallintaprosessorin suunnittelu SystemC-kieltä ja korkean tason synteesiä käyttämällä Tässä artikkelissa kuvataan digitaalisen aktiivisen melunhallintapiirin suunnittelu ja toteutus SystemC-kieltä ja korkean tason synteesityökaluja käyttämällä. Toimintaperiaate Aktiivista melunpoistoa (active noise control, ANC) käytetään kapeakaistaisen- ja matalataajuisen akustisen häiriön vaimentamiseen tuottamalla vastamelua, jolla on sama aaltomuoto ja amplitudi, mutta vastakkainen vaihe kuin alkuperäisellä häiriölähteellä. ANC-järjestelmä koostuu seuraavista osista: referenssimikrofoni, joka kaappaa melulähteen lähettämän signaalin, virhemikrofoni, joka mittaa melun ja vastamelun summan tietyssä paikassa, kompensoiva kaiutin, joka tuottaa vastamelun, ja digitaalinen signaalinkäsittelypiiri, joka tuottaa häiriönpoistosignaalin. Kompensoiva vastamelusignaali generoidaan adaptiivisella suodattimella, joka muodostaa häiriölähteen ja virhemikrofonin välisen primääripolun siirtofunktion P(z) mallin P'(z).
Edellä esitetty perusperiaate ei toimi käytännössä. Äänisignaalin lisääminen primääripolun muuntamaan häiriöön tapahtuu akustisessa tilassa, mikä tarkoittaa sitä, että adaptiivisen suodattimen ulostulon ja virhe-mikrofonin tulon välillä on siirtofunktio S(z). Tämä siirtofunktio koostuu digitaali-analogiamuuntimen muunnosviiveestä ja kaiuttimen siirtofunktiosta. Voidaan osoittaa, että tämän sekundääripolun siirtofunktion vaikutusta voidaan kompensoida suodattamalla referenssimikrofonisignaali x(k) samalla siirtofunktiolla. Koska S (z) on tavallisesti tiedossa, sitä voidaan mallintaa kiinteällä suodattimella S '(z). Sekundääripolun malli voidaan luoda käyttämällä offline- ja online-menetelmiä. Offline-mallinnuksessa S'(z) lasketaan ennen ANC-suodattimen kytkemistä toimintaan lähettämällä testisignaali kaiuttimesta ja mittaamalla sen vaste. Online-mallinnuksessa S'(z) lasketaan ANC-suodattimen normaalin toiminnan aikana. Tässä esiteltävässä suunnitelmassa käytetään offline-menetelmää. Tämä tuottaa seuraavan arkkitehtuurin ANC-suodatusratkaisulle:
ANC-prosessori koostuu kahdesta adaptiivisesta suodattimesta. PZ FILTER-suodatin on FIR-suodatin, jota käytetään primääripolun P(z) mallintamiseen. Sen kertoimia päivitetään pienimmän neliösumman (LMS) sovitusalgoritmilla. SZ FILTER-suodatinta käytetään sekundääripolun S(z) mallintamiseen. Myös se on adaptiivinen LMS-suodatin. PNGEN-lohko on valekohinageneraattori, joka muodostaa testisignaalin, jota käytetään offline-moodissa sekundäärinpolun mallinnuksen aikana. Alla oleva kuva esittää aktiivisen melunvaimennuspiirin simuloitua toimintaa. x_in on häiriösignaali, joka on tarkoitus kumota, ja e_in on virhe-mikrofonin syöttö. SZ PATH ESTIMATION -jakson aikana piiri synnyttää valusatunnaista kohinaa kaiuttimen lähtöön d_out ja kaappaa sen tulon e_in kautta. Tämän jälkeen piiri kytketään aktiiviseen melunvaimennustilaan (ANC ON), jossa se luo kumoavan signaalin d_out:iin, mikä pakottaa e_in:in pian nollaan. ANC-prosessorissa on kaksi toimintatilaa: sekundääripolun mallinnustila ja ANC-tila. Lohkokaaviosta tulee helpommin ymmärrettävä, jos siinä näkyvät vain osat, jotka toimivat kussakin tilassa. Toiminta sekundääripolun mallinnustilassa Alla oleva kuva esittää ANC-prosessoria sekundääripolun mallinnustilassa. Tässä PNGEN ohjaa kaiutinta valkoisen kohinan kaltaisella signaalilla n(t) lähdön d_out kautta. Kohina vastaanotetaan virhemikrofonin tulossa e_in, jonka signaali e(t) syötetään LMS-suodattimeen, joka mallintaa S(z):taa. Sovitusalgoritmi yrittää muuttaa SZ FILTER -kertoimia siten, että SZ FILTER-suodattimen lähtösignaali tulee identtiseksi signaalin e_in kanssa. Piiri pidetään tässä tilassa lyhyen ajan.
Sekundääripolun suodatin on FIR-suodatin, jonka ulostulo s(t) määritellään seuraavasti: SZ_LENGT H 1 s (t) = n(t i ) U i i=0 U i :t ovat suodattimen kertoimia, ja SZ_LENGTH on sekundääripolun ja suodattimen pituus. Sekundääripolun mallinnusmoodissa suodattimen kertoimia U i päivitetään LMS-algoritmilla suodatusalgoritmin jokaisen iteroinnin jälkeen. Kertoimen päivityskaava on: U i (t + 1 ) = U i (t) + μ 0 n i (t) e 0 (t) missä μ 0 on kiinteä (mutta ohjelmoitava) askeleen koon määräävä parametri, n(t) on valekohinageneraattorin ulostulosignaali ja e 0 (t) on ero virhemikrofonin tulon (signaali n(t), joka on kulkenut toissijaisen polun läpi) ja sekundääripolun mallinnussuodattimen lähdön s(t) välillä. PNGEN-lohko muodostaa signaalin n(t) käyttämällä lineaarista takaisinkytkettyä siirtorekisteriä (linear feedback shift-register, LFSR), jonka karakteristinen polynomi on x 18 + x 11 + 1. Toiminta ANC-moodissa ANC-tilassa kytkimet käännetään siten, että valekohinageneraattori PNGEN kytkeytyy irti kaiuttimesta, joka nyt saa tulonsa PZ FILTER-suodattimen lähdöstä.
SZ FILTER saa nyt tulonsa n(t):n sijasta x(t):stä, ja toimii kiinteäkertoimisena FIR-suodattimena käyttämällä kertoimien arvoja, jotka saatiin käyttämällä järjestelmää ensin sekundääripolun estimointitilassa. Tästä syystä sen kertoimien päivitystoiminta ei ole aktiivisena. Piiri toimii nyt lähes kuten tavanomainen virhesignaalia vaimentava LMS-suodatin. Ainoa ero on siinä, että vertailusignaali x(t) suodatetaan S':(z):n avulla ja että tätä suodatettua versiota x(k) käytetään suodattimen PZ FILTER kertoimien päivittämiseen LMS-sovitusalgoritmilla. Tämä antaa algoritmille nimen suodatetun x:n LMS-algoritmi. PZ FILTER on FIR-suodatin, jonka lähtö on määritelty seuraavalla kaavalla: P Z_LENGT H 1 p (t) = x(t i ) W i i=0 missä x(t) edustaa referenssimikrofonin tulonäytteitä, W i :t ovat suodattimen kertoimia, ja PZ_LENGTH on suodattimen pituus. Suodattimen kertoimia W i päivitetään normalisoidulla LMS-algoritmilla suodatinalgoritmin jokaisen iteraation jälkeen. Kertoimen päivityskaava on: W i (t + 1 ) = W i (t) + μ(t) s i (t) e (t) missä μ (t) on päivitysaskeleen koko, s(t) on suodatettu x-tulo ja e(t) on virhemikrofonin tulo. Audiotulosignaalien suuren dynaamisen alueen vuoksi käytetään vaihtelevan askelkoon LMS-algoritmia. Tällöin askelparametri μ (t) päivitetään ennen jokaista suodattimen iteraatiota kaavalla
μ (t) = α s 2 +σ missä α on ohjelmoitava vakio, s 2 edustaa suodatetun x-signaalin tehoa, ja σ on pieni vakio joka estää nollalla jakamisen silloin, kun tehotermin arvo menee nollaksi. Tehotermille s 2 lasketaan estimaatti (P e ) kaavalla: P e (t) = β s(t) 2 + ( 1 β)p e(t 1 ) missä β on pieni positiivinen luku (<< 1). anc_core-piirin SystemC-malli anc_core-malli toteuttaa seuraavat toiminnot LMS-suodatin, joka toteuttaa sekundääripolun mallintamisen ("SZ FILTER") Normalisoitu LMS-suodatin, joka toteuttaa vastamelun generoinnin primääripolun mallin perusteella ("PZ FILTER") Valesatunnaisen kohinan generointi ("PNGEN") anc_core on toteutettu yhtenä SystemC-moduulina, jonka esittely on esitetty alla.
Huomaa, että datatulot ja -lähdöt on määritelty etumerkillisiksi kokonaisluvuiksi, kun taas useimmat sisäiset muuttujat ovat kiinteän pisteen etumerkillisiä tai etumerkittömiä kokonaislukuja. Alla on tilakone-esitys algoritmista, joka toteutetaan SC_CTHREAD-prosessina. Kaavion numerot viittaavat lähdekoodin kommentteihin. Punaiset kaaret näyttävät alueet, joille asetetaan latenssirajoituksia synteesissä.
Seuraava esimerkki näyttää SZ FILTER-osan lähdekoodin. Nimiöitä (esitetty punaisella) käytetään koodilohkojen ja silmukoiden merkitsemiseen, jotta direktiivejä voidaan soveltaa koodin osiin synteesityökaluissa. Cadence Stratus -ohjelmaa varten joitakin direktiivejä on
sisällytettävä C-makroina koodiin (esitetty sinisellä alla). Näiden makrojen todellinen koodi määritellään tiedostossa hls_directives.h, jossa ne on määritelty tyhjiksi muille työkaluille. Huomaa, että FIR-suodattimen algoritmi perustuu dataan siirtämiseen taulukossa sz_data_array kuten siirtorekisterissä. Tästä syystä taulukkoa ei voida tehokkaasti sijoittaa synteesissä RAM-muistiin, joten se on toteutettava rekistereillä. Algoritmi tulisi kirjoittaa uudelleen käyttämällä osoitelaskurimuuttujaa, jotta RAM:ia voitaisiin käyttää tehokkaasti. Seuraava koodinäyte esittää tehoestimaatin arvon ja normalisoidun LMS:n askeleen koon laskennan. Huomaa, että tässä tapauksessa tarvitaan 64-bittinen kiinteän pisteen jakolasku, jos halutaan tukea suodatetun referenssimikrofonisignaalin koko teoreettista 24-bitin dynaaminen aluetta.
Viimeinen näyte esittää koodin PZ FILTER-suodattimen laskemiseen ja sen kertoimien päivittämiseen. Simulointi ja synteesi Tässä kappaleessa kerrotaan, kuinka voit simuloida ja syntetisoida suunnitelman itse. Ympäristöasetukset Suorita seuraava komento EDA-työkaluympäristön alustamiseksi. Jos sisäänkirjautumisen yhteydessä asetettu komentotulkkisi on bash, suorita ensin komento bash. source /elsoft1/linux/digital_flow_setup.txt Kaikkien työkalujen asetukset annetaan tiedostossa input/0_setup_design.tcl.
SystemC-simulointi Voit simuloida mallia Mentor Graphics QuestaSim -ohjelmassa suorittamalla seuraavan komennon: vsim -do scripts/1_vsim_systemc_simulation.tcl SystemC-synteesi Cadence Stratus -synteesi Syntetisoi suunnitelma Cadence Stratus -ohjelmalla suorittamalla alla näkyvä komentotiedosto. Tiedosto input/0_setup_design.tcl määrittää kolme synteesikonfiguraatiota, joilla on eri latenssirajoitukset. Komentotiedosto luo Stratus-projektitiedoston input/anc_core_stratus_project.tcl. scripts/2_stratus_hls.csh Tulosten analysoimiseksi voit avata projektin Stratus-ohjelman käyttöliittymässä suorittamalla komennon: stratus_ide input/anc_core_stratus_project.tcl. Voit nyt nähdä tulokset graafisessa käyttöliitymässä. Huomautus! SystemC-simulointia Stratuksesta ei tällä hetkellä tueta, vaikka simulointikonfiguraatiot luodaankin.
Xilinx Vivado HLS -synteesi Voit syntetisoida suunnitelman Xilinx Vivado HLS:llä suorittamalla alla näkyvän komennon. Voit määritellä kohde-fpga-piirin tiedostossa input/0_setup_design.tcl. vivado_hsl -f scripts/2_vivado_hls.tcl Tulosten analysoimiseksi voit avata projektin Vivado HLS:ssä suorittamalla komennon: vivado_hls -p output/anc_core_vivado_hls_project Voit nyt nähdä tulokset graafisessa käyttöliitymässä. Huomautus! SystemC-simulointia Vivado HLS:ssä ei tällä hetkellä tueta. RTL-simulointi SystemC-testipenkissä Voit simuloida synteesin tuottamaa Verilog-kielistä RTL-mallia alkuperäisessä SystemC-testipenkissä suorittamalla seuraavan komennon: vsim -do scripts/3_vsim_systemc_rtl_simulation.tcl
Aaltomuotoikkunasta voit nyt nähdä, että algoritmin suoritus kestää useita kellojaksoja. Synteesiohjelma käyttää kaikki latenssirajoitusten sallimat kellojaksot laskentaan, koska se tekee mahdolliseksi resurssien jakamisen eri kellojaksoille sijoitettujen operaatioiden kesken. Huom! Stratus synteesin jälkeen simuloidaan ensimmäisen synteesikonfiguraation synteesin tuottamaa RTL-mallia.