Агуулгын хүснэгт:

QuickFFT: Arduino -д зориулсан өндөр хурдны FFT: 3 алхам
QuickFFT: Arduino -д зориулсан өндөр хурдны FFT: 3 алхам

Видео: QuickFFT: Arduino -д зориулсан өндөр хурдны FFT: 3 алхам

Видео: QuickFFT: Arduino -д зориулсан өндөр хурдны FFT: 3 алхам
Видео: QuickFFT: High Speed FFT for Arduino 2024, Арваннэгдүгээр
Anonim
QuickFFT: Arduino -д зориулсан өндөр хурдны FFT
QuickFFT: Arduino -д зориулсан өндөр хурдны FFT

Ердийн Arduino нь RAM болон боловсруулах хүчин чадал хязгаарлагдмал бөгөөд FFT нь тооцоолол шаарддаг маш нарийн процесс юм. Бодит цагийн олон програмын хувьд цорын ганц шаардлага бол хамгийн их далайцтай давтамж авах эсвэл давтамжийн оргилыг илрүүлэх шаардлагатай байдаг.

Миний зааварчилгааны нэгэнд би FFT -ийн кодыг бэлтгэсэн бөгөөд үүнийг эндээс олж болно: EasyFFT

Энэ код нь Arduino нано дээр 128 хүртэлх дээжийн FFT хийх боломжтой байв. Ардуиногийн санах ой хязгаарлагдмал байгаа тул үүнээс илүү өндөр тооны дээж авах боломжгүй байна. Би хурдыг сайжруулах, санах ойн хэрэглээг багасгахын тулд функцийг бага зэрэг өөрчилсөн. Энэхүү өөрчлөлт нь Arduino -д FFT -ийг 5 дахин хурдан гүйцэтгэх боломжийг олгодог бөгөөд санах ойн бараг тал хувийг зарцуулдаг. Энэхүү зааварчилгаа нь FFT -ийн ажлыг хамардаггүй бөгөөд лавлагааг EasyFFT дээрээс олж болно.

Алхам 1: Ажиллаж байна

Ажиллаж байна
Ажиллаж байна
Ажиллаж байна
Ажиллаж байна
Ажиллаж байна
Ажиллаж байна
Ажиллаж байна
Ажиллаж байна

FFT -ийн ердийн функцийг хурдыг бага нарийвчлалтай сайжруулахын тулд өөрчилдөг. Зураг дээр үзүүлсэн шиг туршилтын дохиог синус эсвэл косинус долгионы хэлбэрээр үржүүлэх шаардлагатай. Эдгээр утгууд нь 0 -ээс 1 хооронд байж болох тул хөвөгч үржүүлэх нь заавал байх ёстой. Arduino -д хөвөгч үржүүлэх нь бүхэл тоон үйлдэлтэй харьцуулахад удаан байдаг.

Энэ функцид синус/косинус долгионыг дөрвөлжин долгионоор солино. Бид туршилтын дохиог 0, 1 эсвэл -1 утгатай дөрвөлжин долгионоор үржүүлэх ёстой. Үүнтэй холбогдуулан бид хөвөгч үржүүлгийг бүхэл тоон нэмэх эсвэл хасах байдлаар сольж болно. Arduino бүхэл тоог нэмэх буюу хасах нь ойролцоогоор 5 дахин хурдан байдаг. Энэ нь 5 дахин хурдан шийдвэрлэх боломжийг олгодог.

Энэхүү өөрчлөлтийн ачаар одоо давтамжийн савны утгыг бүхэл тоогоор хадгалах боломжтой (өмнө нь хөвж байсан) бөгөөд бид санах ойн хэрэглээ багатай бас нэг давуу талыг олж авдаг. Arduino Nano -д int нь 2 байт санах ой, float нь 4 байт санах ой зарцуулдаг. Шинэ кодын давуу талыг харгалзан бид бараг 256 дээжинд (өмнө нь 128 дээж) FFT хийх боломжтой болсон.

Энгийн FFT -д бид илүү хурдан шийдлийг гаргахын тулд синусын утгыг хадгалах шаардлагатай байсан. Шинэ функцэд синус/косинусын утга шаардлагагүй болсон тул бид үүнийг арилгаж, санах ойг хадгалах боломжтой болно.

Хэрэгжилт:

Энэ функцийг хэрэгжүүлэх нь шууд юм. Бид функцийг кодын төгсгөлд хуулж болно. Энэ функцийг дараах тушаалыг ашиглан гүйцэтгэж болно.

float f = Q_FFT (өгөгдөл, 256, 100); Q_FFT функцэд, өгөгдөл: энэ нэр томъёо нь дохионы утгатай массив бөгөөд санал болгож буй дээжийн хэмжээ нь 2, 4, 8, 32, 64, 128, 256, 512, … цаашаа байна. хэрэв түүврийн хэмжээ нь эдгээр утгуудад хамаарахгүй бол түүнийг утгуудын хамгийн ойрын доод хэсэгт буулгах болно. Жишээлбэл, хэрэв дээжийн хэмжээ 75 -аас их байвал 64 тооны дээжийг авах болно. Дээжийн хамгийн дээд хэмжээг Arduino дээр байгаа RAM -аар хязгаарладаг.

Хоёрдахь нэр томъёо нь массив дахь дээжийн тоог тодорхойлдог бөгөөд сүүлийн хугацаа нь Гц давтамжийг авах давтамж юм.

Алхам 2: Код

Энэ хэсэгт EasyFFT кодонд оруулсан өөрчлөлтийг тайлбарлах бөгөөд үүнийг кодын өөрчлөлтийг хийхдээ санаж байх хэрэгтэй.

1. Өмнө тайлбарласны дагуу энд бүхэл тоонуудыг FFT хийхэд ашигладаг. Arduino дахь Int нь 16 битийн тоо бөгөөд -32768 -аас 32768 хүртэлх утгыг агуулж болно. Int -ийн утга энэ хүрээнээс хэтэрсэн тохиолдолд энэ нь асуудал үүсгэдэг. Түвшин тооцоолсны дараа энэ асуудлыг арилгах. Хэрэв утга нь 15000 -аас хэтэрсэн бол бүрэн массивыг 100 -д хуваах болно.

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 f = Q_FFT (өгөгдөл, 256, 100);

6. Оргил илрүүлэлт: Хамгийн их далайцтай давтамжийг олсны дараа энэ функц нь үнэн зөв үр дүнг тооцоолохын тулд түүний өмнөх ба дараах давтамжийн далайцыг ашигладаг. Энэхүү тооцоололд ашигласан далайц нь мөн модулийн нийлбэр юм (квадратуудын нийлбэрийн квадрат язгуур биш)

Хэрэв Fn нь хамгийн их далайцтай давтамж бол давтамжийг доорх томъёогоор тооцоолж болно.

Бодит F = (A n-1 *Fn-1+An-1 *Fn-1+An-1 *Fn-1) / (Ан-1+Ан+Ан+1)

Энд An нь n давтамжийн далайц, Fn-1 нь давтамжийн утга юм.

Алхам 3: Үр дүн:

Үр дүн
Үр дүн
Үр дүн
Үр дүн

Шийдвэрлэх хугацааг EasyFFT -тэй харьцуулсан зураг дээр харуулав. Үүний хурдыг харьцуулалтаар харуулав.

Янз бүрийн давтамжтай 3 синусоид долгионтой дээжийн өгөгдлийг харуулав. QuickFFT -ийн үр дүнг Scilab гаралттай харьцуулж үздэг. Зураг дээр бидний харж байгаагаар хамгийн их далайцтай 3 оргил нь Scilab гаралттай таарч байна. Гэсэн хэдий ч гаралт нь маш их дуу чимээнээс бүрддэг бөгөөд энэ нь зарим програмыг төөрөгдүүлж болзошгүй юм. Тиймээс өргөдөл гаргахаасаа өмнө кодыг сайтар шалгаж үзэхийг зөвлөж байна.

Энэ код нь таны төсөлд хэрэгтэй байсан гэж найдаж байна. Ямар нэгэн асуулт, санал байвал коммент хэсэгт бичнэ үү.

Зөвлөмж болгож буй: