INHOUDSOPGAWE:
Video: QuickFFT: hoë spoed FFT vir Arduino: 3 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:24
Tipiese Arduino het beperkte RAM en verwerkingskrag, en FFT is 'n rekenaarintensiewe proses. Vir baie intydse toepassings is die enigste vereiste om frekwensie met 'n maksimum amplitude te kry of om frekwensiepieke op te spoor.
In een van my instruksies het ek 'n kode vir FFT opgestel wat hier gevind kan word: EasyFFT
Hierdie kode kon FFT van tot 128 monsters op Arduino nano uitvoer. As gevolg van die beperkte geheue van Arduino, is 'n groter steekproefnommer as dit nie moontlik nie. Ek het die funksie 'n bietjie aangepas om die spoed te verbeter en die geheueverbruik te verminder. Hierdie wysiging stel Arduino in staat om FFT vyf keer vinniger uit te voer en verbruik amper die helfte geheue. Hierdie instruksie dek nie Working of FFT nie; verwysings daarvoor kan gevind word by EasyFFT.
Stap 1: Werk
Die tipiese FFT -funksie is aangepas om die snelheid met minder akkuraatheid te verbeter. Soos in die prent getoon word, moet 'n toetssein vermenigvuldig word met sinus- of kosinusvorme. Hierdie waardes kan tussen 0 en 1 wees, dus is dit 'n moet om swaai vermenigvuldiging te maak. in Arduino is die drywende vermenigvuldiging stadig in vergelyking met heelgetalbewerkings.
In hierdie funksie word die sinus/cosinusgolf vervang deur 'n vierkantgolf. Aangesien ons 'n toetssein moet vermenigvuldig met 'n vierkantgolf wat die waarde 0, 1 of -1 kan hê. As gevolg hiervan kan ons drywende vermenigvuldiging vervang deur eenvoudig heelgetal optel of aftrek. By Arduino is heelgetal optel of aftrek ongeveer 5 keer vinniger. Dit maak die oplossing ongeveer 5 keer vinniger.
As gevolg van hierdie verandering kan die frekwensiebakwaardes nou as 'n heelgetal gestoor word (wat voorheen vlot was), en ons kry nog 'n voordeel van 'n laer geheueverbruik. In Arduino Nano verbruik int 2 grepe geheue, terwyl float 4 grepe geheue verbruik. As gevolg van hierdie voordeel in die nuwe kode, kan ons byna 256 monsters (voorheen 128 monsters) FFT uitvoer.
In Normal FFT moes ons die sinuswaarde stoor om 'n oplossing vinniger te maak. In 'n nuwe funksie, aangesien ons nie meer sinus/cosinus -waardes benodig nie, kan ons dit uitskakel en geheue bespaar.
Implementering:
Die implementering van hierdie funksie is eenvoudig. Ons kan die funksie eenvoudig by die kode kode kopieer. Hierdie funksie kan uitgevoer word met behulp van die onderstaande opdrag:
float f = Q_FFT (data, 256, 100); In funksie Q_FFT, data: hierdie term is 'n skikking met seinwaardes; die aanbevole steekproefgrootte is 2, 4, 8, 32, 64, 128, 256, 512, … en verder. as die steekproefgrootte nie tot hierdie waardes behoort nie, word dit na die naaste onderkant van waardes geknip. Byvoorbeeld, as die steekproefgrootte 75 is, word FFT uitgevoer vir 64 getalle monsters. Die maksimum aantal monsters word beperk deur die beskikbare RAM op Arduino.
Die tweede term spesifiseer die aantal monsters in 'n skikking en die laaste term is die bemonsteringsfrekwensie in Hz.
Stap 2: Kode
Hierdie afdeling verduidelik die wysiging in die EasyFFT -kode wat in gedagte gehou moet word tydens die wysiging van die kode, 1. Soos voorheen verduidelik, word heelgetalle hier gebruik om FFT te doen. Int in Arduino is 'n 16 -bis getal en kan waardes van -32768 tot 32768 bevat. As die waarde van hierdie int hierdie reeks oorskry, veroorsaak dit die probleem. om hierdie probleem uit te skakel na ooit 'n vlakberekening. as een van die waarde meer as 15000 is, word volledige skikkings gedeel deur 100. dit sal voorkom dat die int oorloop.
2. Amplitudeberekening: Om die amplitude te bereken, moet die werklike en denkbeeldige deel in kwadraat gemaak word en die vierkantswortel van die som word vereis. kwadraat en die vierkantswortel van die funksie neem tyd. Om die proses vinniger te maak, sal hierdie kode eenvoudig 'n paar van die groottes van werklike en denkbeeldige dele doen. Dit is beslis minder akkuraat en kan in sommige gevalle tot die verkeerde gevolgtrekking kom. u kan kies om terug te keer na die normale metode om die grootte te bereken, maar dit sal meer tyd neem en u moet ook 'n reëling tref om hierdie getalle op te slaan.
3. Hierdie kode het nie 'n module vir meervoudige piekopsporing nie. Dit kies eenvoudig die waarde met die maksimum amplitude (uitgesluit die eerste getal wat gelyk is aan DC). As u meer pieke benodig, kan u die EasyFFT -kode verwys en die nodige wysigings hier aanbring. In so 'n geval moet 'n skikking/veranderlike ook as 'n globale veranderlike verklaar word.
4. Die funksie bevat die volgende reël:
ongetekende int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
As u die bogenoemde veranderlikes as 'n globale veranderlike verklaar (plak dit aan die begin van die kode), spaar dit êrens 1 millisekonde tyd by elke uitvoering.
5. Anders as die EasyFFT -funksie, waar die top 5 pieke in die vooraf gedefinieerde skikking gestoor is. Hierdie funksie gee 'n vlotwaarde terug. hierdie waarde verteenwoordig die frekwensie met die maksimum amplitude in Hz. Dus sal die voorstelling van kode so lyk.
float f = Q_FFT (data, 256, 100);
6. Piekopsporing: sodra frekwensie met maksimum amplitude gevind is, gebruik hierdie funksie 'n amplitude van frekwensie net voor en daarna om die akkurate resultate te bereken. Amplitude wat in hierdie berekening gebruik word, is ook die som van modulus (nie die vierkantswortel van die som van vierkante nie)
as Fn die frekwensie met maksimum amplitude is, kan die frekwensie bereken word uit die onderstaande formule.
Werklike F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)
waar An amplitude is van n is die frekwensie en Fn-1 is frekwensiewaarde.
Stap 3: Resultate:
Die oplossingstyd word getoon in die bostaande beeldvergelyking met EasyFFT. Die spoed daarvan word getoon met die vergelyking.
Vir steekproefdata met 3 sinusvormige golwe met verskillende frekwensies word getoon. Die resultaat van QuickFFT word vergelyk met Scilab -uitset. Soos ons in die prent kan sien, pas 3 pieke met maksimum amplitude by die Scilab -uitset. Die uitset bestaan egter uit baie geraas, wat vir sommige toepassings misleidend kan wees. Dit word dus aangeraai om die kode behoorlik na te gaan voordat u op u aansoek aansoek doen.
Ek hoop dat u hierdie kode nuttig gevind het vir u projek. Lewer kommentaar as u enige navrae of voorstelle het.
Aanbeveel:
DC MOTOR Handgebaarbeheer Spoed en rigting met behulp van Arduino: 8 stappe
DC MOTOR Handgebaarbeheersnelheid en -rigting met behulp van Arduino: In hierdie tutoriaal leer ons hoe u 'n GS -motor met handgebare met arduino en Visuino kan beheer. Kyk na die video! Kyk ook hier: Handgebaar -tutoriaal
Nagging Robot® - Versteurend teen die spoed van die lewe: 7 stappe (met foto's)
Nagging Robot® | Versteurend teen die spoed van die lewe: die maklikste manier om seker te maak dat u elke dag kwaad word. Nagging Robot® het die oplossing. Nagging Robot® Annooy® 900 Die Annooy® 900 is sorgvuldig ontwerp met die nuutste DIY-tegnologie om mense te irriteer. deur Daniel Locatelli en TzuYing Chen Meer krag
Flitsfotografie met hoë spoed: 6 stappe (met foto's)
Flitsfotografie met hoë spoed: dit is 'n prentjie van 'n skroewedraaier in die middel van die bons. Nadat ek gelees het oor hoëspoedfotografie in 'n tydskrif, is ek geïnspireer om deur my kas te grawe en te sien wat ek kan doen. Ek gebruik 'n tuisgemaakte skerm om die flits te aktiveer terwyl my digitale
Tamiya 72004 wurmratkas spoed sensor: 5 stappe (met foto's)
Tamiya 72004 wurmratkas spoed sensor: ek wou die snelheid van die motor akkuraat beheer in 'n Tamiya 72004 wurm ratkas vir 'n robot wat ek bou. Om dit te kan doen, moet u die huidige snelheid meet. Hierdie projek toon die evolusie van die snelheidssensor. Soos u kan sien
Parallelle hawe spoed sakrekenaar: 8 stappe
Parallelle hawe snelheidsrekenaar: hier is 'n netjiese projek wat kan meet hoe vinnig iets gaan. Dit is baie maklik om te maak, benodig min dele en is lekker om te gebruik. Dit sluit eenvoudig die parallelle poort van 'n rekenaar aan, en met behulp van sagteware kan die snelheid van 'n voorwerp aangeteken word