Агуулгын хүснэгт:
Видео: QuickFFT: Arduino -д зориулсан өндөр хурдны FFT: 3 алхам
2024 Зохиолч: John Day | [email protected]. Хамгийн сүүлд өөрчлөгдсөн: 2024-01-30 11:01
Ердийн 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 гаралттай таарч байна. Гэсэн хэдий ч гаралт нь маш их дуу чимээнээс бүрддэг бөгөөд энэ нь зарим програмыг төөрөгдүүлж болзошгүй юм. Тиймээс өргөдөл гаргахаасаа өмнө кодыг сайтар шалгаж үзэхийг зөвлөж байна.
Энэ код нь таны төсөлд хэрэгтэй байсан гэж найдаж байна. Ямар нэгэн асуулт, санал байвал коммент хэсэгт бичнэ үү.
Зөвлөмж болгож буй:
Гэрийн өндөр хурдны цахилгаан машин: 7 алхам
Гар хийцийн өндөр хурдны цахилгаан машин: Хэрэв та хэзээ нэгэн цагт өөрийн гараар цахилгаан машин үйлдвэрлэхийг хүсч байсан бол энэ бол энгийн дэлгүүрээс өндөр хурдны машин үйлдвэрлэх, цахим дэлгүүрээс хэд хэдэн хямдхан зүйл хийх маш энгийн арга юм. RC машинд 30-60 доллар зарцуулахаа больсон
Өндөр хурдны ЭКГ эсвэл бусад өгөгдлийг нэг сарын турш тасралтгүй бүртгэх: 6 алхам
Өндөр хурдны ЭКГ эсвэл бусад өгөгдлийг нэг сарын турш тасралтгүй бүртгэх: Энэхүү төслийг их сургуулийн анагаах ухааны судалгааны багийг дэмжих зорилгоор боловсруулсан бөгөөд 2х ЭКГ -ийн дохиог тус бүр 1000 дээж/сек (2K дээж/сек нийт) авах боломжтой зүүж хэрэглэх шаардлагатай болсон. хэм алдагдлыг илрүүлэх зорилгоор 30 хоногийн турш тасралтгүй хийдэг. Төслийн урьдчилсан
24V DC мотороос өндөр хурдны бүх нийтийн мотор (30 вольт): 3 алхам
24V DC мотороос өндөр хурдны бүх нийтийн мотор (30 вольт): Сайн байна уу! Энэхүү төсөлд би ердийн тоглоомын 24V DC моторыг 30V бүх нийтийн мотор болгон хувиргахыг зааж өгөх болно. . Залуус аа, би эхлээд видеог үзэхийг танд зөвлөж байна. V төсөл
Удаан хөдөлгөөнт видеонд зориулсан өндөр хурдны цаг: 4 алхам
Удаан хөдөлгөөнт видеонд зориулсан өндөр хурдны цаг: Орчин үеийн ухаалаг гар утас бүхий бараг бүх хүн өндөр хурдны камертай бөгөөд гайхалтай удаан хөдөлгөөнт видео бүтээх боломжтой. Гэхдээ хэрэв та савангийн хөөс хагарах эсвэл тарвас дэлбэрч эхлэхэд хэр удаан хугацаа шаардагдахыг хэмжихийг хүсч байвал та
Эхлэгчдэд зориулсан өндөр хурдны видео бичлэг: 6 алхам (зурагтай)
Эхлэгчдэд зориулсан өндөр хурдны видео бичлэг: Миний уулзаж, ярилцсан бүх хүмүүс нэг зүйлийг хуваалцдаг: өндөр хурдны камер эзэмших эсвэл ядаж тоглох хүсэл. Үүнийг уншиж буй хүмүүсийн ихэнх нь өндөр хурдны камертай гэдэгт эргэлзэж байгаа ч цөөн хэдэн хүмүүс үүнийг хийхийг хүсч байна