Praktična uporaba Fourierove transformacije za obdelavo signalov. Digitalna obdelava signalov na mikrokontrolerjih ARM7 Fourierjeva transformacija avr

Fourierjev izrek navaja, da je mogoče vsak signal razširiti v vrsto v ortonormiranem nizu periodičnih funkcij (na primer sinusov in kosinusov) s frekvencami, ki so večkratniki frekvence periodičnega signala. Tako spektralna analiza signala temelji na iskanju utežnih koeficientov (v splošnem kompleksnih), katerih modul ustreza deležu moči nihanja ustreznega harmonika, vnesenega v splošno superpozicijo vseh harmonikov.

Hitra Fourierjeva transformacija

Hitra Fourierjeva transformacija je računski algoritem, ki uspešno izkorišča lastnosti periodičnosti trigonometričnih funkcij, da se izogne ​​nepotrebnim izračunom v diskretni Fourierjevi transformaciji (DFT), s čimer omogoča hitrejše iskanje koeficientov v Fourierjevi razširitvi. Glavna razlika od diskretne pretvorbe je le v metodi izračuna numeričnih vrednosti (algoritem) in ne v sami obdelavi signala. Tako v primeru FFT kot v primeru DFT je rezultat izračunov enak. Edina zahteva za algoritem FFT je velikost vzorca, ki je večkratnik N = 2L, kjer je L poljubno pozitivno celo število. Najpogostejši algoritmi FFT base-2 so: časovno zdesetkani in frekvenčno zdesetkani.

V tem delu je implementiran algoritem radix-2 FFT s časovnim redčenjem (Cooley-Tukeyjev algoritem). To je enostavno pridobiti s preučevanjem nekaterih zakonov DFT. Predstavimo tako imenovani koeficient vrtenja:

V tem primeru so v DFT Fourierjevi koeficienti za številne vrednosti signala (f0,f1,…,fN-1) izraženi z razmerjem:

Razmislite o seriji signalov 4 vrednosti: (f0,f1,f2,f3). Predstavimo Fourierjevo transformacijo v matrični obliki (normalizacijski koeficient 1/N je vključen v stolpcu vektorja Cij na desni strani izraza):

Ko napišete koeficiente vrtenja z Eulerjevo formulo in določite njihove vrednosti za k = 0, 1, 2, .. 9, lahko sestavite diagram (slika 2), iz katerega je razviden vzorec ponavljajočih se koeficientov.

Slika 2. Vrste moči w za N=4

Z zamenjavo številskih vrednosti v (4) dobimo:

To pomeni, da so vrednosti w, začenši z w4, enake ustrezni vrednosti od w0 do w3. Nato prepišemo matrično enačbo (4) v nestandardni obliki (za jasnost nadaljnjih operacij so uvedeni podobni zapisi):

Zamenjajmo stolpce matrike in jo razdelimo v dve skupini: s sodimi indeksi f0, f2 in lihimi indeksi f1, f3:

Upoštevajmo, da je wk+1 = wkw1, potem bo izraz (6) prepisan kot:

Uporaba razmerij:

Zahtevane koeficiente razširitve dobimo v obliki vektorja stolpca z vrednostmi celic:

Grafični prikaz algoritma (slika 3) je videti kot metulj z odprtimi krili, zato se ta metoda izračuna imenuje »metulj«.

Slika 3. Metuljev graf za niz 4 členov

Torej, na prvem koraku algoritma so člani številnih vrednosti signala razdeljeni na sode in lihe indekse. Nato se izvede graf "metulja", ki je sestavljen iz dveh stopenj, njihovo število je enako potenci dveh velikosti vzorca (N = 4 = 22). Na vsaki stopnji se izvedeta dva »metulja«, njuno skupno število pa ostane nespremenjeno. Vsaka operacija metulja ustreza eni operaciji množenja. Za primerjavo: pri DFT z vzorčenjem (f0,f1,f2,f3) bi bilo treba operacijo množenja izvesti 4×4 = 16-krat, v primeru FFT pa samo 4-krat.

To serijo lahko zapišemo tudi kot:

(2),
kjer je k-ta kompleksna amplituda.

Razmerje med koeficientoma (1) in (3) je izraženo z naslednjima formulama:

Upoštevajte, da so vse te tri predstavitve Fourierove vrste popolnoma enakovredne. Včasih je pri delu s Fourierjevimi serijami bolj priročno uporabiti eksponente imaginarnega argumenta namesto sinusov in kosinusov, to je, uporabiti Fourierjevo transformacijo v kompleksni obliki. Toda za nas je priročno uporabiti formulo (1), kjer je Fourierjeva serija predstavljena kot vsota kosinusov z ustreznimi amplitudami in fazami. V vsakem primeru je napačno reči, da bo Fourierjeva transformacija realnega signala povzročila kompleksne harmonične amplitude. Kot pravilno pravi Wiki, je "Fourierjeva transformacija (?) operacija, ki eno funkcijo realne spremenljivke poveže z drugo funkcijo, prav tako realno spremenljivko."

Skupaj:
Matematična osnova za spektralno analizo signalov je Fourierjeva transformacija.

Fourierjeva transformacija vam omogoča, da predstavite zvezno funkcijo f(x) (signal), definirano na segmentu (0, T) kot vsoto neskončnega števila (neskončnega niza) trigonometričnih funkcij (sinus in/ali kosinus) z določeno amplitude in faze, upoštevane tudi na segmentu (0, T). Takšno vrsto imenujemo Fourierjeva vrsta.

Omenimo še nekaj točk, katerih razumevanje je potrebno za pravilno uporabo Fourierjeve transformacije pri analizi signalov. Če upoštevamo Fourierjevo vrsto (vsota sinusoidov) na celotni osi X, lahko vidimo, da bo zunaj segmenta (0, T) funkcija, ki jo predstavlja Fourierjeva vrsta, periodično ponavljala našo funkcijo.

Na primer, v grafu na sliki 7 je prvotna funkcija definirana na segmentu (-T\2, +T\2), Fourierjeva vrsta pa predstavlja periodično funkcijo, definirano na celotni x-osi.

To se zgodi, ker so same sinusoide periodične funkcije, zato bo njihova vsota periodična funkcija.


Slika 7. Predstavitev neperiodične izvirne funkcije s Fourierjevim nizom

Torej:

Naša prvotna funkcija je zvezna, neperiodična, definirana na določenem segmentu dolžine T.
Spekter te funkcije je diskreten, to je, da je predstavljen v obliki neskončne serije harmoničnih komponent - Fourierjev niz.
Dejansko Fourierjeva vrsta določa določeno periodično funkcijo, ki sovpada z našo na segmentu (0, T), vendar za nas ta periodičnost ni pomembna.

Periode harmoničnih komponent so večkratniki vrednosti segmenta (0, T), na katerem je definirana izvirna funkcija f(x). Z drugimi besedami, harmonične periode so večkratniki trajanja merjenja signala. Na primer, perioda prvega harmonika Fourierovega niza je enaka intervalu T, na katerem je definirana funkcija f(x). Perioda drugega harmonika Fourierovega niza je enaka intervalu T/2. In tako naprej (glej sliko 8).


Slika 8 Obdobja (frekvence) harmoničnih komponent Fourierjevega niza (tukaj T = 2?)

V skladu s tem so frekvence harmoničnih komponent večkratniki 1/T. To pomeni, da so frekvence harmoničnih komponent Fk enake Fk = k\T, kjer se k giblje od 0 do?, na primer k = 0 F0 = 0; k=1 F1=1\T; k=2 F2=2\T; k=3 F3=3\T;… Fk= k\T (pri ničelni frekvenci - konstantna komponenta).

Naj bo naša prvotna funkcija signal, posnet med T=1 s. Takrat bo perioda prvega harmonika enaka trajanju našega signala T1=T=1 s in frekvenca harmonika 1 Hz. Perioda drugega harmonika bo enaka trajanju signala, deljenemu z 2 (T2=T/2=0,5 s), frekvenca pa bo 2 Hz. Za tretji harmonik je T3=T/3 s in frekvenca 3 Hz. In tako naprej.

Korak med harmoniki je v tem primeru 1 Hz.

Tako lahko signal s trajanjem 1 sekunde razgradimo na harmonične komponente (pridobimo spekter) s frekvenčno ločljivostjo 1 Hz.
Če želite povečati ločljivost za 2-krat na 0,5 Hz, morate podaljšati trajanje meritve za 2-krat - do 2 sekundi. Signal, ki traja 10 sekund, je mogoče razstaviti na harmonične komponente (da dobimo spekter) s frekvenčno ločljivostjo 0,1 Hz. Ni drugih načinov za povečanje frekvenčne ločljivosti.

Obstaja način, kako umetno povečati trajanje signala z dodajanjem ničel nizu vzorcev. Vendar ne poveča dejanske frekvenčne ločljivosti.

3. Diskretni signali in diskretna Fourierjeva transformacija

Z razvojem digitalne tehnologije so se spremenili tudi načini shranjevanja merilnih podatkov (signalov). Če je bilo prej mogoče signal posneti na magnetofon in ga shraniti na trak v analogni obliki, se zdaj signali digitalizirajo in shranijo v datoteke v pomnilniku računalnika kot niz številk (vzorci).

Običajna shema za merjenje in digitalizacijo signala je naslednja.


Sl.9 Diagram merilnega kanala

Signal iz merilni pretvornik prispe v ADC v času T. Vzorci signala (sampling), pridobljeni v času T, se prenesejo v računalnik in shranijo v pomnilnik.


Slika 10 Digitaliziran signal - N vzorcev, prejetih v času T

Kakšne so zahteve za parametre digitalizacije signala? Naprava, ki pretvori vhodni analogni signal v diskretno kodo ( digitalni signal) se imenuje analogno-digitalni pretvornik (ADC, angleško Analog-to-digital converter, ADC) (Wiki).

Eden glavnih parametrov ADC je največja frekvenca vzorčenja (ali hitrost vzorčenja, angleška stopnja vzorčenja) - hitrost vzorčenja časovno neprekinjenega signala pri njegovem vzorčenju. Meri se v Hertzih. ((Wiki))

V skladu s Kotelnikovim izrekom, če ima zvezni signal spekter, omejen s frekvenco Fmax, ga je mogoče popolnoma in nedvoumno rekonstruirati iz njegovih diskretnih vzorcev, vzetih v časovnih intervalih , tj. s frekvenco Fd? 2*Fmax, kjer je Fd frekvenca vzorčenja; Fmax - največja frekvenca spektra signala. Z drugimi besedami, frekvenca digitalizacije signala (frekvenca vzorčenja ADC) mora biti vsaj 2-krat višja od maksimalne frekvence signala, ki ga želimo izmeriti.

Kaj se bo zgodilo, če vzamemo vzorce z nižjo frekvenco, kot zahteva Kotelnikov izrek?

V tem primeru nastopi učinek »aliasinga« (znan tudi kot stroboskopski učinek, moiré efekt), pri katerem se visokofrekvenčni signal po digitalizaciji spremeni v nizkofrekvenčni signal, ki dejansko ne obstaja. Na sl. 5 rdeči visokofrekvenčni sinusni val je pravi signal. Modri ​​sinusoid nižje frekvence je fiktivni signal, ki nastane zaradi dejstva, da v času vzorčenja preteče več kot polovica obdobja visokofrekvenčnega signala.


riž. 11. Pojav lažnega nizkofrekvenčnega signala pri nezadostno visoki frekvenci vzorčenja

Da bi se izognili učinku aliasinga, je pred ADC nameščen poseben anti-aliasing filter - nizkoprepustni filter (LPF), ki prepušča frekvence pod polovico frekvence vzorčenja ADC in odreže višje frekvence.

Za izračun spektra signala iz njegovih diskretnih vzorcev se uporablja diskretna Fourierjeva transformacija (DFT). Naj še enkrat opozorimo, da je spekter diskretnega signala "po definiciji" omejen s frekvenco Fmax, ki je manjša od polovice frekvence vzorčenja Fd. Zato lahko spekter diskretnega signala predstavimo z vsoto končnega števila harmonikov, v nasprotju z neskončno vsoto za Fourierjev niz zveznega signala, katerega spekter je lahko neomejen. Po Kotelnikovem izreku mora biti največja frekvenca harmonika takšna, da zajema vsaj dva vzorca, zato je število harmonikov enako polovici števila vzorcev diskretnega signala. To pomeni, da če je v vzorcu N vzorcev, bo število harmonikov v spektru enako N/2.

Oglejmo si zdaj diskretno Fourierjevo transformacijo (DFT).

Primerjava s Fourierjevimi vrstami

Vidimo, da sovpadata, le da je čas v DFT diskretne narave in je število harmonikov omejeno z N/2 - polovico števila vzorcev.

Formule DFT so zapisane v brezdimenzionalnih celoštevilskih spremenljivkah k, s, kjer so k števila vzorcev signala, s pa števila spektralnih komponent.
Vrednost s prikazuje število popolnih harmoničnih nihanj v periodi T (trajanje merjenja signala). Diskretna Fourierjeva transformacija se uporablja za iskanje amplitud in faz harmonikov z uporabo numerične metode, tj. "na računalniku"

Če se vrnem k rezultatom, pridobljenim na začetku. Kot je navedeno zgoraj, pri razširitvi neperiodične funkcije (našega signala) v Fourierjevo vrsto nastala Fourierjeva vrsta dejansko ustreza periodični funkciji s periodo T (slika 12).


Slika 12 Periodična funkcija f(x) s periodo T0, z merilno periodo T>T0

Kot je razvidno iz slike 12, je funkcija f(x) periodična s periodo T0. Vendar pa zaradi dejstva, da trajanje merilnega vzorca T ne sovpada s periodo funkcije T0, ima funkcija, dobljena kot Fourierjeva vrsta, diskontinuiteto v točki T. Posledično bo spekter te funkcije vseboval veliko število visokofrekvenčnih harmonikov. Če bi trajanje merilnega vzorca T sovpadalo s periodo funkcije T0, bi spekter, dobljen po Fourierjevi transformaciji, vseboval samo prvi harmonik (sinusoid s periodo, enako trajanju vzorčenja), saj funkcija f(x) je sinusoida.

