Mundarija:

QuickFFT: Arduino uchun yuqori tezlikli FFT: 3 qadam
QuickFFT: Arduino uchun yuqori tezlikli FFT: 3 qadam

Video: QuickFFT: Arduino uchun yuqori tezlikli FFT: 3 qadam

Video: QuickFFT: Arduino uchun yuqori tezlikli FFT: 3 qadam
Video: Схема аналогового звукового генератора тарелок драм-машины DR-110 2024, Iyun
Anonim
QuickFFT: Arduino uchun yuqori tezlikli FFT
QuickFFT: Arduino uchun yuqori tezlikli FFT

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

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

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