INHOUDSOPGAWE:

QuickFFT: hoë spoed FFT vir Arduino: 3 stappe
QuickFFT: hoë spoed FFT vir Arduino: 3 stappe

Video: QuickFFT: hoë spoed FFT vir Arduino: 3 stappe

Video: QuickFFT: hoë spoed FFT vir Arduino: 3 stappe
Video: Single IC stereo LED VU Meter LM3914 or LM3915 or LM3916 2024, November
Anonim
QuickFFT: High Speed FFT vir Arduino
QuickFFT: High Speed FFT vir Arduino

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

Werk
Werk
Werk
Werk
Werk
Werk
Werk
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:

Resultate
Resultate
Resultate
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: