Sisällysluettelo:

QuickFFT: Nopea FFT Arduinolle: 3 vaihetta
QuickFFT: Nopea FFT Arduinolle: 3 vaihetta

Video: QuickFFT: Nopea FFT Arduinolle: 3 vaihetta

Video: QuickFFT: Nopea FFT Arduinolle: 3 vaihetta
Video: Luento 4: FFT-algoritmi 2024, Marraskuu
Anonim
QuickFFT: Nopea FFT Arduinolle
QuickFFT: Nopea FFT Arduinolle

Tyypillisellä Arduinolla on rajallinen RAM- ja prosessointiteho, ja FFT on laskennallisesti intensiivinen prosessi. Monissa reaaliaikaisissa sovelluksissa ainoa vaatimus on saada taajuus, jolla on suurin amplitudi tai jota tarvitaan taajuushuippujen havaitsemiseen.

Yhdessä ohjeistuksestani valmistin koodin FFT: lle, joka löytyy täältä: EasyFFT

Tämä koodi pystyi suorittamaan jopa 128 näytteen FFT: n Arduino nanolla. Tätä suurempi näyte ei ole mahdollista Arduinon rajoitetun muistin vuoksi. Olen muuttanut toimintoa hieman nopeuden parantamiseksi ja muistin kulutuksen vähentämiseksi. Tämän muutoksen ansiosta Arduino voi suorittaa FFT: n viisi kertaa nopeammin ja kuluttaa lähes puolet muistista. Tämä ohjekirja ei kata FFT: n työskentelyä, viitteet siihen löytyvät EasyFFT: stä.

Vaihe 1: Työskentely

Toimii
Toimii
Toimii
Toimii
Toimii
Toimii
Toimii
Toimii

Tyypillistä FFT -toimintoa muutetaan nopeuden parantamiseksi pienemmällä tarkkuudella. Kuten kuvassa näkyy, testisignaali on kerrottava sini- tai kosini -aaltomuodoilla. Nämä arvot voivat olla välillä 0 - 1, joten kelluvan kertolaskun tekeminen on välttämätöntä. Arduinossa kelluva kertolasku on hidasta kokonaislukuoperaatioihin verrattuna.

Tässä toiminnossa sini-/kosini -aalto korvataan neliöaallolla. Meidän on kerrottava testisignaali neliöaallolla, jonka arvo voi olla 0, 1 tai -1. Tästä syystä voimme korvata kelluvan kertolaskun yksinkertaisella kokonaislukulaskennalla tai vähennyksellä. Arduinolla kokonaisluku yhteenlasku tai vähennys on noin viisi kertaa nopeampi. Tämä tekee ratkaisusta noin 5 kertaa nopeampaa.

Tämän muutoksen vuoksi taajuusalueen arvot voidaan tallentaa kokonaislukuna (joka oli aiemmin kelluva) ja saamme toisen edun alhaisemmasta muistin kulutuksesta. Arduino Nanossa int kuluttaa 2 tavua muistia, kun taas float kuluttaa 4 tavua muistia. Tämän uuden koodin edun vuoksi voimme suorittaa FFT: n lähes 256 näytteelle (aiemmin 128 näytettä).

Normaalissa FFT: ssä meidän piti tallentaa siniarvo ratkaisun nopeuttamiseksi. Uudessa toiminnossa, koska emme enää vaadi sini-/kosini -arvoja, voimme poistaa sen ja säästää muistia.

Toteutus:

Tämän toiminnon toteuttaminen on suoraviivaista. Voimme yksinkertaisesti kopioida toiminnon koodin mukaan. Tämä toiminto voidaan suorittaa alla olevalla komennolla:

float f = Q_FFT (data, 256, 100); Toiminnossa Q_FFT, data: tämä termi on taulukko, jolla on signaaliarvot, suositeltu otoskoko on 2, 4, 8, 32, 64, 128, 256, 512,… eteenpäin. jos otoskoko ei kuulu näihin arvoihin, se leikataan arvojen lähimmälle alemmalle puolelle. jos esimerkiksi otoskoko on 75, FFT suoritetaan 64 näytemäärälle. Näytteen enimmäiskokoa rajoittaa käytettävissä oleva RAM Arduinolla.

Toinen termi määrittää näytteiden määrän taulukossa ja viimeinen termi on näytteenottotaajuus Hz.

Vaihe 2: Koodi

Tässä osassa selitetään EasyFFT -koodiin tehdyt muutokset, jotka on pidettävä mielessä koodia muutettaessa, 1. Kuten edellä on selitetty, tässä käytetään kokonaislukuja FFT: n tekemiseen. Int in Arduino on 16 -bittinen luku ja voi sisältää arvoja -32768 -32768. aina kun tämän int: n arvo ylittää tämän alueen, se aiheuttaa ongelman. tämän ongelman poistamiseksi aina tason laskennan jälkeen. jos jokin arvo ylittää 15000 täydellistä taulukkoa, jaetaan 100: lla. tämä estää int: n ylivuodon.

2. Amplitudin laskeminen: Amplitudin laskemiseksi todellinen ja kuvitteellinen osa täytyy neliöidä ja summan neliöjuuri vaaditaan. neliöinti ja funktion neliöjuuri vie aikaa. prosessin nopeuttamiseksi tämä koodi yksinkertaisesti tekee joitain todellisten ja kuvitteellisten osien suuruuksia. Tämä on varmasti vähemmän tarkka ja voi joissakin tapauksissa johtaa väärään johtopäätökseen. Voit halutessasi palata suuruuslaskennan normaalimenetelmään, mutta se vie enemmän aikaa ja sinun on myös tehtävä jonkinlainen järjestely näiden numeroiden tallentamiseksi.

3. Tässä koodissa ei ole moduulia useiden huippujen havaitsemiseen. Se valitsee yksinkertaisesti arvon, jolla on maksimiamplitudi (lukuun ottamatta ensimmäistä DC -offset -numeroa). Jos tarvitset useita huippuja, voit viitata EasyFFT -koodiin ja tehdä tarvittavat muutokset täällä. Siinä tapauksessa jokin taulukko/muuttuja on myös ilmoitettava yleiseksi muuttujaksi.

4. Toiminto sisältää seuraavan rivin:

unsigned int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};

edellä mainittujen muuttujien julistaminen globaaliksi muuttujiksi (liittäminen sen koodin alkuun) säästää jonkun 1 millisekunnin ajan jokaisessa suorituksessa.

5. Toisin kuin EasyFFT -toiminto, jossa 5 parasta huippua tallennettiin ennalta määritettyyn taulukkoon. Tämä toiminto palauttaa kelluvan arvon. tämä arvo edustaa taajuutta, jonka suurin amplitudi on Hz. Joten koodin esitys näyttää tältä.

float f = Q_FFT (data, 256, 100);

6. Huipputunnistus: Kun taajuus, jolla on suurin amplitudi, on löydetty, tämä toiminto laskee tarkkojen tulosten taajuuden amplitudin juuri ennen ja jälkeen sen. Tässä laskelmassa käytetty amplitudi on myös moduulin summa (ei neliösumman neliöjuuri)

jos Fn on taajuus, jolla on maksimi amplitudi, taajuus voidaan laskea alla olevasta kaavasta.

Todellinen F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)

jossa An on taajuuden amplitudi ja Fn-1 on taajuusarvo.

Vaihe 3: Tulokset:

Tulokset
Tulokset
Tulokset
Tulokset

Ratkaisuaika näkyy yllä olevassa kuvien vertailussa EasyFFT: n kanssa. Nopeus näkyy vertailussa.

Näytetiedoissa on kolme eri taajuudella olevaa sinimuotoista aaltoa. QuickFFT: n tulosta verrataan Scilab -lähtöön. Kuten voimme nähdä kuvassa, 3 huippua, joiden suurin amplitudi vastaa Scilab -lähtöä. Lähtö sisältää kuitenkin paljon kohinaa, joka voi olla harhaanjohtavaa joissakin sovelluksissa. Siksi on suositeltavaa tarkistaa koodi oikein ennen hakemuksen jättämistä.

Toivottavasti tämä koodi oli hyödyllinen projektillesi. Jos sinulla on kysyttävää tai ehdotusta, kommentoi.

Suositeltava: