Բովանդակություն:
Video: QuickFFT. Բարձր արագությամբ FFT Arduino- ի համար `3 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:46
Տիպիկ 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- ի ելքի հետ: Այնուամենայնիվ, ելքը բաղկացած է բազմաթիվ աղմուկներից, որոնք կարող են ապակողմնորոշել որոշ ծրագրերի համար: Այսպիսով, խորհուրդ է տրվում ձեր դիմումին դիմելուց առաջ ճիշտ ստուգել ծածկագիրը:
Հուսով եմ, որ այս կոդը օգտակար գտաք ձեր նախագծի համար: Հարցերի կամ առաջարկությունների դեպքում խնդրում ենք մեկնաբանել:
Խորհուրդ ենք տալիս:
Տնական բարձր արագությամբ էլեկտրական մեքենա ՝ 7 քայլ
Տնային բարձր արագությամբ էլեկտրական մեքենա. Եթե երբևէ ցանկացել եք փորձել պատրաստել ձեր սեփական էլեկտրական մեքենան, սա շատ պարզ միջոց է սովորական նյութերից բարձր արագությամբ մեքենա պատրաստելու, ինչպես նաև էլեկտրոնային խանութից մի քանի էժան իրեր պատրաստելու համար: Այլևս 30-60 դոլար չծախսեք RC մեքենաների վրա, երբ դուք
Մուտք գործեք բարձր արագությամբ ԷՍԳ կամ այլ տվյալներ ՝ շարունակաբար մեկ ամսվա ընթացքում ՝ 6 քայլ
Մուտք գործեք բարձր արագությամբ ԷՍԳ կամ այլ տվյալներ ՝ շարունակաբար մեկ ամսվա ընթացքում. Այս նախագիծը մշակվել է համալսարանական բժշկական հետազոտական թիմին աջակցելու համար, որին անհրաժեշտ էր կրելի սարք, որը կարող էր մուտքագրել 2 x ԷՍԳ ազդանշաններ 1000 նմուշ/վրկ յուրաքանչյուրում (ընդամենը 2K նմուշ/վրկ) շարունակաբար 30 օր, առիթմիայի հայտնաբերման համար: Նախագիծը նախատեսում է
Բարձր արագությամբ ժամացույց դանդաղ շարժվող տեսանյութերի համար ՝ 4 քայլ
Բարձր արագությամբ ժամացույց ՝ դանդաղ շարժվող տեսանյութերի համար. Smartphoneամանակակից սմարթֆոն ունեցող գրեթե բոլորն ունեն գերարագ տեսախցիկ, որը կարող է օգտագործվել դիտարժան դանդաղ տեսահոլովակներ պատրաստելու համար: Բայց եթե ուզում եք չափել, թե իրականում որքան ժամանակ է պահանջվում, որ այդ օճառի պղպջակը պայթի կամ այդ ձմերուկը պայթի, կարող եք
Բարձր արագությամբ տեսագրություն սկսնակների համար. 6 քայլ (նկարներով)
Բարձր արագությամբ տեսագրություն սկսնակների համար. Բոլորը, ում ես հանդիպել և զրուցել եմ, կիսում են մեկ ընդհանուր բան. Գերարագ տեսախցիկ ունենալու կամ գոնե խաղալու ցանկությունը: Չնայած ես կասկածում եմ, որ սա կարդացողներից շատերն ունեն իրենց սեփական արագաչափ տեսախցիկը, բայց ես ցանկանում եմ, որ այն քչերը, ովքեր
Կատարեք ձեր RC ավտոմեքենաների ցնցումները ավելի կարճ ՝ բարձր արագությամբ ավելի լավ գործածելու համար. 5 քայլ
Կատարեք ձեր RC մեքենաների ցնցումները ավելի բարձր արագությամբ ավելի լավ վարվելու համար. Այս հրահանգում ես ձեզ ցույց կտամ, թե ինչպես կրճատել ձեր հարվածները, որպեսզի կարողանաք ձեր մեքենան ավելի մոտեցնել գետնին, որպեսզի կարողանաք ավելի արագ պտույտներ կատարել ՝ առանց հարվածների: Ես կօգտագործեմ իմ այլ հրահանգներ այն մասին, թե ինչպես կատարել ձեր մեքենաների ցնցումները, որպեսզի