Mündəricat:
Video: QuickFFT: Arduino üçün Yüksək Sürətli FFT: 3 addım
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:44
Tipik Arduino məhdud RAM və işləmə gücünə malikdir və FFT hesablama baxımından intensiv bir prosesdir. Bir çox real vaxt tətbiqində, yeganə tələb maksimum amplituda olan və ya tezlik zirvələrini aşkar etmək üçün tələb olunan tezliyi əldə etməkdir.
Təlimat verdiyim bir kitabda, burada tapa biləcəyiniz FFT kodu hazırladım: EasyFFT
Bu kod Arduino nano'da 128 nümunəyə qədər FFT yerinə yetirə bildi. Arduinonun yaddaşı məhdud olduğu üçün bundan daha yüksək nümunə sayı mümkün deyil. Sürəti artırmaq və yaddaş istehlakını azaltmaq üçün funksiyanı bir qədər dəyişdirdim. Bu modifikasiya Arduino -ya FFT -ni beş qat daha sürətli yerinə yetirməyə və demək olar ki, yarı yaddaş sərf etməyə imkan verir. Bu Təlimat FFT İşini əhatə etmir, bunun üçün istinadları EasyFFT -də tapa bilərsiniz.
Addım 1: İş
Tipik FFT funksiyası, sürəti daha az dəqiqliklə artırmaq üçün dəyişdirilir. Şəkildə göstərildiyi kimi bir test siqnalı sinus və ya kosinus dalğa formaları ilə vurulmalıdır. Bu dəyərlər 0 ilə 1 arasında ola bilər, buna görə də üzən vurma etmək mütləqdir. Arduinoda, üzən vurma tam ədəd əməliyyatları ilə müqayisədə ləngdir.
Bu funksiyada sinus/kosinus dalğası kvadrat dalğa ilə əvəz olunur. 0, 1 və ya -1 dəyəri ola biləcək bir kvadrat dalğa ilə bir sınaq siqnalını vurmalıyıq. Bu səbəbdən, üzən vurmağı sadəcə tam ədəd əlavə və ya çıxma ilə əvəz edə bilərik. Arduino üçün tam ədəd əlavə və ya çıxma təxminən 5 qat daha sürətlidir. Bu, həllini təxminən 5 qat daha sürətli edir.
Bu modifikasiya sayəsində indi tezlik qutusu dəyərləri tam ədəd kimi saxlanıla bilər (əvvəllər üzən idi) və daha aşağı yaddaş istehlakının başqa bir üstünlüyü əldə edirik. Arduino Nano'da int 2 bayt, float isə 4 bayt yaddaş istehlak edir. Yeni koddakı bu üstünlük sayəsində, demək olar ki, 256 nümunə (əvvəllər 128 nümunə) üçün FFT həyata keçirə bilirik.
Normal FFT -də daha sürətli bir həll etmək üçün sinus dəyərini saxlamalı olduq. Yeni funksiyada, sinus/kosinus dəyərlərinə ehtiyac qalmadığı üçün onu aradan qaldıra və bir qədər yaddaş saxlaya bilərik.
İcra:
Bu funksiyanı yerinə yetirmək çox çətindir. Sadəcə kodun ens funksiyasını kopyalaya bilərik. Bu funksiya aşağıdakı əmrdən istifadə etməklə həyata keçirilə bilər:
float f = Q_FFT (data, 256, 100); Q_FFT funksiyasında, məlumatlar: bu müddət siqnal dəyərləri olan bir sıradır, tövsiyə olunan nümunə ölçüsü 2, 4, 8, 32, 64, 128, 256, 512,… və sonradır. nümunə ölçüsü bu dəyərlərə aid deyilsə, dəyərlərin ən yaxın aşağı tərəfinə kəsiləcək. məsələn, nümunə ölçüsü 75 -dən çox olarsa, 64 ədəd nümunə üçün aparılacaq. Maksimum nümunə sayı Arduino -da mövcud RAM ilə məhdudlaşır.
İkinci müddət, bir sıra nümunələrin sayını və son termin Hz -də nümunə götürmə tezliyini təyin edir.
Addım 2: Kod
Bu hissədə kodda dəyişiklik edərkən nəzərə alınması lazım olan EasyFFT kodunda edilən dəyişiklik izah edilir, 1. Daha əvvəl izah edildiyi kimi, burada tam ədədlər FFT etmək üçün istifadə olunur. Arduino'da Int 16 bitlik bir rəqəmdir və -32768 -dən 32768 -ə qədər olan dəyərləri ehtiva edə bilər. heç bir səviyyəli hesablamadan sonra bu problemi aradan qaldırmaq üçün. dəyərdən hər hansı biri 15000 -dən artıq olarsa, tam dizi 100 -ə bölünəcək. bu int -in daşmasına mane olacaq.
2. Genlik hesablanması: Genlik hesablamaq üçün həqiqi və xəyali hissənin kvadratlaşdırılması və cəmin kvadrat kökü tələb olunur. Kvadrat və funksiyanın kvadrat kökü zaman alır. prosesi daha sürətli etmək üçün bu kod sadəcə real və xəyali hissələrin böyüklüyünü yerinə yetirəcək. Bu, şübhəsiz ki, daha az dəqiqdir və bəzi hallarda yanlış nəticəyə səbəb ola bilər. Böyüklüyün hesablanması üçün Normal metoduna qayıtmağı seçə bilərsiniz, ancaq daha çox vaxt aparacaq və bu ədədləri saxlamaq üçün də müəyyən bir iş görməlisiniz.
3. Bu kodda birdən çox zirvə aşkarlanması üçün bir modul yoxdur. Sadəcə maksimum amplituda olan dəyəri seçəcək (DC ofset olan ilk rəqəm istisna olmaqla). Birdən çox zirvəyə ehtiyacınız varsa, EasyFFT koduna müraciət edə və burada lazımi dəyişiklikləri edə bilərsiniz. Bu vəziyyətdə, bir sıra/dəyişənin də qlobal dəyişən olaraq elan edilməsi lazımdır.
4. Funksiya aşağıdakı sətirdən ibarətdir:
imzasız int Pow2 [13] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
yuxarıdakı dəyişənləri qlobal bir dəyişən olaraq elan etmək (kodun əvvəlinə yapışdırmaq) hər icra zamanı 1 milisaniyə vaxt qənaət edəcəkdir.
5. EasyFFT funksiyasından fərqli olaraq, ilk 5 zirvənin əvvəlcədən təyin edilmiş massivdə saxlandığı. Bu funksiya float dəyəri qaytaracaq. bu dəyər, Hz -də maksimum amplituda olan tezliyi təmsil edir. Beləliklə, kodun təqdimatı belə bir şeyə bənzəyəcəkdir.
float f = Q_FFT (məlumatlar, 256, 100);
6. Peak Detection: Max amplituda olan tezlik tapıldıqda bu funksiya dəqiq nəticələri hesablamaq üçün ondan əvvəl və sonra bir amplituda istifadə edir. Bu hesablamada istifadə olunan genlik də modulun cəmidir (kvadratların cəminin kvadrat kökü deyil)
Əgər Fn maksimum amplitüdlü tezlikdirsə, tezlik aşağıdakı düsturla hesablana bilər.
Həqiqi F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (An-1+An+An+1)
burada An-n tezliyinin amplitudası və Fn-1-frekans dəyəridir.
Addım 3: Nəticələr:
Çözüm vaxtı EasyFFT ilə yuxarıdakı şəkil müqayisədə göstərilmişdir. Sürəti müqayisə ilə göstərilir.
Fərqli tezliklərdə 3 sinusoidal dalğaya malik olan nümunə məlumatlar üçün göstərilir. QuickFFT nəticəsi Scilab çıxışı ilə müqayisə olunur. Şəkildə gördüyümüz kimi, maksimum amplituda olan 3 zirvə Scilab çıxışı ilə uyğun gəlir. Bununla birlikdə, çıxış bəzi tətbiqlər üçün yanıltıcı ola biləcək çox səs -küydən ibarətdir. Buna görə də müraciət etməzdən əvvəl kodu düzgün yoxlamağınız məsləhətdir.
Ümid edirəm bu kodu layihəniz üçün faydalı hesab etdiniz. Hər hansı bir sualınız və ya təklifiniz varsa, şərh yazın.
Tövsiyə:
EasyFFT: Arduino üçün Sürətli Fourier Dönüşümü (FFT): 6 addım
EasyFFT: Arduino üçün Sürətli Fourier Dönüşümü (FFT): Tutulan siqnaldan tezliyin ölçülməsi, xüsusən də daha aşağı hesablama gücünə malik olduğu üçün Arduinoda çətin bir iş ola bilər. Sıfır keçidi tutmaq üçün tezliklər neçə dəfə yoxlanılaraq ələ keçirilə bilən üsullar var
Evdə Yüksək Sürətli Elektrikli Avtomobil: 7 addım
Evdə Yüksək Sürətli Elektrikli Avtomobil: Heç öz elektrikli avtomobilinizi sınamaq istəmisinizsə, bu, yüksək keyfiyyətli avtomobili adi materiallardan və elektron mağazadan bir neçə ucuz şeydən hazırlamağın çox sadə bir yoludur. RC avtomobilləri üçün 30-60 dollar xərcləməyəcəksiniz
REO tərəfindən Yüksək Sürətli Yükləmə və OKAY Axını üçün VPN Premium Quraşdırma Kılavuzu: 10 addım
REO tərəfindən Yüksək Sürətli Yükləmə və OKAY üçün VPN Premium Quraşdırma Kılavuzu: Təşəkkürlər, Asuswrt-MerlinHi, Taylandlıyam. Orta hesabla 100 Mb/s ətrafında yüksək sürətli bir yükləmə və Netflix, Crunchyroll, Hulu və s. Üçün bəlkə də ən hamar axın üçün Taylanddan gələn bir VPN ətraflı qurma təlimatı yazacağam
Yavaş hərəkətli videolar üçün yüksək sürətli saat: 4 addım
Yavaş Hərəkətli Videolar üçün Yüksək Sürətli Saat: Müasir bir smartfonu olan demək olar ki, hər kəsin möhtəşəm yavaş hərəkətli videolar çəkmək üçün istifadə edilə bilən yüksək sürətli kamerası var. Ancaq sabun köpüyünün partlamasının və ya qarpızın partlamasının əslində nə qədər vaxt apardığını ölçmək istəsəniz
Yeni Başlayanlar üçün Yüksək Sürətli Videoqrafiya .: 6 Addım (Şəkillərlə)
Yeni Başlayanlar üçün Yüksək Sürətli Videoqrafiya .: Görüşdüyüm və danışdığım hər kəs ortaq bir şeyi bölüşür: yüksək sürətli kameraya sahib olmaq və ya heç olmasa onunla oynamaq istəyi. Bunu oxuyanların bir çoxunun özünəməxsus yüksək sürətli kamerasına sahib olduğuna şübhə etsəm də, arzulayıram ki, az adam