Mundarija:
Video: QuickFFT: Arduino uchun yuqori tezlikli FFT: 3 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:24
Oddiy Arduino operativ xotira va ishlov berish quvvatiga ega, FFT esa hisob-kitobni talab qiladigan jarayon. Ko'p real vaqtli ilovalar uchun yagona talab-maksimal amplitudali yoki chastota cho'qqilarini aniqlash uchun zarur bo'lgan chastotani olish.
O'qituvchilardan birida men bu erda joylashgan FFT kodini tayyorladim: EasyFFT
Bu kod Arduino nanosida 128 tagacha namunadagi FFTni bajarishga qodir edi. Arduino xotirasi cheklanganligi sababli, bundan yuqori namuna olish mumkin emas. Men tezlikni oshirish va xotira sarfini kamaytirish uchun funktsiyani biroz o'zgartirdim. Bu modifikatsiya Arduino -ga FFTni besh barobar tezroq bajarishga imkon beradi va deyarli yarim xotirani sarflaydi. Ushbu yo'riqnoma FFT bilan ishlashni o'z ichiga olmaydi, unga havolalarni EasyFFTda topish mumkin.
1 -qadam: ishlash
Oddiy FFT funktsiyasi tezlikni kamroq aniqlik bilan yaxshilash uchun o'zgartiriladi. Rasmda ko'rsatilgandek, sinov signalini sinus yoki kosinus to'lqin shakllariga ko'paytirish kerak. Bu qiymatlar 0 dan 1 gacha bo'lishi mumkin, shuning uchun suzuvchi ko'paytirish shart. Arduino -da, suzuvchi ko'paytirish butun sonli operatsiyalarga nisbatan sekin.
Bu funksiyada sinus/kosinus to'lqini kvadrat to'lqin bilan almashtiriladi. Sinov signalini 0, 1 yoki -1 qiymatiga ega bo'lgan kvadrat to'lqin bilan ko'paytirish kerak. Shu sababli, biz suzuvchi ko'paytirishni oddiy qo'shish yoki ayirishga almashtirishimiz mumkin. Arduino uchun butun sonni qo'shish yoki olib tashlash taxminan 5 barobar tezroq. Bu muammoni 5 baravar tezroq hal qiladi.
Ushbu o'zgartirish tufayli endi chastota qutisi qiymatlari butun son sifatida saqlanishi mumkin (u ilgari suzuvchi edi) va biz xotira sarfining yana bir afzalliklariga ega bo'lamiz. Arduino Nano -da int 2 bayt xotira, float esa 4 bayt xotira sarflaydi. Yangi kodning ushbu afzalligi tufayli biz deyarli 256 ta namuna (avval 128 ta namuna) uchun FFTni bajara olamiz.
Oddiy FFTda biz tezroq sinus qiymatini saqlashimiz kerak edi. Yangi funktsiyada, sinus/kosinus qiymatlari talab qilinmagani uchun, biz uni yo'q qila olamiz va xotirani saqlay olamiz.
Amalga oshirish:
Bu funktsiyani amalga oshirish to'g'ridan -to'g'ri. Biz shunchaki kodni funktsiyalaridan nusxa ko'chirishimiz mumkin. Bu funktsiyani quyidagi buyruq yordamida bajarish mumkin:
float f = Q_FFT (ma'lumotlar, 256, 100); Q_FFT funktsiyasida,
Ma'lumotlar: bu atama signal qiymatiga ega bo'lgan massiv bo'lib, tavsiya etilgan namuna o'lchami 2, 4, 8, 32, 64, 128, 256, 512, … va boshqalar. agar namuna o'lchami bu qiymatlarga tegishli bo'lmasa, u qiymatlarning eng yaqin pastki qismiga kesiladi. Masalan, agar namuna o'lchami 75 dan katta bo'lsa, 64 ta namuna uchun FFT o'tkaziladi. Maksimal namuna hajmi Arduino operativ xotirasi bilan cheklangan.
Ikkinchi muddat qatordagi namunalar sonini bildiradi va oxirgi muddat namuna olish chastotasi Gts.
2 -qadam: kod
Ushbu bo'lim EasyFFT kodiga kiritilgan o'zgartirishlarni tushuntiradi, bu kodni o'zgartirish paytida yodda tutilishi kerak, 1. Yuqorida aytib o'tilganidek, bu erda FFTni bajarish uchun butun sonlar ishlatiladi. Arduino -dagi Int 16 -bitli raqam bo'lib, u -32768 dan 32768 gacha bo'lgan qiymatlarni o'z ichiga olishi mumkin. har qanday darajadagi hisob -kitoblardan so'ng bu muammoni bartaraf etish. agar biror qiymat 15000 dan oshsa, to'liq massivlar 100 ga bo'linadi.
2. Amplitudani hisoblash: Amplitudani hisoblash uchun haqiqiy va xayoliy qismni kvadratga bo'lish kerak va yig'indining kvadrat ildizi kerak. kvadrat va funktsiyaning kvadrat ildizi vaqt oladi. jarayonni tezlashtirish uchun bu kod oddiy va xayoliy qismlarning kattaligini bajaradi. Bu, albatta, kamroq aniq va ba'zi hollarda noto'g'ri xulosaga olib kelishi mumkin. Siz kattalikni hisoblash uchun Oddiy usulga qaytishni tanlashingiz mumkin, lekin bu ko'proq vaqtni oladi va siz ham bu raqamlarni saqlash uchun qandaydir chora ko'rishingiz kerak bo'ladi.
3. Bu kodda bir nechta tepalikni aniqlash uchun modul yo'q. U faqat maksimal amplitudali qiymatni tanlaydi (DC ofsetidagi birinchi raqam bundan mustasno). Agar sizga bir nechta cho'qqilar kerak bo'lsa, EasyFFT kodiga murojaat qilishingiz va kerakli o'zgartirishlarni bu erda qilishingiz mumkin. Bunday holda, ba'zi bir qator/o'zgaruvchilar global o'zgaruvchi sifatida e'lon qilinishi kerak.
4. Funktsiya quyidagi qatorni o'z ichiga oladi:
imzosiz int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
yuqoridagi o'zgaruvchilarni global o'zgaruvchi deb e'lon qilish (kodning boshiga joylashtirish) har bir bajarishda 1 millisekund vaqtni tejaydi.
5. EasyFFT funktsiyasidan farqli o'laroq, eng yaxshi 5 ta cho'qqisi oldindan belgilangan qatorda saqlangan. Bu funksiya float qiymatini qaytaradi. bu qiymat Gts maksimal amplitudali chastotani ifodalaydi. Shunday qilib, kodning ko'rinishi shunga o'xshash ko'rinadi.
float f = Q_FFT (ma'lumotlar, 256, 100);
6. Peak Detection: Maksimal amplitudali chastota topilgach, bu funksiya aniq natijalarni hisoblash uchun undan oldin va keyin chastota amplitudasidan foydalanadi. Bu hisobda ishlatiladigan amplituda ham modullar yig'indisidir (kvadratlar yig'indisining kvadrat ildizi emas)
Agar Fn - maksimal amplitudali chastota bo'lsa, chastotani quyidagi formuladan hisoblash mumkin.
Haqiqiy F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)
bu erda An-n chastotasining amplitudasi va Fn-1-chastota qiymati.
3 -qadam: Natijalar:
Yechish vaqti yuqoridagi rasmni EasyFFT bilan taqqoslashda ko'rsatilgan. Uning tezligi taqqoslashda ko'rsatilgan.
Har xil chastotali 3 ta sinusoidal to'lqinlarga ega bo'lgan namunaviy ma'lumotlar ko'rsatilgan. QuickFFT natijasi Scilab chiqishi bilan taqqoslanadi. Rasmda ko'rib turganimizdek, maksimal amplitudali 3 ta tepalik Scilab chiqishi bilan mos keladi. Biroq, chiqish juda ko'p shovqinlardan iborat bo'lib, ular ba'zi ilovalarni chalg'itishi mumkin. Shunday qilib, arizaga murojaat qilishdan oldin kodni to'g'ri tekshirish tavsiya etiladi.
Umid qilamanki, siz ushbu kodni loyihangiz uchun foydali deb topdingiz. Agar biron bir savol yoki taklif bo'lsa, sharh qoldiring.
Tavsiya:
DIY yuqori quvvatli qizil nurli terapiya 660nm chiroq uchun mash'ala: 7 qadam
DIY yuqori quvvatli qizil nur terapiyasi 660nm og'riqli chiroq. Siz yuqori quvvatli DIY 660nm qizil chiroq terapiyasi chiroqini atigi 80 dollarga yasay olasizmi? Ba'zi kompaniyalar maxsus sous yoki yuqori quvvatli qurilma borligini aytishadi, lekin ular o'z raqamlarini ta'sirchan qilib ko'rsatishadi. Aqlli d
Bosqichli dvigatel uchun yuqori oqim drayverini qanday qilish kerak: 5 qadam
Bosqichli dvigatel uchun yuqori oqim drayverini qanday qilish kerak: bu erda biz Toshiba TB6560AHQ kontrolleridan foydalanib, step dvigatelini qanday qilishni ko'rib chiqamiz. Bu to'liq xususiyatli nazoratchi bo'lib, u faqat 2 o'zgaruvchiga kirish sifatida kerak va u hamma ishni bajaradi. Menga ikkitasi kerak bo'lgani uchun men ikkalasini ham yaratdim
Yuqori kuchlanishli batareyalar uchun kuchlanish monitor: 3 qadam (rasmlar bilan)
Yuqori kuchlanishli batareyalar uchun kuchlanish o'lchagichi: Ushbu qo'llanmada men sizga elektr panelim uchun batareyaning kuchlanish monitorini qanday qurganimni tushuntiraman. Uni xohlagancha o'rnating va batareyangizga faqat ikkita simni ulang (Gnd va Vcc). Ushbu qo'llanmada sizning batareyangiz voltaji 30 voltdan oshadi deb taxmin qilingan,
Ko'p tezlikli AC motorini boshqarish uchun IR dekoderini qanday dasturlash mumkin: 7 qadam
Ko'p tezlikli o'zgaruvchan tok dvigatelini boshqarish uchun IR dekoderini qanday dasturlash mumkin: Bir fazali o'zgaruvchan tok dvigatellari odatda fanatlar kabi uy-ro'zg'or buyumlarida uchraydi va ularning tezligini belgilangan tezlik uchun bir nechta alohida sariqlardan foydalanganda osongina boshqarish mumkin. Ushbu yo'riqnomada biz raqamli boshqaruvchini quramiz, u
24v shahar dvigatelining yuqori tezlikli universal dvigateliga (30 volt): 3 qadam
24V DC dvigatelidan yuqori tezlikdagi universal dvigatelga (30 voltli): Salom! Ushbu loyihada men sizga oddiy o'yinchoqli 24V doimiy dvigatelni 30V universal dvigatelga aylantirishni o'rgatmoqchiman. . Bolalar, men sizga birinchi navbatda videoni ko'rishni tavsiya qilaman. V loyiha