Diskretinė dvimatė Furjė transformacija c. Vaizdo apdorojimo įrankių rinkinio aprašymas

Tikiu, kad visko yra bendras kontūrasžinoti apie tokį nuostabų matematinį įrankį kaip Furjė transformacija. Tačiau universitetuose kažkodėl taip prastai dėstoma, kad palyginti mažai žmonių supranta, kaip ši transformacija veikia ir kaip ją reikia teisingai panaudoti. Tuo tarpu šios transformacijos matematika yra stebėtinai graži, paprasta ir elegantiška. Kviečiu visus sužinoti šiek tiek daugiau apie Furjė transformaciją ir susijusią temą kaip analoginiai signalai gali būti efektyviai konvertuojami į skaitmeninius skaičiavimo apdorojimui.

Be naudojimo sudėtingos formulės ir Matlab pabandysiu atsakyti į šiuos klausimus:

  • FT, DTF, DTFT – kokie yra skirtumai ir kaip iš pažiūros visiškai skirtingos formulės duoda tokius konceptualiai panašius rezultatus?
  • Kaip teisingai interpretuoti rezultatus greitas konvertavimas Furjė (FFT)
  • Ką daryti, jei jums duotas 179 mėginių signalas, o FFT reikia įvesties sekos ilgio vienodai deuces
  • Kodėl bandant gauti sinusoidės spektrą naudojant Furjė, o ne tikėtinai viena „lazda“, grafike atsiranda keistas raibulis ir ką su juo galima padaryti
  • Kodėl analoginiai filtrai dedami prieš ADC ir po DAC?
  • Ar galima skaitmeninti ADC signalą, kurio dažnis didesnis nei pusė atrankos dažnio (mokyklos atsakymas neteisingas, galimas teisingas atsakymas)
  • Kaip atkurti pradinį signalą naudojant skaitmeninę seką

Remsiuosi prielaida, kad skaitytojas supranta, kas yra integralas, kompleksinis skaičius (taip pat jo modulis ir argumentas), funkcijų konvoliucija ir bent jau „praktinis“ supratimas apie tai, kas yra Dirako delta funkcija. yra. Jei nežinote, ne problema, perskaitykite aukščiau pateiktas nuorodas. Skiltyje „Funkcijų produktas“. šis tekstas Visur suprasiu „taškinį dauginimą“.

Turbūt turėtume pradėti nuo to, kad normalus konvertavimas Furjė yra tam tikras dalykas, kuris, kaip galite atspėti iš pavadinimo, paverčia kai kurias funkcijas į kitas, tai yra, susieja kiekvieną tikrojo kintamojo x(t) funkciją su jo spektru arba Furjė vaizdu y(w):

Jei pateikiame analogijas, tai panašaus reikšme transformacijos pavyzdys gali būti, pavyzdžiui, diferenciacija, funkcijos pavertimas jos išvestiniu. Tai reiškia, kad Furjė transformacija iš esmės yra ta pati operacija, kaip ir išvestinės, ir ji dažnai žymima panašiu būdu, nubrėždami trikampį „dangtelį“ virš funkcijos. Tik priešingai nei diferencijavimas, kuris taip pat gali būti apibrėžtas tikriesiems skaičiams, Furjė transformacija visada „veikia“ su bendresniais kompleksiniais skaičiais. Dėl šios priežasties nuolat kyla problemų rodant šios transformacijos rezultatus, nes kompleksinius skaičius lemia ne viena, o dvi koordinatės operacinėje sistemoje. realūs skaičiai grafika. Patogiausia, kaip taisyklė, kompleksinius skaičius pavaizduoti modulio ir argumento pavidalu ir nubrėžti juos atskirai kaip du atskirus grafikus:

Dažnai iškviečiamas sudėtingo vertės argumento grafikas tokiu atveju„fazės spektras“, o modulio grafikas – „amplitudės spektras“. Amplitudės spektras paprastai yra daug didesnis, todėl dažnai praleidžiama "fazinė" spektro dalis. Šiame straipsnyje mes taip pat sutelksime dėmesį į „amplitudės“ dalykus, tačiau neturėtume pamiršti apie trūkstamos grafiko fazės dalies egzistavimą. Be to, vietoj įprasto kompleksinio verčių modulio jis dažnai nubraižytas dešimtainis logaritmas padauginta iš 10. Rezultatas yra logaritminis grafikas, kurio reikšmės rodomos decibelais (dB).

Atkreipkite dėmesį, kad nelabai neigiamus skaičius logaritminis grafikas (-20 dB ar mažiau) atitinka praktiškai nulis skaičių„įprastoje“ diagramoje. Todėl ilgos ir plačios įvairių spektrų „uodegos“ tokiuose grafikuose, rodomos „įprastomis“ koordinatėmis, kaip taisyklė, praktiškai išnyksta. Tokio keisto iš pirmo žvilgsnio vaizdavimo patogumas kyla dėl to, kad Furjė vaizdai įvairių funkcijų dažnai reikia daugintis tarpusavyje. Taip taškiškai dauginant kompleksinės vertės Furjė vaizdus, ​​pridedami jų fazių spektrai, o jų amplitudės spektrai padauginami. Pirmasis yra lengvas, o antrasis yra gana sunkus. Tačiau amplitudės logaritmai sumuojasi dauginant amplitudes, todėl logaritminiai grafikai amplitudės, kaip ir fazių grafikai, gali būti tiesiog pridedamos taškas po taško. Be to, į praktines problemas Dažnai patogiau veikti ne signalo „amplitude“, o jo „galia“ (amplitudės kvadratu). Įjungta logaritminė skalė abu grafikai (ir amplitudė, ir galia) atrodo identiški ir skiriasi tik koeficientu – visos galios grafiko reikšmės yra lygiai dvigubai didesnės nei amplitudės skalėje. Atitinkamai, norėdami nubraižyti galios pasiskirstymą pagal dažnį (decibelais), negalite nieko kvadratuoti, o apskaičiuoti dešimtainį logaritmą ir padauginti jį iš 20.

Ar tau nuobodu? Palaukite dar šiek tiek, netrukus baigsime nuobodžią straipsnio dalį, paaiškinančią, kaip interpretuoti grafikus :). Tačiau prieš tai turėtumėte labai suprasti vieną svarbus dalykas: Nors visi aukščiau pateikti spektro grafikai buvo sudaryti tam tikriems ribotiems reikšmių diapazonams (ypač teigiamiems skaičiams), visos šios diagramos iš tikrųjų tęsiasi iki begalybės pliuso ir minuso. Grafikai tiesiog vaizduoja kokią nors „prasmingiausią“ grafiko dalį, kuri paprastai yra atspindima neigiamos reikšmės parametras ir dažnai kartojamas periodiškai su tam tikru žingsniu, kai svarstoma didesniu mastu.

Nusprendę, kas nupiešta grafikuose, grįžkime prie pačios Furjė transformacijos ir jos savybių. Yra keli Skirtingi keliai kaip nustatyti šią transformaciją, besiskiriančią mažomis detalėmis (skirtingomis normalizacijomis). Pavyzdžiui, mūsų universitetuose kažkodėl dažnai naudojamas Furjė transformacijos normalizavimas, kuris apibrėžia spektrą kampiniu dažniu (radianais per sekundę). Naudosiu patogesnę vakarietišką formulę, kuri apibrėžia spektrą įprastu dažniu (hercais). Tiesioginės ir atvirkštinės Furjė transformacijos šiuo atveju nustatomos pagal formules kairėje, o kai kurios šios transformacijos savybės, kurių mums prireiks, nustatomos septynių taškų sąrašu dešinėje:

Pirmoji iš šių savybių yra tiesiškumas. Jei imsime tam tikrą tiesinį funkcijų derinį, tai šios kombinacijos Furjė transformacija bus tokia pati tiesinė šių funkcijų Furjė vaizdų kombinacija. Ši savybė leidžia sumažinti sudėtingos funkcijos o jų Furjė transformuojasi į paprastesnius. Pavyzdžiui, sinusinės funkcijos Furjė transformacija, kurios dažnis f ir amplitudė a yra dviejų delta funkcijų, esančių taškuose f ir -f ir su koeficientu a/2, derinys:

Jei imsime funkciją, susidedančią iš skirtingų dažnių sinusoidų aibės sumos, tai pagal tiesiškumo savybę šios funkcijos Furjė transformaciją sudarys atitinkamas delta funkcijų rinkinys. Tai leidžia pateikti naivią, bet vaizdingą spektro interpretaciją pagal principą „jei funkcijos spektre dažnis f atitinka amplitudę a, tai pradinė funkcija gali būti pavaizduota kaip sinusoidų suma, iš kurių viena bus sinusoidė, kurios dažnis f ir amplitudė 2a. Griežtai tariant, toks aiškinimas yra neteisingas, nes delta funkcija ir taškas grafike yra visiškai skirtingi dalykai, tačiau, kaip matysime vėliau, diskrečioms Furjė transformacijoms tai nebus taip toli nuo tiesos.

Antroji Furjė transformacijos savybė yra amplitudės spektro nepriklausomumas nuo signalo laiko poslinkio. Jei funkciją perkeliame į kairę arba dešinę išilgai x ašies, tada tik ją fazių spektras.

Trečioji savybė yra ta, kad pradinės funkcijos ištempimas (suspaudimas) išilgai laiko ašies (x) proporcingai suspaudžia (ištempia) jos Furjė vaizdą išilgai dažnio skalės (w). Visų pirma, baigtinės trukmės signalo spektras visada yra be galo platus ir, atvirkščiai, baigtinio pločio spektras visada atitinka neribotos trukmės signalą.

Ketvirtoji ir penktoji savybės yra bene naudingiausios iš visų. Jie leidžia sumažinti funkcijų konvoliuciją iki taškinio Furjė vaizdų dauginimo ir atvirkščiai - taškinio funkcijų dauginimo iki Furjė vaizdų konvoliucijos. Šiek tiek toliau parodysiu, kaip tai patogu.

Šeštoji savybė kalba apie Furjė vaizdų simetriją. Visų pirma, iš šios savybės išplaukia, kad tikrosios vertės funkcijos Furjė transformacijoje (t. y. bet kokio „tikro“ signalo) amplitudės spektras visada yra lygi funkcija, o fazių spektras (jei atvestas į intervalą -pi...pi) yra nelyginis. Būtent dėl ​​šios priežasties spektrai beveik niekada nebraižomi grafikuose. neigiama dalis spektras – realios vertės signalams jis neteikia jokio nauja informacija(bet, kartoju, tai irgi nėra nulis).

Galiausiai, paskutinė, septintoji savybė, sako, kad Furjė transformacija išsaugo signalo „energiją“. Tai reikšminga tik baigtinės trukmės signalams, kurių energija yra baigtinė, ir leidžia manyti, kad tokių signalų spektras begalybėje greitai artėja prie nulio. Būtent dėl ​​šios savybės spektro grafikai dažniausiai vaizduoja tik „pagrindinę“ signalo dalį, kuri neša liūto dalį energijos - likusi grafiko dalis tiesiog linkusi į nulį (bet vėlgi, nėra nulis).

Apsiginklavę šiomis 7 savybėmis, pažvelkime į signalo „skaitmenizavimo“ išversti matematiką. nuolatinis signalasį skaičių seką. Norėdami tai padaryti, turime naudoti funkciją, žinomą kaip „Dirac šukos“:

„Dirac“ šukos yra tiesiog periodinė delta funkcijų seka su vienybės koeficientu, pradedant nuo nulio ir tęsiant žingsniu T. Signalų skaitmeninimui T pasirenkamas kuo mažesnis skaičius, T.<<1. Фурье-образ этой функции - тоже гребенка Дирака, только с гораздо большим шагом 1/T и несколько меньшим коэффициентом (1/T). С математической точки зрения, дискретизация сигнала по времени - это просто поточечное умножение исходного сигнала на гребенку Дирака. Значение 1/T при этом называют частотой дискретизации:

Vietoj tolydžios funkcijos po tokio dauginimo gaunama tam tikro aukščio delta impulsų seka. Be to, pagal Furjė transformacijos savybę 5, gauto diskretiško signalo spektras yra pradinio spektro su atitinkamomis Dirako šukomis konvoliucija. Nesunku suprasti, kad, remiantis konvoliucijos savybėmis, pradinio signalo spektras yra „nukopijuojamas“ begalinį skaičių kartų išilgai dažnio ašies 1/T žingsniu ir tada sumuojamas.

Atkreipkite dėmesį, kad jei pradinio spektro plotis buvo baigtinis, o mes naudojome pakankamai aukštą diskretizavimo dažnį, tada pradinio spektro kopijos nepersidengs, taigi ir nesusidės. Nesunku suprasti, kad iš tokio „sugriuvusio“ spektro bus nesunku atkurti originalų - pakaks tiesiog paimti spektro komponentą nulio srityje, „nupjovus“ papildomas kopijas, eisiančias į begalybę. Paprasčiausias būdas tai padaryti yra padauginti spektrą iš stačiakampės funkcijos, lygios T diapazone -1/2T...1/2T ir nuliui už šio diapazono ribų. Tokia Furjė transformacija atitinka funkciją sinc(Tx) ir pagal 4 savybę toks dauginimas yra lygiavertis pradinės delta funkcijų sekos konvoliucijai su funkcija sinc(Tx)



Tai reiškia, kad naudojant Furjė transformaciją, mes turime būdą lengvai atkurti pradinį signalą iš laiko atrankos signalo, veikiantį su sąlyga, kad naudojame mažiausiai du kartus (dėl neigiamų dažnių spektre) diskretizavimo dažnį. didesnis nei didžiausias pradiniame signale esantis dažnis. Šis rezultatas yra plačiai žinomas ir vadinamas „Kotelnikovo / Shannon-Nyquist teorema“. Tačiau, kaip nesunku pastebėti dabar (suprantant įrodymą), šis rezultatas, priešingai nei plačiai paplitusi klaidinga nuomonė, lemia pakankamai, bet ne būtina pradinio signalo atkūrimo sąlyga. Viskas, ko mums reikia, yra užtikrinti, kad mus dominanti spektro dalis po signalo atrinkimo nepersidengtų viena su kita, o jei signalas yra pakankamai siauras (turi mažą ne nulinės spektro dalies „plotį“), tada šis rezultatas dažnai gali būti pasiektas, kai diskretizavimo dažnis yra daug mažesnis nei du kartus didesnis už maksimalų signalo dažnį. Ši technika vadinama „nepaprastu diskretizavimu“ (subsampling, bandpass atranka) ir yra gana plačiai naudojama apdorojant visų rūšių radijo signalus. Pavyzdžiui, jei paimsime FM radiją, veikiančią dažnių juostoje nuo 88 iki 108 MHz, tada norėdami jį suskaitmeninti, galime naudoti ADC, kurio dažnis yra tik 43,5 MHz, o ne 216 MHz, numatyto Kotelnikovo teoremoje. Tačiau šiuo atveju jums reikės aukštos kokybės ADC ir gero filtro.

Leiskite pažymėti, kad aukštų dažnių „dubliavimas“ žemesnės eilės dažniais (aliasing) yra tiesioginė signalo atrankos savybė, kuri negrįžtamai „sugadina“ rezultatą. Todėl, jei signale iš esmės gali būti aukšto laipsnio dažniai (ty beveik visada), priešais ADC dedamas analoginis filtras, „atjungiantis“ viską, kas nereikalinga tiesiai pradiniame signale (kadangi po jo atrinkimo). bus per vėlu tai padaryti). Šių filtrų, kaip analoginių įrenginių, charakteristikos nėra idealios, todėl tam tikra signalo „žala“ vis tiek atsiranda, o praktiškai iš to išplaukia, kad aukščiausi dažniai spektre, kaip taisyklė, yra nepatikimi. Siekiant sumažinti šią problemą, signalas dažnai yra perkomponuojamas, nustatant įvesties analoginį filtrą į mažesnį dažnių juostos plotį ir naudojant tik apatinę teoriškai prieinamo ADC dažnių diapazono dalį.

Kitas dažnas klaidingas supratimas, beje, yra tada, kai signalas DAC išvestyje traukiamas „žingsniais“. „Žingsniai“ atitinka atrinktos signalų sekos su stačiakampe pločio T ir aukščio 1 konvoliuciją:

Signalo spektras su šia transformacija padauginamas iš šios stačiakampės funkcijos Furjė transformacijos, o panašiai stačiakampei funkcijai ji vėl sinc(w), kuo daugiau „ištempiama“, tuo mažesnis atitinkamo stačiakampio plotis. Atrinkto signalo su tokiu „DAC“ spektras taškas po taško dauginamas iš šio spektro. Tokiu atveju nereikalingi aukšti dažniai su „papildomomis spektro kopijomis“ nėra visiškai nupjaunami, tačiau viršutinė „naudingos“ spektro dalies dalis, priešingai, yra susilpnėjusi.

Žinoma, praktiškai niekas to nedaro. Yra daug skirtingų DAC konstravimo būdų, tačiau net ir artimiausiuose svertinio tipo DAC stačiakampiai impulsai DAC, priešingai, parenkami kuo trumpesni (apytiksliai atitinkantys tikrąją delta funkcijų seką). kad būtų išvengta per didelio naudingosios spektro dalies slopinimo. „Papildomi“ dažniai gautame plačiajuosčio ryšio signale beveik visada panaikinami perduodant signalą per analoginį žemųjų dažnių filtrą, kad nebūtų „skaitmeninių žingsnių“ nei keitiklio „viduje“, nei ypač jo išvestyje.

Tačiau grįžkime prie Furjė transformacijos. Aukščiau aprašyta Furjė transformacija, taikoma iš anksto atrinktai signalų sekai, vadinama diskrečiojo laiko Furjė transformacija (DTFT). Spektras, gaunamas atliekant tokią transformaciją, visada yra 1/T periodinis, todėl DTFT spektrą visiškai lemia jo reikšmės segmente n=0,…,N-1 – pradinis kompleksinis signalas, susidedantis iš N. kompleksiniai skaičiai. Pažymime X[k], k=0,…N-1 - jo kompleksinį spektrą, taip pat susidedantį iš N kompleksinių skaičių. Tada sąžininga sekančias formules Tiesioginės ir atvirkštinės Furjė transformacijos:

Jei realų signalą išskaidysime į spektrą naudodami šias formules, tai pirmieji N/2+1 kompleksiniai spektro koeficientai sutaps su „įprasto“ tikrojo DFT spektru, pateiktu „sudėtinga“ forma, o likusiais koeficientais. bus jų simetriškas atspindys, palyginti su puse diskretizavimo dažnio. Kosinuso koeficientų atspindys yra lyginis, o sinuso koeficientų – nelyginis.

2D DFT

Vaizdams, kurie yra dvimatis signalas, spektras taip pat yra dvimatis signalas. Furjė transformacijos pagrindinės funkcijos turi tokią formą:

Be to, fazės taip pat gali būti skirtingos. Paveikslėlyje kiekviena iš šių pagrindinių funkcijų reiškia tam tikro dažnio, tam tikros orientacijos ir tam tikros fazės bangą.

Čia N 1 xN 2 yra pradinio signalo dydis, kuris kartu yra ir spektro dydis. k 1 ir k 2 yra bazinių funkcijų skaičiai (dvimačio DFT koeficientų skaičiai, kuriuose šios funkcijos randamos). Kadangi spektro dydis lygus pradinio signalo dydžiui, tai k 1 = 0,...,N 1 -1; k 2 = 0,…,N 2 -1.

n 1 ir n 2 yra kintamieji pagrindinių funkcijų argumentai. Kadangi bazinių funkcijų apibrėžimo sritis sutampa su signalo apibrėžimo sritimi, tai n 1 = 0,...,N 1 -1; n2 = 0,…,N2-1.

Dvimatis DFT (sudėtinga forma) apibrėžiamas šiomis formulėmis (čia x yra pradinis signalas, o X yra jo spektras):

Tiesioginis dvimačio DFT apskaičiavimas naudojant aukščiau pateiktas formules reikalauja milžiniškų skaičiavimo išlaidų. Tačiau galima įrodyti, kad dvimatis DFT turi atskyrimo savybę, t.y. jį galima paeiliui apskaičiuoti iš dviejų matmenų.

Norint apskaičiuoti dvimatį DFT, pakanka apskaičiuoti visų vaizdo eilučių vienmačius kompleksinius DFT, o tada apskaičiuoti visų gauto „vaizdo“ stulpelių vienmačius kompleksinius DFT.

Tokiu atveju visų vienmačių kompleksinių DFT rezultatai turi būti parašyti vietoje pirminių šių DFT duomenų. Pavyzdžiui, skaičiuojant pirmosios vaizdo eilutės vienmatį DFT, DFT rezultatą reikia įrašyti pirmoje šio vaizdo eilutėje (ji yra tokio pat dydžio). Norėdami tai padaryti, kiekvieną „pikselį“ turite išsaugoti kaip kompleksinį skaičių.

Taigi efektyvus vaizdo DFT skaičiavimo algoritmas yra apskaičiuoti vienmačius FFT iš pradžių iš visų vaizdo eilučių, o paskui iš visų vaizdo stulpelių.

Šiuolaikinės komunikacijos technologijos neįsivaizduojamos be spektrinės analizės. Signalų vaizdavimas dažnio sritis būtini tiek jų charakteristikų analizei, tiek radijo ryšio sistemų siųstuvų-imtuvų blokų ir blokų analizei. Norint konvertuoti signalus į dažnių sritį, naudojama tiesioginė Furjė transformacija. Apibendrinta tiesioginės Furjė transformacijos formulė parašyta taip:

Kaip matyti iš šios dažnių analizės formulės, apskaičiuojama koreliacinė priklausomybė tarp signalo, pateikto laiko srityje, ir kompleksinio eksponento tam tikru dažniu. Šiuo atveju pagal Eulerio formulę kompleksinis eksponentas suskaidomas į realią ir įsivaizduojamą dalį:

(2)

Signalas, pavaizduotas dažnio srityje, gali būti konvertuojamas atgal į laiko sritį, naudojant atvirkštinę Furjė transformaciją. Apibendrinta atvirkštinės Furjė transformacijos formulė parašyta taip:

(3)

Tiesioginė Furjė transformacijos formulė naudoja laiko integraciją nuo minus begalybės iki begalybės. Natūralu, kad tai yra matematinė abstrakcija. Realiomis sąlygomis galime atlikti integraciją nuo tam tikro laiko momento, kurį galime pažymėti kaip 0, iki momento T. Tiesioginės Furjė transformacijos formulė bus transformuota į tokią formą:

(4)

Kaip rezultatas Furjė transformacijos savybės labai pasikeičia. Signalo spektras vietoj nuolatinės funkcijos tampa atskira vertybių serija. Dabar minimalus dažnis ir tuo pačiu signalo spektro dažnio verčių žingsnis tampa:

, (5)

Su dažniais veikia tik sin ir cos k/T bus tarpusavyje stačiakampiai, ir tai yra būtina Furjė transformacijos sąlyga. Furjė serijos išplėtimo pirmųjų funkcijų rinkinys parodytas 1 pav. Šiuo atveju funkcijų trukmė sutampa su analizės trukme. T.


1 pav. Furjė serijos plėtimosi funkcijos

Dabar signalo spektras atrodys taip, kaip parodyta 2 paveiksle.



2 pav. Funkcijų spektras x(t), kai analizuojama per ribotą laiko intervalą

Šiuo atveju tiesioginės Furjė transformacijos (4) skaičiavimo formulė paverčiama tokia forma:

(6)

Atvirkštinės Furjė transformacijos formulė spektro nustatymo per ribotą laikotarpį atveju atrodys taip:

(7)

Panašiu būdu galite nustatyti tiesioginės Furjė transformacijos formulę skaitmeninių signalų pavyzdžiams. Atsižvelgiant į tai, kad vietoj ištisinio signalo naudojami jo skaitmeniniai pavyzdžiai, (6) išraiškoje integralas pakeičiamas suma. Šiuo atveju analizuojamo signalo trukmę lemia skaitmeninių mėginių skaičius N. Furjė transformacija skaitmeniniams signalų pavyzdžiams vadinama diskrečiąja Furjė transformacija ir parašyta taip:

(8)

Dabar pažiūrėkime, kaip pasikeitė diskrečios Furjė transformacijos (DFT) savybės, palyginti su tiesiogine Furjė transformacija per ribotą laiko intervalą. Kai pažvelgėme į analoginio signalo atranką, sužinojome, kad įvesties signalo spektras turi būti ribotas. Šis reikalavimas riboja atskirų signalo spektro komponentų skaičių. Iš pradžių gali atrodyti, kad galime apriboti signalo spektrą iki dažnio f d/2, kuris atitinka dažnio komponentų skaičių K=N/2. Tačiau taip nėra. Nors teigiamų ir neigiamų dažnių realių signalų pavyzdžių signalo spektras yra simetriškas apie 0, kai kuriems spektro algoritmams, pvz., , gali prireikti neigiamų dažnių. Skirtumas dar didesnis, kai atliekama diskretinė Furjė transformacija sudėtinguose įvesties signalo pavyzdžiuose. Dėl to norint visiškai apibūdinti skaitmeninio signalo spektrą, reikia N dažnio pavyzdžiai ( k = 0, ..., N/2).

Pateikiamas tiesioginės ir atvirkštinės Furjė transformacijos programos kodas. Svarstoma greitoji Furjė transformacija.

Diskretus konvertavimas Furjė transformacija (DFT) yra galingas analizės įrankis, plačiai naudojamas skaitmeninio signalo apdorojimo (DSP) srityje. Yra tiesioginių ir atvirkštinė konversija Furjė. Tiesioginė diskretinė Furjė transformacija paverčia signalą iš laiko srities į dažnio sritį ir naudojama analizuoti signalo dažnių spektrą. Atvirkštinis konvertavimas veikia visiškai priešingai: naudojant signalo dažnių spektrą, jis atkuria signalą laiko srityje.

Furjė transformacijai apskaičiuoti dažniausiai naudojama pagreitinto skaičiavimo procedūra – vadinamoji. greitoji Furjė transformacija (FFT). Tai leidžia žymiai sumažinti procesoriaus laiką atliekant gana sudėtingus ir daug išteklių reikalaujančius matematinius skaičiavimus.

1 Sudėtingas numeriai

Pirma, mums reikia pagalbinės klasės, kuri apibūdins kompleksinius skaičius. Sudėtiniai skaičiai yra ypatinga skaičių rūšis matematikoje. Kiekvienas kompleksinis skaičius susideda iš dviejų dalių – tikrosios ir įsivaizduojamos. Dabar mums pakanka žinoti apie kompleksinius skaičius DFT atžvilgiu, kad tikroji kompleksinio skaičiaus dalis saugo informaciją apie signalo amplitudę, o menamoji – apie fazę.

Klasės kodas kompleksiniams skaičiams apibūdinti(pasisuka) """ """ Sudėtinis skaičius. """ Viešosios klasės kompleksinis numeris "" """ Tikroji kompleksinio skaičiaus dalis. """ Viešas realus kaip dvigubas = 0 """ """ Įsivaizduojama kompleksinio skaičiaus dalis. """ Viešas įsivaizduojamas kaip dvigubas = 0 viešas sub Naujas () tikras = 0 įsivaizduojamas = 0 pabaiga sub """ """ Sukuria kompleksinį skaičių. """ """ Tikroji kompleksinio skaičiaus dalis. """ Įsivaizduojama kompleksinio skaičiaus dalis. Public Sub New(ByVal r As Double, Neprivaloma ByVal im As Double = 0) Realus = r Įsivaizduojamas = im Pabaiga Sub Privatus usCult As New Globalization.CultureInfo("en-US") "mes naudojame kultūrą "en-US" todėl kad visa ir trupmenos dalys buvo atskirtos tašku, o ne kableliu "" """ Grąžina eilutę, kurią sudaro tikroji ir įsivaizduojama dalis, atskirta tabuliavimo simboliu. """ Vieša nepaiso funkcijos ToString() kaip eilutės grąžinimo (Real.ToString(usCult) & ControlChars.Tab & Imaginary.ToString(usCult)) Pabaigos funkcijos pabaigos klasė

2 Tiesiogiai diskretiškai greitai Furjė transformacija

Į funkcijos įvestį perduodamas kompleksinių skaičių masyvas. Kurio tikroji dalis yra savavališkas atskiras signalas su rodmenimis reguliariais intervalais. Įsivaizduojamoje dalyje yra nuliai. Mėginių skaičius signale turi būti lygus dviejų laipsniui. Jei jūsų signalas trumpesnis, pažymėkite jį nuliais iki 2 kartotinio: 256, 512, 1024 ir kt. Kuo ilgesnis signalas, tuo didesnė apskaičiuoto spektro dažninė skiriamoji geba.

Tiesioginės greitos Furjė transformacijos skaičiavimo kodas VB.NET(pasisuka) """ """ Skaičiuoja signalo spektrą naudojant greitojo Furjė transformacijos metodą. Naudokite tik (N/2+1) grįžtamąsias reikšmes (iki pusės atrankos dažnio). """ """ Signalas, turintis pavyzdžių skaičių, kuris yra dviejų laipsnio kartotinis, ir susidedantis iš tikrosios ir įsivaizduojamos dalių. Visos įsivaizduojamos signalo dalys užpildytos nuliais. """ Pateikia sudėtingų spektro skaičių masyvą. """ Reikšmingas yra tik pirmasis N/2+1, likusios yra simetrinė dalis, atitinkanti neigiamus dažnius. """ Pirmoji spektro reikšmė yra pastovioji komponentė, paskutinė atitinka pusę diskretizavimo dažnio (Nyquist dažnis). """ Vertės, didesnės nei pusė mėginių ėmimo dažnio – nenaudokite. """ Vieša bendrinama funkcija FFT(ByVal signalas kaip kompleksinis skaičius()) kaip kompleksinis skaičius() Pritemdymo tvarka Kaip sveikasis skaičius = signalas. Ilgis "DFT order CheckFftOrder(order) "Patikrinkite, ar tvarka yra dviejų Dim spektro laipsnisLen As Integer = order \ 2 Dim j Kaip sveikasis skaičius = spektrasLen "Bitų atvirkštinis rūšiavimas: i Kaip sveikasis skaičius = 1 Pagal tvarką - 2 Jei (i< j) Then Dim tmpRe As Double = signal(j).Real Dim tmpIm As Double = signal(j).Imaginary signal(j).Real = signal(i).Real signal(j).Imaginary = signal(i).Imaginary signal(i).Real = tmpRe signal(i).Imaginary = tmpIm End If Dim k As Integer = spectrumLen Do Until (k >j) j -= k k \= 2 Ciklas j += k Kitas "Perėjimas per išplėtimo lygius: lygiui As Integer = 1 iki CInt(Math.Log(tvarka) / Math.Log(2)) Dim lvl As Integer = CInt (2 ^ lygis) Dim lvl2 As Integer = lvl \ 2 Dim tmp As Double = Math.PI / lvl2 Dim sr As Double = Math.Cos(tmp) Dim si As Double = -Math.Sin(tmp) Dim tr Kaip dvigubas = 0 Dim ur As Double = 1 Dim ui As Double = 0 Jei jj Kaip sveikasis skaičius = 1 Iki lvl2 "Pereikite spektrus lygiu For i Kaip sveikasis skaičius = (jj - 1) Iki (tvarka - 1) Žingsnis lvl "Pereiti atskiri "drugeliai" Dim ip As Integer = i + lvl2 tr = signalas(ip).Real * ur - signalas(ip).Imaginary * ui "Drugelio operacija" Dim ti As Double = signalas(ip).Real * ui + signalas (ip).Imaginary * ur signal(ip).Real = signalas(i).Real - tr signalas(ip).Imaginary = signalas(i).Imaginary - ti signal(i).Real = signalas(i).Real + tr signalas(i).Imaginary = signalas(i).Imaginary + ti Kitas tr = ur ur = tr * sr - ui * si ui = tr * si + ui * sr Kitas Kitas "Užpildykite apdorotų kompleksinių skaičių masyvą pagal FFT: Pritemdytas spektras (tvarka - 1) kaip kompleksinis skaičius, skirtas i Kaip sveikasis skaičius = 0 pagal užsakymą - 1 su signalu (i) spektras (i) = naujas kompleksinis skaičius (. Realus, .Imaginary) Pabaiga su kitu Grąžinti spektro pabaigos funkcija

3 Atvirkštinis diskretiškas greitas Furjė transformacija

Atvirkštinė diskrečioji Furjė transformacija (IDFT), viena iš skaičiavimo etapų, apima tiesioginį DFT kompleksinių skaičių masyve, kur įsivaizduojama dalis yra inversija įsivaizduojamos spektro dalies X ašies atžvilgiu.

Kodas, skirtas apskaičiuoti atvirkštinę greitą Furjė transformaciją VB.NET(pasisuka) """ """ Atkuria signalą iš jo spektro naudojant atvirkštinės greitosios Furjė transformacijos metodą. """ """ Signalo spektras, kuriame yra pavyzdžių skaičius, kuris yra dviejų laipsnio kartotinis ir susideda iš tikrosios ir įsivaizduojamos dalių. Vieša bendra funkcija InverseFFT(ByVal spectrum As ComplexNumber()) As ComplexNumber() Dim order As Integer = spektras.Length "Atvirkštinė DFT tvarka. CheckFftOrder(order) "Įsivaizduojamos dalies elementų aritmetinio ženklo keitimas: For i As Integer = 0 Į spektrą Ilgis - 1 spektras (i). Įsivaizduojamas = -spektras (i). Įsivaizduojamas Kitas "Tiesioginio FFT apskaičiavimas: Pritemdytas tiesioginis FFT kaip kompleksinis skaičius() = FFT(spektras) "Padalijimas pagal eilę laiko srityje su besikeičiančiu įsivaizduojamos dalies aritmetinis ženklas: Pritemdytas signalas (tiesioginisFFT.Ilgis - 1) Kaip sudėtingas skaičius For i As Integer = 0 To directFFT.Length - 1 Dim ReX As Double = directFFT(i).Real / order Dim ImX As Double = - directFFT(i).Įsivaizduojamas / eilės signalas(i) = naujas kompleksinis skaičius(ReX, ImX) Kitas Grįžimo signalas Pabaigos funkcija

Ir, žinoma, apibūdinsime naudojamą metodą, kuris patikrina perduodamo masyvo elementų skaičių:

"""

""" Patikrina, ar FFT tvarka yra dviejų laipsnis, o jei ne, padaro išimtį. """ """ FFT užsakymas. Privatus bendrinamas sub CheckFftOrder(ByVal tvarka kaip sveikasis skaičius) Dim chk As Double = Math.Abs(Math.Floor(Math.Log(tvarka, 2)) - Math.Log(tvarka, 2)) If (chk > 0,0001) Tada mesti New ArgumentException(String.Format("Masyvo ilgis ((0)) nėra dviejų laipsnis.", tvarka)) End If End Sub

4 Tikrinimas į priekį ir atgal Furjė transformacija

Dabar patikrinkime, ar mūsų funkcijos veikia. Norėdami tai padaryti, perduokime savavališką signalą per tiesioginio Furjė transformacijos mechanizmą, o tada „surinkkime“ jį atgal naudodami atvirkštinę Furjė transformaciją. Rekonstruotas signalas turėtų būti beveik identiškas pirminiam signalui. Apvalinimo klaidų, atsirandančių dirbant su skaičiais kompiuteriu, pasitaiko, todėl signalai nebus visiškai identiški, tačiau jų nuokrypis vienas nuo kito turėtų būti nereikšmingas.

Pavyzdžiui, paimkime sinuso funkciją kaip šaltinio signalą ir sugeneruokime duomenis, kurių ilgis yra 128 pavyzdžiai:

Sumažinti cn(127) kaip kompleksinį skaičių, kai i kaip sveikasis skaičius = 0 iki cn.ilgis – 1 cn(i) = naujas kompleksinis skaičius(Math.Sin(i * 3 * Math.PI / 180)) Kitas

Gauname tokį signalą:

Čia X ašis yra mėginių skaičius laiko srityje, o Y ašis yra amplitudė. Atkreipkite dėmesį, kad signalas susideda tik iš realių dalių, o įsivaizduojama dalis visame segmente yra lygi „0“.

Dabar perduokime šį signalą į funkcijos FFT() įvestį. Naudodami kompleksinių skaičių masyvus, gautus tiesioginės Furjė transformacijos metu, sudarysime du grafikus - realiąją (Re) ir įsivaizduojamą (Im) spektro dalis:


Čia X ašis yra dažnio srities pavyzdžiai, o Y ašis yra amplitudė. Norint gauti faktines dažnio reikšmes, būtina jas apskaičiuoti, atsižvelgiant į tai, kad Y ašies "0" atitinka nulinį dažnį, Y ašies maksimumas atitinka diskretizavimo dažnį.

Gautą signalo spektrą perkelsime į atvirkštinės Furjė transformacijos funkciją IFFT(). Gaukime kompleksinių skaičių masyvą, kur realioje dalyje bus atkurtas signalas:


Kaip matote, rekonstruotas signalas visiškai pakartoja pradinį.

Furjė transformacijos

Daugelį signalų patogu analizuoti skaidant juos į sinusoidus (harmonikus). Tam yra keletas priežasčių. Pavyzdžiui, žmogaus ausis veikia panašiai. Jis suskaido garsą į atskirus skirtingų dažnių virpesius. Be to, galima parodyti, kad sinusoidai yra " savo funkcijas» linijinės sistemos (nes jos praeina tiesinės sistemos, nekeičiant formos, bet gali pakeisti tik fazę ir amplitudę). Kita priežastis yra ta, kad Kotelnikovo teorema suformuluota signalo spektro požiūriu.

Furjė transformacija ) yra funkcijų skaidymas į sinusoidus (toliau kosinuso funkcijas dar vadiname sinusoidėmis, nes nuo „tikrųjų“ sinusoidų jos skiriasi tik faze). Yra keletas Furjė transformacijos tipų.

1. Neperiodinis nuolatinis signalas gali būti išplėstas į Furjė integralą.

2. Periodinį nuolatinį signalą galima išplėsti į begalinę Furjė seriją.

3. Neperiodinis diskretinis signalas gali būti išplėstas į Furjė integralą.

4. Periodinį atskirą signalą galima išplėsti į baigtinę Furjė seriją.

Kompiuteris gali dirbti tik su ribotu duomenų kiekiu, todėl iš tikrųjų gali apskaičiuoti tik paskutinį Furjė transformacijos tipą. Pažvelkime į tai atidžiau.

Realus signalas DFT

Tegul diskrečiojo signalo x periodas yra N taškų. Šiuo atveju jis gali būti pavaizduotas kaip baigtinė diskrečiųjų sinusoidų serija (ty linijinis derinys):

2π k (n + ϕ k)

x = ∑ C k cos

(Furier serija)

k = 0

Lygiavertis žymėjimas (kiekvieną kosinusą išskaidome į sinusą ir kosinusą, bet dabar be fazės):

2 π kn

2 π kn

x = ∑ A k cos

+ ∑ B k sin

(Furier serija)

k = 0

k = 0

Ryžiai. 6. Furjė serijos pagrindinės funkcijos 8 taškų atskiram signalui. Kairėje – kosinusai, dešinėje – sinusai. Dažniai didėja iš viršaus į apačią.

Pagrindiniai sinusoidai turi kelis dažnius. Pirmasis eilutės narys (k =0) yra konstanta, vadinama pastovus komponentas(DC poslinkis) signalas. Pati pirmoji sinusoidė (k = 1) turi tokį dažnį, kad jo periodas sutampa su paties pradinio signalo periodu. Aukščiausio dažnio komponentas (k =N /2) turi tokį dažnį, kad jo periodas yra lygus dviem skaičiavimams. KoeficientaiA k ir

B k vadinamas signalo spektru (spektru). Jie rodo si-

nusoidai, kurie sudaro signalą. Dažnio pakopa tarp dviejų gretimų sinusoidų iš Furjė plėtimosi vadinama dažnio skiriamoji geba spektras

Fig. 6 paveiksle pavaizduoti sinusoidai, naudojami atskiram signalui išskaidyti iš 8 taškų. Kiekviena sinusoidė susideda iš 8 taškų, tai yra, tai yra įprastas diskretus signalas. Aiškumo dėlei paveiksle pavaizduoti ištisiniai sinusoidai.

konvertuoti pradinį signalą apskaičiuojant Furjė serijų sumą kiekviename taške. Signalo skaidymas į sinusoidus (t.y. koeficientų gavimas) vadinamas tiesioginė Furjė transformacija. Atvirkštinis procesas – signalo sintezė naudojant sinusoidus – vadinamas atvirkštinė Furjė transformacija(atvirkštinė Furjė transformacija).

Atvirkštinės Furjė transformacijos algoritmas yra akivaizdus (jis yra Furjė serijos formulėje; norint atlikti sintezę, tereikia į ją pakeisti koeficientus). Panagrinėkime tiesioginį Furjė transformacijos algoritmą, t.y. surandant koeficientus A k ir B k .

2 π kn

2 π kn

iš argumento n yra arba-

Funkcinė sistema

K = 0,...,

togonalinis pagrindas periodikos erdvėje diskretūs signalai su N laikotarpiu. Tai reiškia, kad norint išplėsti į jį bet kurį erdvės elementą (signalą), reikia apskaičiuoti taškiniai gaminiaišis elementas su visomis sistemos funkcijomis, o gaunami koeficientai normalizuojami. Tada pradiniam signalui galios bazinio išplėtimo formulė su koeficientais A k ir B k.

Taigi koeficientai A k ir B k apskaičiuojami kaip skaliariniai sandaugai (ne

nenutrūkstamu atveju – funkcijų sandaugos integralai, diskrečiuoju atveju

– sumos iš atskirų signalų sandaugos):

N-1

2 π ki , kai k = 1,...,

A k =

∑ xcos

−1

N i = 0

N-1

A k =

∑ x cos2 π ki , kai k = 0,

N i = 0

N-1

2πki

NB 0 ir B N 2 visada yra lygūs nuliui (nes atitinkamas „pagrindinis“

signalai yra identiški nuliai atskiruose taškuose) ir juos galima atmesti apskaičiuojant atvirkštinį ir tiesioginės transformacijos Furjė.

Taigi, mes nustatėme, kad spektrinis signalo vaizdas yra visiškai lygiavertis pačiam signalui. Galite pereiti tarp jų naudodami tiesiogines ir atvirkštines Furjė transformacijas. Šių transformacijų skaičiavimo algoritmas yra pateiktose formulėse.

Furjė transformacijų skaičiavimas reikalauja labai didelis skaičius daugybos (apie N 2) ir sinusų skaičiavimai. Yra būdas atlikti šias konversijas daug greičiau: maždaug N log2 N daugybos būdu.

Šis metodas vadinamas greita Furjė transformacija (FFT, greita Furjė transformacija ). Jis pagrįstas tuo, kad tarp veiksnių (sinusų) yra daug pasikartojančių verčių (dėl sinuso periodiškumo). FFT algoritmas grupuoja terminus su tais pačiais veiksniais, žymiai sumažindamas daugybos skaičių. Dėl to FFT našumas gali būti šimtus kartų greitesnis nei standartinis algoritmas (priklausomai nuo N ). Reikėtų pabrėžti, kad FFT algoritmas yra tikslus. Jis netgi tikslesnis nei standartinis, nes sumažinus operacijų skaičių, sumažėja apvalinimo klaidų.

Tačiau dauguma FFT algoritmų turi ypatumą: jie gali veikti tik tada, kai analizuojamo signalo ilgis N yra dviejų laipsnis. Paprastai tai neatspindi didelė problema, nes analizuojamas signalas visada gali būti paminkštintas nuliais iki reikiamo dydžio. Skaičius

N vadinamas FFT dydžiu arba ilgiu.

Sudėtingas DFT

Iki šiol mes svarstėme DFT iš tikrų signalų. Dabar apibendrinkime DFT sudėtingų signalų atveju. Tegu x, n =0,…,N -1 – pradinis kompleksinis signalas, susidedantis iš N kompleksinių skaičių. Pažymime X, k =0,…N -1 – jo kompleksinį spektrą, taip pat susidedantį iš N kompleksinių skaičių. Tada galioja šios tiesioginių ir atvirkštinių transformacijų formulės:

vaniy Furjė (čia j = – 1):

N-1

X [ k] = ∑ x[ n] e− jnk (2 π N )

n = 0

N-1

∑ X [ k ] e jnk(2 π N)

Nk = 0

Jei realų signalą išskaidysime į spektrą naudodami šias formules, tada pirmieji N / 2+1 kompleksiniai spektro koeficientai sutaps su „įprasto“ tikrojo DFT spektru, pateiktu „sudėtinga“ forma, o likusiais koeficientais. bus jų simetriškas atspindys



Ar jums patiko straipsnis? Pasidalinkite su draugais!