Z drugimi besedami, program DFT »ne ve«, da je naš signal »kos sinusoide«, ampak poskuša predstaviti periodično funkcijo v obliki niza, ki ima diskontinuiteto zaradi nekonsistentnosti posameznih delov sinusoide. sinusoid.

Posledično se v spektru pojavijo harmoniki, ki naj povzamejo obliko funkcije, vključno s to diskontinuiteto.

Tako je za pridobitev »pravilnega« spektra signala, ki je vsota več sinusoidov z različnimi obdobji, potrebno, da se celo število obdobij posamezne sinusoide prilega periodi merjenja signala. V praksi je ta pogoj lahko izpolnjen pri dovolj dolgem trajanju merjenja signala.


Slika 13 Primer delovanja in spektra signala kinematične napake menjalnika

S krajšim trajanjem bo slika videti "slabša":


Slika 14 Primer delovanja in spektra vibracijskega signala rotorja

V praksi je lahko težko razumeti, kje so "prave komponente" in kje "artefakti", ki jih povzročajo ne-večkratne dobe komponent in trajanje vzorčenja signala ali "skoki in prelomi" v obliki signala. . Seveda sta besedi »prave komponente« in »artefakti« z razlogom postavljeni v narekovaje. Prisotnost številnih harmonikov na spektralnem grafu ne pomeni, da je naš signal dejansko "sestavljen" iz njih. To je enako, kot če bi mislili, da je število 7 "sestavljeno" iz števil 3 in 4. Število 7 lahko predstavimo kot vsoto števil 3 in 4 - to je pravilno.

Torej naš signal ... ali bolje rečeno niti ne "naš signal", temveč periodično funkcijo, ki jo sestavlja ponavljanje našega signala (vzorčenje), lahko predstavimo kot vsoto harmonikov (sinusov) z določenimi amplitudami in fazami. Toda v mnogih primerih, ki so pomembni za prakso (glej zgornje slike), je res mogoče harmonike, dobljene v spektru, povezati z realnimi procesi, ki so ciklične narave in pomembno prispevajo k obliki signala.

Nekaj ​​rezultatov

1. Realni izmerjeni signal s trajanjem T sekund, ki ga digitalizira ADC, to je predstavljen z nizom diskretnih vzorcev (N kosov), ima diskretni neperiodični spekter, ki ga predstavlja niz harmonikov (N/ 2 kosa).

2. Signal je predstavljen z nizom realnih vrednosti in njegov spekter je predstavljen z nizom realnih vrednosti. Harmonične frekvence so pozitivne. Dejstvo, da je za matematike bolj priročno predstaviti spekter v kompleksni obliki z uporabo negativnih frekvenc, ne pomeni, da je "to pravilno" in "to je treba vedno narediti."

3. Signal, merjen v časovnem intervalu T, je določen le v časovnem intervalu T. Kaj se je dogajalo, preden smo začeli meriti signal, in kaj se bo zgodilo po tem, znanosti ni znano. In v našem primeru to ni zanimivo. DFT časovno omejenega signala daje njegov "pravi" spekter, v smislu, da pod določenimi pogoji omogoča izračun amplitude in frekvence njegovih komponent.

Uporabljeni materiali in drugi uporabni materiali.

Kot prikazovalna naprava se uporablja dvovrstični znakovni LCD indikator. Bistvo pri izvedbi tega projekta ni strojna, temveč programska oprema, natančneje implementacija diskretne Fourierove transformacije (DFT) na 8-bitnem mikrokontrolerju. Takoj je treba opozoriti, da avtor ni strokovnjak na tem področju in je zato začel z osnovami - s preprosto diskretno Fourierjevo transformacijo. Algoritem hitre Fourierove transformacije ni samo hiter, ampak tudi precej zapleten.

Diskretna Fourierjeva transformacija (v angleški literaturi DFT, Discrete Fourier Transform) je ena od Fourierjevih transformacij, ki se pogosto uporablja v algoritmih za digitalno obdelavo signalov (njene modifikacije se uporabljajo pri stiskanju zvoka v MP3, stiskanju slike v JPEG itd.), pa tudi v druga področja, povezana z analizo frekvenc v diskretnem (na primer digitaliziranem analognem) signalu. Diskretna Fourierjeva transformacija zahteva diskretno funkcijo kot vhod. Takšne funkcije so pogosto ustvarjene z vzorčenjem (vzorčenje vrednosti iz zveznih funkcij).

Shematski diagram spektralnega analizatorja zvočni signal je zelo preprost in ga lahko v grobem razdelimo na digitalni in analogni del.

Digitalni del tvori mikrokontroler in nanj povezan LCD indikator. Mikrokrmilnik je taktiran od kvarčni resonator 16 MHz, napajalna napetost +5 V se uporablja kot referenčna napetost za ADC mikrokontrolerja.
Podatkovno vodilo LCD indikatorja je priključeno na vrata C mikrokontrolerja (vhodno/izhodne linije PC0-PC3), krmilno vodilo pa na vrata D (PD5, PD6) mikrokrmilnika. Indikator deluje v 4-bitnem načinu. Za nastavitev kontrasta se uporablja spremenljivi upor z nominalno vrednostjo 4,7 kOhm. Za delo z indikatorjem so bili ustvarjeni simboli po meri za prikaz 8 vodoravnih stolpcev analizatorja; ti simboli po meri zasedajo vseh 64 bajtov RAM-a indikatorja LCD.

Mikrokrmilnik deluje iz zunanjega 16 MHz kvarčnega resonatorja.

Analogni del naprave je najpomembnejši del in je predojačevalnik elektretnega mikrofonskega signala, katerega izhod je povezan s kanalom ADC0 ADC vgrajenega v mikrokrmilnik. Na vhodu ADC moramo nastaviti ničelno raven na natančno polovico referenčne napetosti, tj. 2,5 V. V tem primeru lahko uporabimo pozitivni in negativni polval signala, vendar njegova amplituda ne sme preseči uveljavljene meje, tj. Ojačanje mora biti natančno nastavljeno, da se prepreči preobremenitev. Vse zgornje pogoje izpolnjuje običajno mikrovezje operacijskega ojačevalnika majhne moči.

Algoritem DFT je nekoliko počasnejši v primerjavi s hitro Fourierjevo transformacijo. Toda naš analizator spektra ne zahteva visoke hitrosti in če lahko zagotovi hitrost posodabljanja približno 30 sličic na sekundo, bo to več kot dovolj za vizualizacijo spektra zvočnega signala. Vsekakor je v naši različici mogoče doseči hitrost 100 sličic na sekundo, vendar je to že previsoka vrednost parametra za dvovrstični znakovni LCD indikator in ni priporočljiva. Frekvenca vzorčenja je 20 kHz za 32-točkovno diskretno Fourierjevo transformacijo in ker je rezultat transformacije simetričen, moramo uporabiti samo prvo polovico, tj. prvih 16 rezultatov. Zato lahko prikažemo frekvenčni spekter do 10 kHz, ločljivost analizatorja pa je 10 kHz/16 = 625 Hz.

Avtor zasnove je poskušal povečati hitrost izračunov DFT. Če ima ta transformacija N točk, potem moramo najti N2/2 vrednosti sinusa in kosinusa. Za našo 32-točkovno transformacijo moramo najti 512 sinusnih in kosinusnih vrednosti. Toda preden jih najdemo, moramo izračunati kot (stopinje), kar bo vzelo nekaj procesorskega časa, zato je bilo odločeno, da za te izračune uporabimo tabele vrednosti. Pri računanju v mikrokrmilniškem programu se ne uporabljajo številke s plavajočo vejico in dvojno natančnostjo, saj bo to na 8-bitnem mikrokrmilniku trajalo dlje. Namesto tega vrednosti v iskalnih tabelah uporabljajo 16-bitne cele podatke, pomnožene z 10.000. Nato se po izvedbi pretvorbe rezultati delijo z 10.000. S tem pristopom je mogoče izvesti 120 32-točkovnih pretvorb na drugič, kar je več kot dovolj za naše naprave.

Prikaz delovanja spektralnega analizatorja na mikrokontrolerju ATmega32

Prenosi

Izvorna koda (program za mikrokrmilnik, tabele podatkov o sinusih, kosinusih in kotih) -

  • Jasno je, da je na AVR težko iti dlje od svetlobe in glasbe, parametri niso pravi. Toda 120 32-točkovnih pretvorb na sekundo morda zadostuje za večino nalog. In seveda lahko vzamete še en vzorec 625Hz ali bolje rečeno izgubite hitrost osveževanja. Omeniti velja, da se bo MK počutil slabo; kar zadeva zmogljivost, mu lahko pripišete le malo drugega. Toda tukaj lahko organizirate izhod rezultata z uporabo strojnih metod prenosa podatkov. Takrat bo to pomožni mikrokrmilnik, glavni pa bo od njega samo sprejemal podatke in jih obdeloval združljivo z drugimi procesi. Na splošno je še vedno odvisno od frekvence procesorja. Nekoč se je dalo mega overclockati nad 20 MHz, a za ta opravila bomo verjetno dobili le glike pri visokih frekvencah. Ideja je dobra, če bi le več matematičnih delov napisali ... je njena implementacija na MK
  • Naredil sem tudi več zanimivih analizatorjev: You Tube ali različica na barvnem LCD-ju: You Tube temelji na znameniti knjižnici Chen :)
  • "izračunati moramo kot (stopinje)" Ali nam lahko kdo pove podrobneje, kako se izračunajo vrednosti za te tabele?
  • S tabelo sinusov in kosinusov je vse jasno. Ni jasno, kako se izračunajo vrednosti v tabeli degree_lookup?

Vsi signali, ne glede na to, ali ste si jih izmislili ali opazovali v vesolju, so v resnici samo vsota preprostih sinusnih valov različnih frekvenc.

Naredil sem majhen avdio spektralni analizator (0 - 10 kHz) iz 16x2 LCD in mikrokontrolerja ATmega32. Začel sem s preprostimi DFT (diskretna Fourierjeva transformacija). FFT (Fast Fourier Transform) se od DFT razlikuje le po večji hitrosti in nekoliko bolj kompleksnem algoritmu, jaz ga nisem uporabljal, mogoče ga bom dodal kasneje.

DFT je počasen v primerjavi s FFT. Moj spektralni analizator LCD ne potrebuje visoke hitrosti, ki jo lahko zagotovi FFT, in če se slika na zaslonu spreminja s hitrostjo približno 30 sličic/s, potem je to več kot dovolj za vizualizacijo zvočnega spektra. Lahko pa že dosežem okoli 100 fps, vendar previsoka frekvenca osveževanja ni priporočljiva za LCD. Zvok, vzorčen pri 20 kHz, ustvari 32 točk DFT. Ker je rezultat transformacije simetričen, moram uporabiti le prvih 16 rezultatov. V skladu s tem je največja frekvenca 10 kHz. Tako je 10kHz/16 = 625Hz.

Poskušal sem povečati hitrost izračuna DFT. Če obstaja točka N DFT, potem moramo najti sinus in kosinus (N^2)/2. Za 32-točkovni DFT moramo najti sinus in kosinus od 512. Preden najdemo sinus in kosinus, najti moramo kot (stopinje), ki zasede nekaj CPU časa. Da bi to naredil, sem naredil tabele za sinus in kosinus. Naredil sem 16-bitne spremenljivke sinusa in kosinusa tako, da sem vrednosti sinusa in kosinusa pomnožil z 10000. Po pretvorbi moram vsak rezultat deliti z 10000. Zdaj lahko izračunam 120 32-točkovnih DFT-jev na sekundo, kar je več kot dovolj za spektralni analizator.

Zaslon

Uporabil sem prilagojene znake LCD, naložene v 64 bajtov vgrajenega pomnilnika LCD. Na spletu sem videl videoposnetek, kjer je LCD 16x2 uporabljen kot zaslon analizatorja spektra, in uporabil to idejo.

Avdio vhod

Eden najpomembnejših delov spektralnega analizatorja je pridobivanje signala iz elektretnega mikrofona. Posebno pozornost je treba nameniti razvoju predojačevalnik za mikrofon. Na vhodu ADC moramo nastaviti ničelno raven in najvišjo raven, ki je enaka polovici napajalne napetosti, tj. 2,5 V. Napaja se lahko z napetostjo od -2,5 V do +2,5 V. Predojačevalnik mora biti konfiguriran tako, da ne preseže teh omejitev. Uporabil sem operacijski ojačevalnik LM324 kot predojačevalec za mikrofon.

Seznam radioelementov

Imenovanje Vrsta Denominacija Količina OpombaTrgovinaMoja beležka
Zaslon
MK AVR 8-bitni

ATmega32

1 V beležnico
Kondenzator22 pF2 V beležnico
Kondenzator0,1 µF1 V beležnico
Elektrolitski kondenzator100 µF1 V beležnico
upor

100 ohmov

1 V beležnico
Trimer upor4,7 kOhm1 V beležnico
Kvarčni resonator16 MHz1 V beležnico
LCD zaslon16x21 V beležnico
napajalna enota5 V1 V beležnico
Avdio vhod
U1 Operacijski ojačevalnik

LM324

1 V beležnico
C1 Kondenzator1 µF1 V beležnico
C8 Kondenzator0,01 µF1 V beležnico
R1 upor

220 kOhm

1 V beležnico
R2, R3 upor

10 kOhm

2 V beležnico
R4, R9 upor

1 kOhm

2 V beležnico
R5 upor

Obstaja veliko specializiranih procesorjev za digitalno obdelavo signalov (DSP), kot je DSP iz serije Texas Instruments TMS320, ki vključuje preprosta celoštevilska jedra in takšne pošasti, kot je poddružina družine C6000, ki obdeluje podatke s plavajočo vejico. Obstaja cela serija ADSP podjetja Analog Devices (ki vključuje bolj ali manj univerzalni BlackFin), obstaja tudi več enostavne rešitve podjetja MicroChip - dsPIC.

Vendar je specializiran DSP dober, a je vedno tako potreben? Da, z ogromnim pretokom informacij je preprosto nenadomestljiv, vendar obstajajo tudi enostavnejša opravila obdelave. Konkretno me je zanimala naloga dvojne pretvorbe - zvočni signal se zvije, s čimer dobimo spekter, nato lahko na spektru izvedemo poljubne operacije in izvedemo inverzno pretvorbo, s čimer dobimo obdelan signal. Vse to je treba narediti v realnem času in doseči kakovost, ki ni nižja od kakovosti telefona.

Ni leto 2000, obstajajo rešitve z enim čipom na osnovi zmogljivih jeder ARM7/Cortex-M3, ki so se močno pocenile, so 32-bitne, imajo strojno izvedbo 32-bitne operacije množenja (še več). , skoraj operacija množenja-kopičenja DSP in 64-bitni rezultat), Cortex-M3 pa vključuje tudi delitev strojne opreme.

Takoj vas želim opozoriti, da obdelava signalov ni moja posebnost, skoraj vse znanje (ali bolje rečeno, razumevanje principov) je bilo ohranjeno iz inštituta, zdaj pa sem ga želel samo preizkusiti in implementirati. Mislim na to, da lahko pride do netočnosti v opisu, zamenjave pojmov itd. Pravzaprav me akademska natančnost ni zelo skrbela.

Za skoraj vsak DSP je zgoraj opisana naloga preprosta in enostavna. Toda kako se bo na njem obnašalo splošno jedro RISC? Če upoštevamo AVR ali PIC, potem verjetno ne bosta dovolj. Učinkujeta 8-bit in nizka taktna frekvenca. Čeprav ima Elm-Chan načrte, v katerih izvaja FFT na AVR in riše spekter signala. Vendar se v tem primeru v realnem času izvede zgolj vizualizacija (z minimalno natančnostjo obdelave) in ne popolna obdelava signala s sprejemljivo kakovostjo zvoka.

Kot eksperimentalni čip je bil izbran LPC2146, ki temelji na jedru ARM7TDMI-S in ima največjo taktno frekvenco 60 MHz (v praksi ne deluje pri 72 ali celo 84 MHz). Zakaj? Prvič, zanj imam ploščo za odpravljanje napak, in drugič, na krovu sta ADC in DAC, tj. potrebna minimalna zunanja obloga.

Malo teorije

Najprej je bilo zanimivo oceniti delovanje FFT (Fast Fourier Transform) na mikrokontrolerjih ARM. Na podlagi te ocene lahko sklepamo, ali ima dovolj hitrosti za obdelavo toka zvočnih podatkov ter signal, s kakšno frekvenco vzorčenja in koliko kanalov lahko na takem mikrokontrolerju obdelamo.

Na podlagi Fourierove transformacije lahko zgradite pametne filtre (z zelo privlačnimi lastnostmi). Zanimali so me predvsem problemi spreminjanja tona signala (zvišanje in nižanje spektra) in “odboja” spektra. Slednji je potreben v radijskih postajah SDR za poslušanje radijskih oddaj LSB v spodnjem stranskem pasu.

Ne bom vas obremenjeval s teorijo in razlagal, kaj je Fourierjeva transformacija; materialov na to temo je kar nekaj, kar sem uporabil: wiki in poglavje iz zelo dobre in poučne knjige.

Izvedba programske opreme

Obstaja veliko programskih izvedb FFT, vendar sem napisal svojo. Glavni cilj, ki sem si ga zasledoval, je bila optimizacija kode za določeno arhitekturo. Prvič, takoj sem se osredotočil na 32-bitno, drugič, potrebni so bili samo celoštevilski izračuni in zaželeno je bilo, da se izognemo operaciji deljenja. Najti nekaj pripravljenega, da bi zadostilo tem zahtevam, je že problematično.

Vse konstante, ki jih je bilo mogoče izračunati vnaprej, so bile izračunane in uvrščene v tabele (predvsem vrednosti trigonometričnih funkcij). To je glavna optimizacija algoritma, sicer skoraj v celoti ponavlja opisani algoritem.

Najpomembnejša je zahteva po celoštevilskih izračunih. Med postopkom implementacije je prišlo celo do napake, ki je povzročila prelivanje v eni izmed 32-bitnih spremenljivk zanke. Poleg tega se ni pojavil na vseh testnih podatkih, zato je povzročal nemalo preglavic, dokler ga niso našli.

Vsa izvorna besedila sem zbrala v enem arhivu. Implementacija ni dokončna, prihaja do podvojenih izračunov (spekter in fazna simetrija nista upoštevani), potrebna pa je optimizacija uporabe medpomnilnikov, saj se trenutno preveč uporablja za izračune. pomnilnik z naključnim dostopom(skoraj 12k za pretvorbo 1024 točk).

Prvi testi

Drum roll: Preizkušam hitrost pretvorbe za vzorec 1024 točk, frekvenca jedra procesorja je 60 MHz. Testiranje je bilo izvedeno v emulatorju, zato ne trdi, da je 100-odstotno natančno, vendar se ta rezultat lahko uporabi kot indikator (po mojih prejšnjih izkušnjah, čeprav je emulator lagal, ni bilo veliko). Test prve različice kode, prevajalnik RealView MDK, možnost optimizacije O3, način generiranja kode ARM.

Torej, kaj vidimo:

6 ms za vsako pretvorbo, skupaj nekaj več kot 12 ms za povratno pretvorbo. Izkazalo se je, da bodo s frekvenco vzorčenja 44100 Hz (standard za zvok) in vzorci z ločljivostjo do 16 bitov čisti izračuni trajali ~44*12 ms = 528 ms. In to na vmesni različici vdelane programske opreme, ko nekatere optimizacije kode še niso dokončane (po ocenah je mogoče algoritem pospešiti skoraj 2-krat)! Po mojem mnenju je to samo odličen pokazatelj.

Skupno naj bi bila obremenitev jedra okoli 50 %, nadaljnjih 50 % ostane za pretvorbe čez spekter in režijske stroške pri delu z ADC, DAC in drugimi prenosi podatkov. Če znižate frekvenco vzorčenja na "telefonsko" raven (približno 4800-9600Hz), bo obremenitev jedra še nižja (približno 15-30%).

Matematični del je torej bolj ali manj jasen. Lahko nadaljujete s konkretno izvedbo.

Železo

Za testno platformo smo uporabili razvojno ploščo Keil MCB2140 z zvočnikom. Kabel Mini-Jack je spajkan za povezavo z linearnim izhodom naprave in sestavljena je preprosta vhodna veriga. Kot že omenjeno ima plošča že zvočnik priključen na analogni izhod mikrokontrolerja in so krmilniki (gumb in potenciometer).

Tukaj je skica vhodnega vezja:


Odpravljanje napak v programski opremi je potekalo v fazah:

  1. Odpravljanje napak vseh potrebnih zunanjih naprav: ADC, DAC, časovniki, LED indikacija.
  2. Preizkus z digitalizacijo signala: podatke digitaliziram z zahtevano hitrostjo in jih dam v medpomnilnik, nato podatke ekstrahiram iz medpomnilnika in predvajam signal. Tisti. preprost premik signala v času, brez kakršnih koli transformacij. Na tej stopnji se testira mehanizem za delo z 2 medpomnilnikoma, ki sta potrebna za nadaljnje delo.
  3. TO prejšnja različica dodani sta direktna in inverzna Fourierjeva transformacija. Ta preizkus končno preveri pravilno delovanje kode FFT in preveri, ali se koda ujema z razpoložljivo zmogljivostjo.
  4. Ko je glavno okostje aplikacije narejeno, lahko nadaljujete s praktičnimi aplikacijami.

Težava je nastala po dodajanju FFT kodi: v signalu so se pojavili tuji šumi in piščalke. Na splošno se mi je to obnašanje zdelo precej čudno, saj... Brez pretvorbe je signal, ki je šel skozi digitalno pot, ostal precej čist. Prvi razlog za to: po analognem vezju amplituda signala na ADC ni bila polna (0-3,3 V), ampak le znotraj 0,5-2 V pri največji glasnosti predvajalnika, drugi: precej močan šum zaradi celega števila izračuni (+-1 enota, kar se je izkazalo za zadostno za povzročitev zvočnih motenj).

Za boj proti prvi težavi je bilo odločeno, da začnemo prilagajati analogni del. Da bi rešili težavo s hrupom, poskusite uporabiti nizkoprepustni filter.

Uporaba 1: spreminjanje tona signala

Plošča ima potenciometer ( spremenljivi upor), se lahko uporablja za nadzor. V tem primeru nastavi spekter signala tako, da se premika navzgor in navzdol, kar je dovolj za "preobrazbo" vaših najljubših kompozicij.

Evo, kaj se zgodi v frekvenčni domeni:


V tem primeru je rezultat pretvorbe v dveh medpomnilnikih. En medpomnilnik je realni del, drugi pa imaginarni del. Fizični pomen števil, pridobljenih v njih: realni del vsebuje vrednosti harmonikov, imaginarni del vsebuje fazni premik za te harmonike. Poleg tega, kot lahko vidite, je začetni signal opisan z N-vrednostmi, po pretvorbi pa dobimo 2N-vrednosti. Količina informacij se ne spremeni, 2-kratno povečanje količine informacij pa se pojavi zaradi dejstva, da imajo podatki medpomnilnika redundanco v obliki podvajanja vrednosti.




Vrh