Բովանդակություն:

QuickFFT. Բարձր արագությամբ FFT Arduino- ի համար `3 քայլ
QuickFFT. Բարձր արագությամբ FFT Arduino- ի համար `3 քայլ

Video: QuickFFT. Բարձր արագությամբ FFT Arduino- ի համար `3 քայլ

Video: QuickFFT. Բարձր արագությամբ FFT Arduino- ի համար `3 քայլ
Video: Mathematics with Python! Evaluating Polynomials 2024, Նոյեմբեր
Anonim
QuickFFT. Բարձր արագությամբ FFT Arduino- ի համար
QuickFFT. Բարձր արագությամբ FFT Arduino- ի համար

Տիպիկ Arduino- ն ունի սահմանափակ RAM և պրոցեսորային հզորություն, իսկ FFT- ը հաշվարկային ինտենսիվ գործընթաց է: Իրական ժամանակի շատ ծրագրերի համար միակ պահանջը առավելագույն ամպլիտուդով հաճախականություն ստանալն է կամ հաճախականության գագաթները հայտնաբերելու համար պահանջվողը:

Իմ հրահանգներից մեկում ես պատրաստեցի FFT- ի ծածկագիր, որը կարելի է գտնել այստեղ ՝ EasyFFT

Այս կոդը կարողացավ կատարել մինչև 128 նմուշի FFT Arduino nano- ի վրա: Սրանից ավելի մեծ նմուշ հնարավոր չէ Arduino- ի սահմանափակ հիշողության պատճառով: Ես մի փոքր փոփոխել եմ գործառույթը `արագությունը բարելավելու և հիշողության սպառումը նվազեցնելու համար: Այս փոփոխությունը թույլ է տալիս Arduino- ին կատարել FFT հինգ անգամ ավելի արագ և սպառում է հիշողության գրեթե կեսը: Այս հրահանգը չի ներառում FFT- ի աշխատանքը, դրա մասին տեղեկանքները կարելի է գտնել EasyFFT- ում:

Քայլ 1: Աշխատանք

Աշխատող
Աշխատող
Աշխատող
Աշխատող
Աշխատող
Աշխատող
Աշխատող
Աշխատող

Տիպիկ FFT գործառույթը փոփոխված է `արագությունը ավելի փոքր ճշգրտությամբ բարելավելու համար: Ինչպես ցույց է տրված նկարում, փորձարկման ազդանշանը պետք է բազմապատկվի սինուս կամ կոսինուս ալիքային ձևերով: Այս արժեքները կարող են լինել 0 -ից 1 -ի սահմաններում, այնպես որ լողացող բազմապատկումը պարտադիր է: Arduino- ում, Լողացող բազմապատկումը դանդաղ է `ամբողջ թվերի գործողությունների համեմատ:

Այս ֆունկցիայում սինուս/կոսինուս ալիքը փոխարինվում է քառակուսի ալիքով: Քանի որ մենք պետք է բազմապատկենք փորձարկման ազդանշանը քառակուսի ալիքով, որը կարող է ունենալ 0, 1 կամ -1 արժեք: Դրա շնորհիվ մենք կարող ենք լողացող բազմապատկումը փոխարինել պարզապես ամբողջ գումարմամբ կամ հանումով: Arduino- ի համար ամբողջ թվերի գումարումը կամ հանումը մոտ 5 անգամ ավելի արագ է: Սա ստիպում է լուծումը մոտ 5 անգամ ավելի արագ:

Այս փոփոխության շնորհիվ այժմ հաճախականության աղբարկղի արժեքները կարող են պահվել որպես ամբողջ թիվ (որը նախկինում լողում էր), և մենք ստանում ենք հիշողության ավելի ցածր սպառման ևս մեկ առավելություն: Arduino Nano- ում int- ը սպառում է 2 բայթ հիշողություն, իսկ float- ը `4 բայթ: Նոր կոդի այս առավելության շնորհիվ մենք կարող ենք FFT կատարել գրեթե 256 նմուշի համար (նախկինում ՝ 128 նմուշ):

Normal FFT- ում մեզ անհրաժեշտ էր պահպանել սինուսի արժեքը `լուծումն ավելի արագ պատրաստելու համար: Նոր գործառույթում, քանի որ մենք այլևս չենք պահանջում սինուս/կոսինուս արժեքներ, մենք կարող ենք վերացնել այն և պահպանել որոշ հիշողություն:

Իրականացում:

Այս գործառույթի իրականացումը ուղիղ առաջ է: Մենք կարող ենք պարզապես պատճենել գործառույթը ծածկագրի ներքևում: Այս գործառույթը կարող է կատարվել ստորև բերված հրամանի միջոցով.

float f = Q_FFT (տվյալներ, 256, 100); Q_FFT գործառույթում, տվյալներ. այս տերմինը ազդանշանի արժեքներ ունեցող զանգված է, առաջարկվող նմուշի չափերն են `2, 4, 8, 32, 64, 128, 256, 512 և այլն: եթե նմուշի չափը չի պատկանում այս արժեքներին, այն կկտրվի արժեքների մոտակա ստորին կողմում: օրինակ, եթե նմուշի չափը 75 է, ապա FFT- ն կիրականացվի 64 նմուշների համար: Նմուշի չափի առավելագույն քանակը սահմանափակվում է Arduino- ի հասանելի RAM- ով:

Երկրորդ տերմինը սահմանում է զանգվածի նմուշների քանակը, իսկ վերջին տերմինը `նմուշառման հաճախականությունը Հց -ով:

Քայլ 2: Կոդ

Այս բաժինը բացատրում է EasyFFT ծածկագրում կատարված փոփոխությունը, որը պետք է հաշվի առնել ծածկագրում փոփոխություն կատարելիս, 1. Ինչպես նախկինում բացատրված էր, այստեղ ամբողջ թվերն օգտագործվում են FFT կատարելու համար: Int- ն Arduino- ում 16 -բիթանոց թիվ է և կարող է պարունակել -32768 -ից մինչև 32768 արժեքներ: երբ այս int- ի արժեքը գերազանցում է այս տիրույթը, դա առաջացնում է խնդիրը: վերացնել այս խնդիրը երբևէ մակարդակի հաշվարկից հետո: եթե արժեքներից որևէ մեկը գերազանցի 15000 ամբողջական զանգվածները կբաժանվեն 100 -ի: դա կանխելու է int- ի արտահոսքը:

2. Ամպլիտուդայի հաշվարկ. Ամպլիտուդը հաշվարկելու համար անհրաժեշտ է իրական և երևակայական մասը քառակուսի դնել, և գումարի քառակուսի արմատը պահանջվում է: քառակուսի և գործառույթի քառակուսի արմատը ժամանակ է պահանջում: գործընթացն ավելի արագ դարձնելու համար այս ծածկագիրը պարզապես կկատարի իրական և երևակայական մասերի որոշ մեծություններ: Սա, անշուշտ, ավելի քիչ ճշգրիտ է և որոշ դեպքերում կարող է հանգեցնել սխալ եզրակացության: Դուք կարող եք որոշել վերադառնալ Նորմալ մեթոդին `մեծության հաշվարկման համար, բայց դա ավելի շատ ժամանակ կպահանջի, և դուք նաև պետք է ինչ -որ պայմանավորվածություն ձեռք բերեք այս թվերը պահելու համար:

3. Այս ծածկագիրը չունի բազմակի գագաթնակետերի հայտնաբերման մոդուլ: Այն պարզապես կընտրի արժեքը առավելագույն ամպլիտուդով (առանց առաջին համարի, որը DC օֆսեթ է): Եթե Ձեզ անհրաժեշտ են բազմաթիվ գագաթներ, կարող եք հղել EasyFFT ծածկագիրը և կատարել անհրաժեշտ փոփոխությունները այստեղ: Այդ դեպքում որոշ զանգված/փոփոխական նույնպես պետք է հայտարարվի որպես գլոբալ փոփոխական:

4. Ֆունկցիան պարունակում է հետևյալ տողը.

անստորագիր int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};

Վերոնշյալ փոփոխականները որպես գլոբալ փոփոխական հայտարարելը (այն տեղադրելը կոդի սկզբում) կխնայի ինչ -որ տեղ 1 կատարման վայրկյան ժամանակ յուրաքանչյուր կատարման ժամանակ:

5. Ի տարբերություն EasyFFT գործառույթի, որտեղ վերին 5 գագաթները պահվում էին կանխորոշված զանգվածում: Այս գործառույթը կվերադարձնի float արժեքը: այս արժեքը ներկայացնում է Հզ -ում առավելագույն ամպլիտուդայով հաճախականությունը: Այսպիսով, ծածկագրի ներկայացումը այսպիսի տեսք կունենա:

float f = Q_FFT (տվյալներ, 256, 100);

6. Պիկ հայտնաբերում. Երբ առավելագույն ամպլիտուդի հաճախականությունը հայտնաբերվի, այս ֆունկցիան օգտագործում է հաճախականության ամպլիտուդը դրանից անմիջապես առաջ և հետո `ճշգրիտ արդյունքները հաշվարկելու համար: Այս հաշվարկի մեջ օգտագործվող ամպլիտուդը նաև մոդուլի գումարն է (ոչ քառակուսիների գումարի քառակուսի արմատը)

եթե Fn- ը առավելագույն ամպլիտուդի հաճախականությունն է, ապա հաճախականությունը կարող է հաշվարկվել բանաձևից ներքև:

Փաստացի F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)

որտեղ An- ը n հաճախականության ամպլիտուդ է, իսկ Fn-1- ը `հաճախականության արժեք:

Քայլ 3: Արդյունքներ

Արդյունքներ
Արդյունքներ
Արդյունքներ
Արդյունքներ

Լուծման ժամանակը ցուցադրվում է վերը նշված պատկերի համեմատ EasyFFT- ի հետ: Համեմատության միջոցով ցուցադրվում է դրա արագությունը:

Նմուշի տվյալների համար, որոնք ունեն 3 հաճախականությամբ սինուսոիդ ալիքներ: QuickFFT- ի արդյունքը համեմատվում է Scilab արտադրանքի հետ: Ինչպես տեսնում ենք նկարում 3 առավելագույն գագաթը առավելագույն ամպլիտուդով համընկնում է Scilab- ի ելքի հետ: Այնուամենայնիվ, ելքը բաղկացած է բազմաթիվ աղմուկներից, որոնք կարող են ապակողմնորոշել որոշ ծրագրերի համար: Այսպիսով, խորհուրդ է տրվում ձեր դիմումին դիմելուց առաջ ճիշտ ստուգել ծածկագիրը:

Հուսով եմ, որ այս կոդը օգտակար գտաք ձեր նախագծի համար: Հարցերի կամ առաջարկությունների դեպքում խնդրում ենք մեկնաբանել:

Խորհուրդ ենք տալիս: