Fourier-muunnoksen käytännön sovellus signaalinkäsittelyyn. Digitaalinen signaalinkäsittely ARM7-mikrokontrollereilla Fourier-muunnos avr

Fourier'n lauseessa sanotaan, että mikä tahansa signaali voidaan laajentaa sarjaksi ortonormaalissa jaksollisten funktioiden (esimerkiksi sinien ja kosinien) sarjassa taajuuksilla, jotka ovat jaksollisen signaalin taajuuden kerrannaisia. Signaalin spektrianalyysi perustuu siis painokertoimien (yleisessä tapauksessa kompleksisten) etsimiseen, joiden moduuli vastaa kaikkien harmonisten yleiseen superpositioon lisättyä vastaavan harmonisen värähtelytehon murto-osaa. .

Nopea Fourier-muunnos

Nopea Fourier-muunnos on laskenta-algoritmi, joka hyödyntää menestyksekkäästi trigonometristen funktioiden jaksollisuusominaisuuksia välttääkseen tarpeettomat laskelmat diskreetissä Fourier-muunnoksessa (DFT), mikä nopeuttaa kertoimien löytämistä Fourier-laajennuksessa. Suurin ero diskreetistä muuntamisesta on vain numeeristen arvojen laskentamenetelmässä (algoritmissa), ei itse signaalinkäsittelyssä. Sekä FFT:n että DFT:n tapauksessa laskelmien tulos on sama. Ainoa vaatimus FFT-algoritmille on otoskoko, joka on N = 2L:n kerrannainen, missä L on mikä tahansa positiivinen kokonaisluku. Yleisimmät base-2 FFT-algoritmit ovat: aikadesimaatti ja taajuusdesimaatti.

Tässä työssä on toteutettu kantaluku-2 FFT-algoritmi aikaohennuksella (Cooley-Tukey-algoritmi). Se on helppo saada tutkimalla joitain DFT-lakeja. Otetaan käyttöön niin kutsuttu rotaatiokerroin:

Tässä tapauksessa DFT:ssä Fourier-kertoimet useille signaaliarvoille (f0,f1,…,fN-1) ilmaistaan ​​suhteella:

Tarkastellaan neljän arvon signaalisarjaa: (f0,f1,f2,f3). Esitetään Fourier-muunnos matriisimuodossa (normalisointikerroin 1/N sisältyy lausekkeen oikealla puolella olevaan sarakevektoriin Cij):

Kun olet kirjoittanut rotaatiokertoimet Eulerin kaavalla ja määrittänyt niiden arvot k = 0, 1, 2,...9, voit rakentaa kaavion (kuva 2), josta näkyy toistuvien kertoimien kuvio.

Kuva 2. Tehosarja w, kun N=4

Korvaamalla numeeriset arvot arvoon (4), saadaan:

Eli w:n arvot w4:stä alkaen ovat yhtä suuria kuin vastaava arvo välillä w0 - w3. Seuraavaksi kirjoitamme uudelleen matriisiyhtälön (4) epätyypilliseen muotoon (lisätään samankaltaiset merkinnät lisätoimintojen selkeyden vuoksi):

Vaihdetaan matriisin sarakkeet ja jaetaan se kahteen ryhmään: parillisilla f0, f2 ja parittomilla f1, f3 indekseillä:

Otetaan huomioon, että wk+1 = wkw1, jolloin lauseke (6) kirjoitetaan uudelleen muotoon:

Käyttäen suhteita:

Saamme tarvittavat laajennuskertoimet sarakevektorin muodossa soluarvoilla:

Algoritmin graafinen esitys (kuva 3) näyttää perhoselta, jolla on avoimet siivet, minkä vuoksi tätä laskentatapaa kutsutaan nimellä "perhonen".

Kuva 3. Perhoskaavio 4 termin sarjalle

Joten algoritmin ensimmäisessä vaiheessa useiden signaaliarvojen jäsenet jaetaan parillisiin ja parittoihin indekseihin. Sitten suoritetaan "perhonen"-graafi, joka koostuu kahdesta vaiheesta, joiden lukumäärä on yhtä suuri kuin otoskoon kahden potenssi (N = 4 = 22). Jokaisessa vaiheessa suoritetaan kaksi "perhosta" ja niiden kokonaismäärä pysyy ennallaan. Jokainen perhosoperaatio vastaa yhtä kertolaskuoperaatiota. Vertailun vuoksi: DFT:ssä näytteenotolla (f0,f1,f2,f3) kertolasku olisi suoritettava 4×4 = 16 kertaa ja FFT:n tapauksessa vain 4 kertaa.

Tämä sarja voidaan kirjoittaa myös seuraavasti:

(2),
missä , k:s kompleksinen amplitudi.

Kerrointen (1) ja (3) välinen suhde ilmaistaan ​​seuraavilla kaavoilla:

Huomaa, että kaikki nämä kolme Fourier-sarjan esitystä ovat täysin vastaavia. Joskus Fourier-sarjan kanssa työskennellessä on kätevämpää käyttää imaginaarisen argumentin eksponenteja sinien ja kosinien sijaan, eli käyttää Fourier-muunnosta kompleksisessa muodossa. Mutta meille on kätevää käyttää kaavaa (1), jossa Fourier-sarja esitetään kosinien summana vastaavien amplitudien ja vaiheiden kanssa. Joka tapauksessa on väärin väittää, että todellisen signaalin Fourier-muunnos johtaa monimutkaisiin harmonisiin amplitudeihin. Kuten Wiki oikein sanoo, "Fourier-muunnos (?) on operaatio, joka yhdistää todellisen muuttujan yhden funktion toiseen funktioon, joka on myös todellinen muuttuja."

Kaikki yhteensä:
Signaalien spektrianalyysin matemaattinen perusta on Fourier-muunnos.

Fourier-muunnoksen avulla voit esittää jatkuvan funktion f(x) (signaali), joka on määritelty segmentillä (0, T) äärettömän määrän (ääretön sarja) summana trigonometrisiä funktioita (sini ja/tai kosini) tietyillä amplitudit ja vaiheet, myös segmentissä (0, T). Tällaista sarjaa kutsutaan Fourier-sarjaksi.

Huomattakoon vielä joitain kohtia, joiden ymmärtämistä tarvitaan Fourier-muunnoksen oikea soveltaminen signaalianalyysiin. Jos tarkastelemme Fourier-sarjaa (siniaaltojen summaa) koko X-akselilla, voimme nähdä, että segmentin (0, T) ulkopuolella Fourier-sarjan edustama funktio toistaa ajoittain funktioamme.

Esimerkiksi kuvion 7 kaaviossa alkuperäinen funktio on määritetty segmentille (-T\2, +T\2), ja Fourier-sarja edustaa jaksollista funktiota, joka on määritelty koko x-akselilla.

Tämä tapahtuu, koska sinimuotoiset itse ovat jaksollisia toimintoja, ja vastaavasti niiden summa on jaksollinen funktio.


Kuva 7 Ei-jaksollisen alkuperäisen funktion esitys Fourier-sarjalla

Täten:

Alkuperäinen funktiomme on jatkuva, ei-jaksollinen, määritelty tietylle segmentille, jonka pituus on T.
Tämän funktion spektri on diskreetti, eli se esitetään äärettömänä harmonisten komponenttien sarjana - Fourier-sarjana.
Itse asiassa Fourier-sarja määrittelee tietyn jaksollisen funktion, joka on sama kuin meidän segmentillä (0, T), mutta meille tällä jaksollisuudella ei ole merkitystä.

Harmonisten komponenttien jaksot ovat sen segmentin arvon (0, T) kerrannaisia, jolle alkuperäinen funktio f(x) on määritelty. Toisin sanoen harmoniset jaksot ovat signaalimittauksen keston kerrannaisia. Esimerkiksi Fourier-sarjan ensimmäisen harmonisen jakso on yhtä suuri kuin väli T, jolle funktio f(x) määritellään. Fourier-sarjan toisen harmonisen jakso on yhtä suuri kuin väli T/2. Ja niin edelleen (katso kuva 8).


Kuva 8 Fourier-sarjan harmonisten komponenttien jaksot (taajuudet) (tässä T = 2?)

Vastaavasti harmonisten komponenttien taajuudet ovat 1/T:n kerrannaisia. Toisin sanoen harmonisten komponenttien Fk taajuudet ovat yhtä suuria kuin Fk = k\T, missä k vaihtelee välillä 0 -?, esimerkiksi k = 0 F0 = 0; k = 1 F1 = 1\T; k = 2 F2 = 2\T; k=3 F3=3\T;… Fk= k\T (nollataajuudella - vakiokomponentti).

Olkoon alkuperäinen funktiomme signaali, joka on tallennettu aikana T=1 sek. Tällöin ensimmäisen harmonisen jakso on yhtä suuri kuin signaalimme kesto T1=T=1 sek ja harmoninen taajuus on 1 Hz. Toisen harmonisen jakso on yhtä suuri kuin signaalin kesto jaettuna 2:lla (T2=T/2=0,5 s) ja taajuus on 2 Hz. Kolmannelle harmoniselle T3=T/3 sek ja taajuus on 3 Hz. Ja niin edelleen.

Yliaaltojen välinen askel on tässä tapauksessa 1 Hz.

Siten signaali, jonka kesto on 1 sekunti, voidaan hajottaa harmonisiksi komponenteiksi (saada spektri) taajuusresoluutiolla 1 Hz.
Jos haluat kasvattaa resoluutiota 2 kertaa 0,5 Hz:iin, sinun on pidennettävä mittauksen kestoa 2 kertaa - enintään 2 sekuntiin. 10 sekuntia kestävä signaali voidaan hajottaa harmonisiksi komponenteiksi (spektrin saamiseksi) 0,1 Hz:n taajuusresoluutiolla. Ei ole muita tapoja lisätä taajuusresoluutiota.

On olemassa tapa pidentää keinotekoisesti signaalin kestoa lisäämällä näytteiden joukkoon nollia. Mutta se ei lisää todellista taajuuden resoluutiota.

3. Diskreetit signaalit ja diskreetti Fourier-muunnos

Digitaalitekniikan kehittyessä myös mittaustietojen (signaalien) tallennustavat ovat muuttuneet. Jos aikaisemmin signaali voitiin nauhoittaa nauhuriin ja tallentaa nauhalle analogisessa muodossa, nyt signaalit digitoidaan ja tallennetaan tietokoneen muistiin tiedostoihin numerosarjana (näytteitä).

Tavanomainen menetelmä signaalin mittaamiseksi ja digitoimiseksi on seuraava.


Kuva 9 Mittauskanavan kaavio

Signaali lähteestä mittausanturi saapuu ADC:hen ajanjakson T aikana. Ajan T aikana saadut signaalinäytteet (näytteenotto) siirretään tietokoneelle ja tallennetaan muistiin.


Kuva 10 Digitoitu signaali - N näytettä vastaanotettu aikana T

Mitä vaatimuksia signaalin digitointiparametreille on? Laite, joka muuntaa analogisen tulosignaalin erilliseksi koodiksi ( digitaalinen signaali) kutsutaan analogia-digitaalimuuntimeksi (ADC, englanti Analog-to-digital converter, ADC) (Wiki).

Yksi ADC:n pääparametreista on suurin näytteenottotaajuus (tai näytteenottotaajuus, englanniksi sample rate) - aikajatkuvan signaalin näytteenottotaajuus sitä näytteistettäessä. Se mitataan hertseinä. ((Wiki))

Kotelnikovin lauseen mukaan, jos jatkuvalla signaalilla on taajuuden Fmax rajoittama spektri, niin se voidaan rekonstruoida täysin ja yksiselitteisesti sen aikavälein otetuista diskreeteistä näytteistä. , eli taajuudella Fd? 2*Fmax, jossa Fd on näytteenottotaajuus; Fmax - signaalispektrin maksimitaajuus. Toisin sanoen signaalin digitalisointitaajuuden (ADC-näytteenottotaajuuden) on oltava vähintään 2 kertaa suurempi kuin mitattavan signaalin maksimitaajuus.

Mitä tapahtuu, jos otamme näytteitä pienemmällä taajuudella kuin Kotelnikovin lause vaatii?

Tässä tapauksessa tapahtuu "aliasing"-efekti (tunnetaan myös nimellä stroboskooppinen efekti, moiré-efekti), jossa korkeataajuinen signaali muuttuu digitoinnin jälkeen matalataajuiseksi signaaliksi, jota ei todellisuudessa ole olemassa. Kuvassa 5 punainen korkeataajuinen siniaalto on todellinen signaali. Matalataajuinen sininen siniaalto on kuvitteellinen signaali, joka syntyy siitä, että näytteenottoaikana yli puolet korkeataajuisesta signaalista ehtii ohittaa.


Riisi. 11. Väärän matalataajuisen signaalin esiintyminen riittämättömän suurella näytteenottotaajuudella

Aliasing-efektin välttämiseksi ADC:n eteen on asetettu erityinen anti-aliasing-suodatin - alipäästösuodatin (LPF), joka läpäisee taajuudet, jotka ovat alle puolet ADC:n näytteenottotaajuudesta, ja katkaisee korkeammat taajuudet.

Signaalin spektrin laskemiseksi sen diskreeteistä näytteistä käytetään diskreettiä Fourier-muunnosta (DFT). Todettakoon vielä kerran, että diskreetin signaalin spektriä "määritelmän mukaan" rajoittaa taajuus Fmax, joka on alle puolet näytteenottotaajuudesta Fd. Siksi diskreetin signaalin spektri voidaan esittää äärellisen määrän harmonisten summalla, toisin kuin jatkuvan signaalin Fourier-sarjan ääretön summa, jonka spektri voi olla rajoittamaton. Kotelnikovin lauseen mukaan harmonisen maksimitaajuuden tulee olla sellainen, että se vastaa vähintään kahta näytettä, joten harmonisten lukumäärä on yhtä suuri kuin puolet diskreetin signaalin näytteiden lukumäärästä. Eli jos näytteessä on N näytettä, niin spektrin harmonisten lukumäärä on yhtä suuri kuin N/2.

Tarkastellaan nyt diskreetti Fourier-muunnos (DFT).

Fourier-sarjaan verrattuna

Näemme, että ne ovat samat, paitsi että aika DFT:ssä on luonteeltaan diskreetti ja harmonisten määrää rajoittaa N/2 - puolet näytteiden lukumäärästä.

DFT-kaavat kirjoitetaan dimensiottomiin kokonaislukumuuttujiin k, s, joissa k ovat signaalinäytteiden lukumäärä, s ovat spektrikomponenttien lukumäärät.
Arvo s osoittaa täydellisten harmonisten värähtelyjen lukumäärän ajanjaksolla T (signaalin mittauksen kesto). Diskreetin Fourier-muunnoksen avulla löydetään harmonisten amplitudit ja vaiheet numeerisella menetelmällä, ts. "tietokoneella"

Palatakseni alussa saatuihin tuloksiin. Kuten edellä mainittiin, kun ei-jaksollinen funktio (meidän signaalimme) laajennetaan Fourier-sarjaksi, tuloksena oleva Fourier-sarja itse asiassa vastaa jaksollista funktiota, jonka jakso on T (kuvio 12).


Kuva 12 Jaksofunktio f(x) jaksolla T0, mittausjaksolla T>T0

Kuten kuviosta 12 voidaan nähdä, funktio f(x) on jaksollinen jakson T0 kanssa. Koska mittausnäytteen T kesto ei kuitenkaan ole sama kuin funktion T0 jakso, Fourier-sarjana saadussa funktiossa on epäjatkuvuus kohdassa T. Tämän seurauksena tämän funktion spektri sisältää suuri määrä korkeataajuisia harmonisia. Jos mittausnäytteen T kesto osuisi yhteen funktion T0 jakson kanssa, niin Fourier-muunnoksen jälkeen saatu spektri sisältäisi vain ensimmäisen harmonisen (sinusoidin, jonka jakso on yhtä suuri kuin näytteenoton kesto), koska funktio f(x) on sinusoidi.

Toisin sanoen DFT-ohjelma "ei tiedä", että signaalimme on "siniaaltokappale", vaan yrittää esittää jaksollisen funktion sarjan muodossa, jossa on epäjatkuvuus yksittäisten osien epäjohdonmukaisuuden vuoksi. sinusoidi.

Tämän seurauksena spektriin ilmestyy harmonisia, joiden pitäisi summata funktion muoto, mukaan lukien tämä epäjatkuvuus.

Siten signaalin "oikean" spektrin saamiseksi, joka on useiden eri jaksollisten siniaaltojen summa, on välttämätöntä, että kunkin siniaallon jaksojen kokonaisluku mahtuu signaalin mittausjaksoon. Käytännössä tämä ehto voidaan täyttää riittävän pitkällä signaalin mittausajalla.


Kuva 13 Esimerkki vaihteiston kinemaattisen virhesignaalin toiminnasta ja spektristä

Lyhyemmällä kestolla kuva näyttää "pahemmalta":


Kuva 14 Esimerkki roottorin värähtelysignaalin toiminnasta ja spektristä

Käytännössä voi olla vaikeaa ymmärtää, missä ovat "todelliset komponentit" ja missä ovat "artefaktit", jotka johtuvat komponenttien useista jaksoista ja signaalin näytteenoton kestosta tai "hyppyistä ja katkoksista" signaalin muodossa. . Tietenkin sanat "todelliset komponentit" ja "artefaktit" laitetaan lainausmerkkeihin syystä. Monien harmonisten esiintyminen spektrikaaviossa ei tarkoita, että signaalimme todella "koostuu" niistä. Tämä on sama kuin ajatella, että numero 7 "koostuu" luvuista 3 ja 4. Luku 7 voidaan esittää lukujen 3 ja 4 summana - tämä on oikein.

Joten signaalimme... tai pikemminkin ei edes "meidän signaalimme", vaan jaksollinen funktio, joka muodostuu toistamalla signaaliamme (näytteenotto), voidaan esittää harmonisten (siniaaltojen) summana tietyillä amplitudeilla ja vaiheilla. Mutta monissa käytännön kannalta tärkeissä tapauksissa (katso yllä olevat kuvat) on todellakin mahdollista yhdistää spektrissä saadut harmoniset todellisiin prosesseihin, jotka ovat luonteeltaan syklisiä ja vaikuttavat merkittävästi signaalin muotoon.

Joitakin tuloksia

1. Todellisella mitatulla signaalilla, jonka kesto on T sekuntia ja joka on digitoitu ADC:llä, eli joka on esitetty joukolla diskreettejä näytteitä (N kappaletta), on diskreetti ei-jaksollinen spektri, jota edustaa joukko harmonisia (N/ 2 kappaletta).

2. Signaalia edustaa joukko todellisia arvoja ja sen spektriä edustaa joukko todellisia arvoja. Harmoniset taajuudet ovat positiivisia. Se, että matemaatikoille on kätevämpää esittää spektriä monimutkaisessa muodossa negatiivisia taajuuksia käyttäen, ei tarkoita, että "tämä on oikein" ja "tämä pitäisi aina tehdä".

3. Aikavälillä T mitattu signaali määritetään vain aikavälillä T. Mitä tapahtui ennen signaalin mittaamisen aloittamista ja mitä sen jälkeen tapahtuu, on tieteelle tuntematon. Ja meidän tapauksessamme se ei ole kiinnostavaa. Aikarajoitetun signaalin DFT antaa "todellisen" spektrinsä siinä mielessä, että tietyissä olosuhteissa sen avulla voidaan laskea sen komponenttien amplitudi ja taajuus.

Käytetyt materiaalit ja muut hyödylliset materiaalit.

Kaksirivistä LCD-merkkiä käytetään näyttölaitteena. Pääkohta tämän projektin toteutuksessa ei ole laitteisto, vaan ohjelmisto, tarkemmin sanottuna diskreetin Fourier-muunnoksen (DFT) toteutus 8-bittisessä mikro-ohjaimessa. On heti huomattava, että kirjoittaja ei ole tämän alan asiantuntija ja siksi aloitti perusasioista - yksinkertaisella diskreetillä Fourier-muunnolla. Nopea Fourier-muunnosalgoritmi ei ole vain nopea, vaan myös melko monimutkainen.

Diskreetti Fourier-muunnos (englanninkielisessä kirjallisuudessa DFT, Discrete Fourier Transform) on yksi Fourier-muunnoksista, joita käytetään laajalti digitaalisissa signaalinkäsittelyalgoritmeissa (sen muunnelmia käytetään MP3:n äänen pakkaamisessa, JPEG:n kuvanpakkauksessa jne.) sekä mm. muut alat, jotka liittyvät diskreetin (esimerkiksi digitalisoidun analogisen) signaalin taajuuksien analysointiin. Diskreetti Fourier-muunnos vaatii diskreetin funktion syötteenä. Tällaisia ​​toimintoja luodaan usein näytteenotolla (näytteenottoarvot jatkuvista funktioista).

Spektrianalysaattorin kaavio äänimerkki on hyvin yksinkertainen ja voidaan karkeasti jakaa digitaalisiin ja analogisiin osiin.

Digitaalinen osa muodostuu mikro-ohjaimesta ja siihen kytketystä LCD-näytöstä. Mikro-ohjain on kellotettu alkaen kvartsiresonaattori 16 MHz, +5 V:n syöttöjännitettä käytetään mikro-ohjaimen ADC:n referenssijännitteenä.
LCD-näytön dataväylä on kytketty mikro-ohjaimen porttiin C (tulo/lähtölinjat PC0-PC3), ohjausväylä mikro-ohjaimen porttiin D (PD5, PD6). Ilmaisin toimii 4-bittisessä tilassa. Kontrastin säätämiseen käytetään säädettävää vastusta, jonka nimellisarvo on 4,7 kOhm. Ilmaisimen kanssa työskentelyä varten luotiin mukautettuja symboleja, jotka näyttävät analysaattorin 8 vaakasuoraa saraketta; nämä mukautetut symbolit vievät kaikki LCD-ilmaisimen 64 tavua RAM-muistista.

Mikro-ohjain toimii ulkoisesta 16 MHz kvartsiresonaattorista.

Laitteen analoginen osa on tärkein osa ja se on elektreettimikrofonin signaalin esivahvistin, jonka lähtö on kytketty mikrokontrolleriin sisäänrakennetun ADC:n ADC0-kanavaan. Meidän on asetettava ADC-tulon nollataso tasan puoleen referenssijännitteestä, ts. 2,5 V. Tässä tapauksessa voimme käyttää signaalin positiivista ja negatiivista puoliaaltoa, mutta sen amplitudi ei saa ylittää asetettua rajaa, ts. Vahvistus on hienosäädettävä ylikuormituksen estämiseksi. Yhteinen pienitehoinen operaatiovahvistimen mikropiiri täyttää kaikki yllä olevat ehdot.

DFT-algoritmi on hieman hitaampi verrattuna nopeaan Fourier-muunnokseen. Mutta spektrianalysaattorimme ei vaadi suurta nopeutta, ja jos se pystyy tarjoamaan päivitysnopeuden noin 30 kuvaa sekunnissa, tämä on enemmän kuin tarpeeksi visualisoimaan äänisignaalin spektrin. Joka tapauksessa meidän versiossamme on mahdollista saavuttaa nopeus 100 kuvaa sekunnissa, mutta tämä on jo liian korkea parametriarvo kaksiriviselle LCD-näytölle, eikä sitä suositella. Näytteenottotaajuus on 20 kHz 32 pisteen diskreetille Fourier-muunnokselle ja koska muunnoksen tulos on symmetrinen, tarvitsemme käyttää vain ensimmäistä puoliskoa, ts. ensimmäiset 16 tulosta. Siksi voimme näyttää taajuusspektrin 10 kHz asti ja analysaattorin resoluutio on 10 kHz/16 = 625 Hz.

Suunnitelman kirjoittaja yritti lisätä DFT-laskelmien nopeutta. Jos tässä muunnoksessa on N pistettä, meidän on löydettävä sinin ja kosinin N2/2-arvot. 32 pisteen muunnokseen meidän on löydettävä 512 sini- ja kosiniarvot. Mutta ennen niiden löytämistä meidän on laskettava kulma (asteet), joka vie jonkin verran CPU-aikaa, joten päätettiin käyttää arvotaulukoita näihin laskelmiin. Mikrokontrolleriohjelmassa laskettaessa ei käytetä liukulukuja ja kaksinkertaisia ​​tarkkuuslukuja, koska niiden käsittely kestää pidempään 8-bittisellä mikro-ohjaimella. Sen sijaan hakutaulukoiden arvot käyttävät 16-bittistä kokonaislukudataa kerrottuna 10 000:lla. Sitten muunnoksen jälkeen tulokset jaetaan 10 000:lla. Tällä lähestymistavalla on mahdollista suorittaa 120 32 pisteen muuntamista sekunnissa. , mikä on enemmän kuin tarpeeksi laitteillemme.

Spektrianalysaattorin toiminnan esittely ATmega32-mikrokontrollerissa

Lataukset

Lähdekoodi (mikrokontrolleriohjelma, sini-, kosini- ja kulmatietotaulukot) -

  • On selvää, että valoa ja musiikkia pidemmälle on vaikea mennä AVR:llä, parametrit eivät ole oikeat. Mutta 120 32 pisteen muunnosa sekunnissa saattaa riittää useimpiin tehtäviin. Ja voit tietysti ottaa toisen näytteen 625 Hz, tai pikemminkin menettää virkistystaajuuden. On syytä huomata, että MK:sta tulee huono olo; suorituskyvyn suhteen siihen ei ole juurikaan muuta kiinnitettävissä. Mutta täällä voit järjestää tuloksen tulostuksen laitteiston tiedonsiirtomenetelmillä. Sitten se on lisämikro-ohjain, ja pääyksikkö vastaanottaa vain tietoja siitä ja käsittelee sen muiden prosessien kanssa yhteensopivaksi. Yleensä se riippuu edelleen prosessorin taajuudesta. Kerran oli mahdollista ylikellottaa mega yli 20 MHz, mutta näihin tehtäviin saamme todennäköisesti vain korkeilla taajuuksilla vikoja. Idea on hyvä, jos vain matematiikan osia kirjoitettaisiin enemmän... se on sen toteutus MK:lla
  • Olen tehnyt myös mielenkiintoisempia analysaattoreita: You Tube tai versio värillisellä LCD-näytöllä: You Tube perustuu kuuluisaan Chen-kirjastoon :)
  • "Meidän täytyy laskea kulma (asteet)" Voiko joku kertoa meille tarkemmin, kuinka näiden taulukoiden arvot lasketaan?
  • Sini- ja kosinitaulukon kanssa kaikki on selvää. Ei ole selvää, kuinka asteen_hakutaulukon arvot lasketaan?

Kaikki signaalit, keksitpä ne tai havaitsit ne maailmankaikkeudessa, ovat oikeastaan ​​vain eri taajuuksien yksinkertaisten siniaaltojen summa.

Tein pienen audiospektrianalysaattorin (0 - 10 kHz) 16x2 LCD:stä ja ATmega32 mikrokontrollerista. Aloitin yksinkertaisilla DFT:illä (Discrete Fourier Transform). FFT (Fast Fourier Transform) eroaa DFT:stä vain suuremmalla nopeudella ja hieman monimutkaisemmalla algoritmilla, en käyttänyt sitä, ehkä lisään sen myöhemmin.

DFT on hidas verrattuna FFT:hen. LCD-spektrianalysaattorini ei vaadi FFT:n tarjoamaa suurta nopeutta, ja jos kuva näytöllä muuttuu nopeudella noin 30 kuvaa sekunnissa, tämä on enemmän kuin tarpeeksi visualisoimaan äänispektrin. Mutta voin jo saavuttaa noin 100 fps, mutta liian korkeaa virkistystaajuutta ei suositella LCD-näytölle. 20 kHz:llä näytteitetty ääni tuottaa 32 DFT-pistettä. Koska muunnostulos on symmetrinen, minun tarvitsee käyttää vain ensimmäiset 16 tulosta. Vastaavasti maksimitaajuus on 10 kHz. Siten 10kHz/16 = 625Hz.

Yritin lisätä DFT-laskennan nopeutta. Jos on piste N DFT, meidän on löydettävä sini ja kosini (N^2)/2. Jos kyseessä on 32 pisteen DFT, meidän on löydettävä arvon 512 sini ja kosini. Ennen kuin löydämme sinin ja kosinin, meidän on löydettävä kulma (asteet), joka vie jonkin verran CPU-aikaa. Tätä varten tein taulukot sinille ja kosinille. Tein sini- ja kosini 16-bittiset muuttujat kertomalla sini- ja kosiniarvot 10 000:lla. Muunnoksen jälkeen joudun jakamaan jokainen tulos 10 000:lla. Nyt voin laskea 120 32 pisteen DFT:tä sekunnissa, mikä on enemmän kuin riittää spektrianalysaattorille.

Näyttö

Käytin mukautettuja LCD-merkkejä, jotka oli ladattu sisäiseen LCD-muistiin 64 tavua. Näin verkossa videon, jossa 16x2 LCD:tä käytetään spektrianalysaattorin näyttönä, ja käytin tätä ideaa.

Äänitulo

Yksi spektrianalysaattorin tärkeimmistä osista on signaalin hankkiminen elektreettimikrofonista. Kehittämiseen tulee kiinnittää erityistä huomiota esivahvistin mikrofonia varten. Meidän on asetettava nollataso ADC-tuloon ja maksimitaso puoleen syöttöjännitteestä, ts. 2,5V. Se voidaan syöttää jännitteellä -2,5 V - +2,5 V. Esivahvistin on konfiguroitava niin, ettei se ylitä näitä rajoja. Käytin LM324-operaatiovahvistinta mikrofonin esivahvistimena.

Luettelo radioelementeistä

Nimitys Tyyppi Nimitys Määrä HuomautusMyymäläOma muistilehtiö
Näyttö
MK AVR 8-bittinen

ATmega32

1 Muistilehtiöön
Kondensaattori22 pF2 Muistilehtiöön
Kondensaattori0,1 µF1 Muistilehtiöön
Elektrolyyttikondensaattori100 µF1 Muistilehtiöön
Vastus

100 ohmia

1 Muistilehtiöön
Trimmerin vastus4,7 kOhm1 Muistilehtiöön
Kvartsi resonaattori16 MHz1 Muistilehtiöön
LCD-näyttö16x21 Muistilehtiöön
virtalähde5 V1 Muistilehtiöön
Äänitulo
U1 Operaatiovahvistin

LM324

1 Muistilehtiöön
C1 Kondensaattori1 µF1 Muistilehtiöön
C8 Kondensaattori0,01 µF1 Muistilehtiöön
R1 Vastus

220 kOhm

1 Muistilehtiöön
R2, R3 Vastus

10 kOhm

2 Muistilehtiöön
R4, R9 Vastus

1 kOhm

2 Muistilehtiöön
R5 Vastus

Digitaaliseen signaalinkäsittelyyn (DSP) on monia erikoistuneita prosessoreita, kuten Texas Instrumentsin TMS320-sarjan DSP, joka sisältää sekä yksinkertaisia ​​kokonaislukuytimiä että sellaisia ​​hirviöitä, kuten C6000-perheen alaperhe, joka käsittelee liukulukudataa. Analog Devicesilta on olemassa koko ADSP-sarja (johon sisältyy enemmän tai vähemmän universaali BlackFin), on myös enemmän yksinkertaisia ​​ratkaisuja MicroChip - dsPIC.

Erikoistunut DSP on kuitenkin hyvä, mutta onko se aina niin tarpeellista? Kyllä, valtavalla tietovirralla se on yksinkertaisesti korvaamaton, mutta on myös yksinkertaisempia käsittelytehtäviä. Erityisesti olin kiinnostunut kaksoismuunnostehtävästä - äänisignaali konvoloidaan, jolloin saadaan spektri, sitten spektrille voidaan suorittaa mitä tahansa operaatioita ja käänteinen muunnos voidaan suorittaa, jolloin saadaan käsitelty signaali. Kaikki tämä on tehtävä reaaliajassa ja saada laatu vähintään puhelimen laatua.

Tämä ei ole vuosi 2000, on olemassa yksisiruisia korkean suorituskyvyn ARM7/Cortex-M3-ytimiin perustuvia ratkaisuja, joiden hinnat ovat laskeneet huomattavasti, ne ovat 32-bittisiä, niissä on laitteistototeutus 32-bittisellä kertolaskuoperaatiolla (lisäksi). , melkein DSP:n kertolaskuoperaatio ja 64-bittinen tulos), ja Cortex-M3 sisältää myös laitteistojaon.

Haluan varoittaa sinua heti, että signaalinkäsittely ei ole erikoisuuteni, melkein kaikki tieto (tai pikemminkin periaatteiden ymmärtäminen) säilyi instituutista, mutta nyt halusin vain testata ja toteuttaa sitä. Tarkoitan sitä, että kuvauksessa, käsitteiden korvaamisessa jne. voi olla epätarkkuuksia. Itse asiassa akateeminen tarkkuus ei huolestuttanut minua kovinkaan paljon.

Lähes kaikille DSP:ille yllä kuvattu tehtävä on yksinkertainen ja suoraviivainen. Mutta miten yleiskäyttöinen RISC-ydin käyttäytyy siinä? Jos otamme huomioon AVR:n tai PIC:n, ne eivät todennäköisesti riitä. 8-bittisellä ja matalalla kellotaajuudella on vaikutusta. Elm-Chanilla on kuitenkin suunnitelmia, joissa hän suorittaa FFT:n AVR:llä ja piirtää signaalin spektrin. Tässä tapauksessa reaaliajassa suoritetaan kuitenkin vain visualisointi (minimaalisella käsittelytarkkuudella), eikä signaalin täydellistä käsittelyä hyväksyttävällä äänenlaadulla.

LPC2146 valittiin kokeelliseksi siruksi, joka perustuu ARM7TDMI-S-ytimeen ja jonka maksimikellotaajuus on 60 MHz (käytännössä se ei toimi 72 tai edes 84 MHz:n taajuudella). Miksi? Ensinnäkin minulla on siihen debug-kortti, ja toiseksi siinä on ADC ja DAC, ts. Vähäinen ulkoinen viimeistely vaaditaan.

Vähän teoriaa

Ensinnäkin oli mielenkiintoista arvioida FFT:n (Fast Fourier Transform) suorituskykyä ARM-mikrokontrollereilla. Tämän arvion perusteella voimme päätellä, onko sillä tarpeeksi nopeutta käsitellä audiodatavirtaa, ja millä näytteenottotaajuudella ja kuinka monta kanavaa voidaan käsitellä sellaisella mikro-ohjaimella.

Fourier-muunnoksen perusteella voit rakentaa älykkäitä suodattimia (erittäin houkuttelevilla ominaisuuksilla). Minua kiinnostivat ensisijaisesti signaalin sävyn muuttamisen (spektrin nostaminen ja laskeminen) ja spektrin "heijastuksen" ongelmat. Jälkimmäistä tarvitaan SDR-radioissa LSB:n alemman sivukaistan radiolähetysten kuuntelemiseen.

En lataa teitä teorialla ja selitä, mitä Fourier-muunnos on; tästä aiheesta on melko paljon materiaalia siitä, mitä käytin: wiki ja luku erittäin hyvästä ja informatiivisesta kirjasta.

Ohjelmiston toteutus

FFT:lle on olemassa monia ohjelmistototeutuksia, mutta kirjoitin oman. Päätavoitteena pyrin optimoimaan koodin tiettyä arkkitehtuuria varten. Ensinnäkin keskityin heti 32-bittiseen, toiseksi vaadittiin vain kokonaislukulaskelmia ja jakotoimintoa oli toivottavaa välttää. Jo valmiin tuotteen löytäminen näiden vaatimusten täyttämiseksi on jo ongelmallista.

Kaikki vakiot, jotka voitiin laskea etukäteen, laskettiin ja sijoitettiin taulukoihin (lähinnä trigonometristen funktioiden arvot). Tämä on algoritmin tärkein optimointi, muuten se toistaa kuvatun algoritmin lähes kokonaan.

Tärkeintä on kokonaislukulaskelmien vaatimus. Toteutusprosessin aikana tapahtui jopa virhe, joka aiheutti ylivuodon yhdessä 32-bittisistä silmukkamuuttujista. Lisäksi se ei näkynyt kaikissa testitiedoissa, joten se aiheutti melkoista päänsärkyä, kunnes se löydettiin.

Kokosin kaikki lähdetekstit yhteen arkistoon. Toteutus ei ole lopullinen, siinä on päällekkäisiä laskelmia (spektri- ja vaihesymmetriaa ei oteta huomioon) ja puskurien käytön optimointia tarvitaan, koska laskelmiin käytetään tällä hetkellä liian monia RAM-muisti(melkein 12k 1024 pisteen muunnokselle).

Ensimmäiset testit

Rumpurulla: Testaan ​​muunnosnopeutta 1024 pisteen näytteelle, prosessorin ydintaajuus on 60 MHz. Testaus suoritettiin emulaattorissa, joten se ei väitä olevan 100% tarkka, mutta tätä tulosta voidaan käyttää indikaattorina (aiemmin kokemukseni mukaan, vaikka emulaattori valehteli, se ei ollut paljon). Koodin ensimmäisen version testi, RealView MDK -kääntäjä, O3-optimointivaihtoehto, ARM-koodin generointitila.

Joten mitä näemme:

6 ms jokaista muunnosa kohden, yhteensä hieman yli 12 ms edestakaisen muunnoksen osalta. Osoittautuu, että näytteenottotaajuudella 44100Hz (standardi audiolle) ja näytteillä, joiden resoluutio on jopa 16 bittiä, puhtaat laskelmat vievät ~44*12ms = 528ms. Ja tämä on laiteohjelmiston väliversiossa, kun joitain koodin optimointeja ei ole vielä saatu päätökseen (arvioiden mukaan algoritmia voidaan kiihdyttää melkein 2 kertaa)! Mielestäni se on vain erinomainen indikaattori.

Kaiken kaikkiaan ydinkuormituksen odotetaan olevan noin 50 %, 50 % jää jäljelle spektrin muunnoksille ja yleiskustannuksille työskennellessäsi ADC:iden, DAC:ien ja muiden tiedonsiirtojen kanssa. Jos lasket näytteenottotaajuuden "puhelin" tasolle (noin 4800-9600Hz), ytimen kuormitus on vielä pienempi (noin 15-30%).

Joten matemaattinen osa on enemmän tai vähemmän selvä. Voit siirtyä konkreettiseen toteutukseen.

Rauta

Testausalustana käytimme Keil MCB2140 -kehityskorttia kaiuttimella. Mini-Jack-johto juotetaan liitettäväksi laitteen lineaarilähtöön ja yksinkertainen syöttöketju kootaan. Kuten jo mainittiin, kortilla on jo kaiutin kytkettynä mikro-ohjaimen analogiseen lähtöön ja siellä on säätimet (painike ja potentiometri).

Tässä on luonnos tulopiiristä:


Ohjelmiston virheenkorjaus tapahtui vaiheittain:

  1. Kaikkien tarvittavien oheislaitteiden vianetsintä: ADC, DAC, ajastimet, LED-ilmaisin.
  2. Testi signaalin digitoinnilla: digitoin tiedot vaaditulla nopeudella ja laitan puskuriin, sitten puran tiedot puskurista ja toistan signaalin. Nuo. yksinkertainen signaalin siirto ajassa ilman muunnoksia. Tässä vaiheessa testataan mekanismia työskennellä 2 puskurilla, jotka ovat tarpeen jatkotyötä varten.
  3. TO aiempi versio Suorat ja käänteiset Fourier-muunnokset lisätään. Tämä testi lopulta varmistaa FFT-koodin oikean toiminnan sekä tarkistaa, että koodi sopii käytettävissä olevaan suorituskykyyn.
  4. Tämän jälkeen sovelluksen päärunko on valmis, voit siirtyä käytännön sovelluksiin.

Ongelma ilmeni, kun FFT oli lisätty koodiin: signaaliin ilmestyi ylimääräistä kohinaa ja pillejä. Yleisesti ottaen tämä käytös vaikutti minusta melko oudolta, koska... Ilman muuntamista digitaalisen polun läpi kulkeva signaali pysyi melko puhtaana. Ensimmäinen syy tähän: analogisen piirin jälkeen ADC:n signaalin amplitudi ei ollut täysi (0-3,3 V), vaan vain 0,5-2 V sisällä soittimen maksimiäänenvoimakkuudella, toinen: melko voimakas kohina kokonaisluvusta johtuen laskelmat (+-1 yksikkö, joka osoittautui riittäväksi aiheuttamaan äänihäiriöitä).

Ensimmäisen ongelman torjumiseksi päätettiin aloittaa analogisen osan säätäminen. Ja ratkaistaksesi meluongelman, yritä käyttää alipäästösuodatinta.

Sovellus 1: signaalin sävyn muuttaminen

Laudassa on potentiometri ( muuttuva vastus), sitä voidaan käyttää ohjaukseen. Tässä tapauksessa se asettaa signaalispektrin siirtymään ylös ja alas, aivan tarpeeksi "muuttamaan" suosikkisävellyksiäsi.

Tässä on mitä tapahtuu taajuusalueella:


Tässä tapauksessa muunnostulos sisältyy 2 puskuriin. Yksi puskuri on todellinen osa ja toinen on kuvitteellinen osa. Niissä saatujen numeroiden fyysinen merkitys: reaaliosa sisältää harmonisten arvot, imaginaariosa sisältää näiden harmonisten vaihesiirron. Lisäksi, kuten näet, alkuperäinen signaali kuvataan N-arvoilla, ja muuntamisen jälkeen saadaan 2N-arvoa. Tiedon määrä ei muutu, ja informaatiomäärän kaksinkertainen kasvu johtuu siitä, että puskuritiedoissa on redundanssia arvojen päällekkäisyyksien muodossa.




Yläosa