Sisällysluettelo:
Video: QuickFFT: Nopea FFT Arduinolle: 3 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:00
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
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:
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:
Halvempi ESP8266 WiFi -suoja Arduinolle ja muille mikroille: 6 vaihetta (kuvilla)
Halvempi ESP8266 -WiFi -suoja Arduinolle ja muille mikroille: Päivitys: 29. lokakuuta 2020 Testattu ESP8266 -levykirjastolla V2.7.4 - toimii Päivitys: 23. syyskuuta 2016 Älä käytä Arduino ESP -levykirjastoa V2.3.0 tähän projektiin. V2.2.0 works Päivitys: 19. toukokuuta 2016 Tämän hankkeen versio 14 tarkistaa kirjastoja ja koodia toimimaan
Arduinolle asennettu askelnopeuden säätövalikko: 6 vaihetta
Steppin nopeuden säätövalikko Arduinoa varten: Tämä SpeedStepper -kirjasto on uudelleenkirjoitettu AccelStepper -kirjastosta, jotta askelmoottorin nopeus voidaan säätää. SpeedStepper -kirjaston avulla voit muuttaa asetettua moottorin nopeutta ja sitten kiihdyttää/hidastaa uuteen asetettuun nopeuteen samalla algoritmilla
Diy Dc -tehonmittausmoduuli Arduinolle: 8 vaihetta
Diy Dc -tehonmittausmoduuli Arduinolle: Tässä projektissa näemme kuinka tehdä tasavirtamittausmoduuli Arduinolla
EasyFFT: Nopea Fourier -muunnos (FFT) Arduinolle: 6 vaihetta
EasyFFT: Nopea Fourier -muunnos (FFT) Arduinolle: Taajuuden mittaus kaapatusta signaalista voi olla vaikea tehtävä, etenkin Arduinolla, koska sen laskentateho on pienempi. Saatavilla on menetelmiä nollanylityksen kaappaamiseen, jossa taajuus kaapataan tarkistamalla, kuinka monta kertaa
Nopea, nopea, halpa, hyvännäköinen LED -huoneen valaistus (kaikille): 5 vaihetta (kuvilla)
Nopea, nopea, halpa, hyvännäköinen LED-huonevalaistus (kaikille): Tervetuloa kaikki :-) Tämä on ensimmäinen ohjeeni, joten kommentit ovat tervetulleita :-) Toivon voivani näyttää teille, kuinka tehdä nopea LED-valaistus, joka on TINY buget.Mitä tarvitset: Kaapelit LED -valotKestävyys