Mündəricat:

QuickFFT: Arduino üçün Yüksək Sürətli FFT: 3 addım
QuickFFT: Arduino üçün Yüksək Sürətli FFT: 3 addım

Video: QuickFFT: Arduino üçün Yüksək Sürətli FFT: 3 addım

Video: QuickFFT: Arduino üçün Yüksək Sürətli FFT: 3 addım
Video: QuickFFT: High Speed FFT for Arduino 2024, Iyun
Anonim
QuickFFT: Arduino üçün Yüksək Sürətli FFT
QuickFFT: Arduino üçün Yüksək Sürətli FFT

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: İş

İşləyir
İşləyir
İşləyir
İşləyir
İşləyir
İşləyir
İşləyir
İşləyir

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:

Nəticələr
Nəticələr
Nəticələr
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ə: