Mikrokontrollerda Furye transformatsiyasi. Signallarning spektral tahlili. Tez Furye o'zgarishi
Raqamli signallarni qayta ishlash (DSP) uchun juda ko'p maxsus protsessorlar mavjud, masalan, Texas Instruments TMS320 seriyali DSP, ular oddiy butun yadrolarni va suzuvchi nuqta ma'lumotlarini qayta ishlaydigan C6000 oilasi subfamiliyasi kabi yirtqich hayvonlarni o'z ichiga oladi. Analog Devices-dan ADSP-ning butun seriyasi mavjud (u ko'proq yoki kamroq universal BlackFin-ni o'z ichiga oladi), MicroChip - dsPIC-dan oddiyroq echimlar ham mavjud.
Biroq, ixtisoslashtirilgan DSP yaxshi, lekin bu har doim juda zarurmi? Ha, ma'lumotlarning katta oqimi bilan bu shunchaki almashtirib bo'lmaydigan, ammo oddiyroq ishlov berish vazifalari ham mavjud. Xususan, meni ikki tomonlama konvertatsiya vazifasi qiziqtirdi - audio signal konvolved bo'lib, shu bilan spektrni oladi, keyin spektrda har qanday operatsiyalarni bajarish va teskari konvertatsiya qilish, shu bilan qayta ishlangan signalni olish mumkin. Bularning barchasi real vaqtda amalga oshirilishi va telefon sifatidan past bo'lmagan sifatga ega bo'lishi kerak.
Bu 2000-yil emas, yuqori samarali ARM7/Cortex-M3 yadrolariga asoslangan yagona chipli echimlar mavjud bo'lib, ularning narxi sezilarli darajada pasaygan; ular 32 bitli, 32 bitli ko'paytirish operatsiyasining apparat tatbiqiga ega (bundan tashqari , deyarli DSP ko'paytirish-to'plash operatsiyasi va 64 bitli natija) va Cortex-M3 apparat bo'linmasini ham o'z ichiga oladi.
Men sizni darhol ogohlantirmoqchimanki, signalni qayta ishlash mening mutaxassisligim emas, deyarli barcha bilimlar (aniqrog'i, printsiplarni tushunish) institutdan saqlanib qolgan, ammo endi men uni sinab ko'rishni va amalga oshirishni xohladim. Aytmoqchi bo'lganim, tavsiflashda, tushunchalarni almashtirishda va hokazolarda noaniqliklar bo'lishi mumkin. Aslida, akademik aniqlik meni unchalik tashvishga solmadi.
Deyarli har qanday DSP uchun yuqorida ko'rsatilgan vazifa oddiy va tushunarli. Ammo umumiy maqsadli RISC yadrosi unga qanday munosabatda bo'ladi? Agar biz AVR yoki PICni hisobga olsak, ular etarli bo'lishi dargumon. 8-bit va past soat chastotasi ta'sir qiladi. Biroq, Elm-Chan AVR da FFT o'tkazadigan va signal spektrini chizadigan dizaynlarga ega. Biroq, bu holda, real vaqtda, oddiygina vizualizatsiya amalga oshiriladi (minimal ishlov berish aniqligi bilan) va signalni qabul qilinadigan ovoz sifati bilan to'liq qayta ishlash emas.
LPC2146 eksperimental chip sifatida ARM7TDMI-S yadrosi asosida tanlangan va maksimal takt chastotasi 60 MGts (amalda u 72 yoki hatto 84 MGts da ishlamaydi). Nega? Birinchidan, menda buning uchun disk raskadrovka taxtasi bor, ikkinchidan, bortda ADC va DAC mavjud, ya'ni. minimal tashqi trim talab qilinadi.
Bir oz nazariya
Avvalo, ARM mikrokontrollerlarida FFT (Fast Furier Transform) ish faoliyatini baholash qiziqarli bo'ldi. Ushbu baholashga asoslanib, biz audio ma'lumotlar oqimini qayta ishlash uchun etarli tezlikka egami yoki yo'qmi va bunday mikrokontrolörda qanday namuna olish chastotasi va qancha kanalni qayta ishlash mumkinligi haqida xulosa qilishimiz mumkin.
Furye transformatsiyasiga asoslanib, siz aqlli filtrlarni yaratishingiz mumkin (juda jozibali xususiyatlarga ega). Meni birinchi navbatda signalning ohangini o'zgartirish (spektrni ko'tarish va tushirish) va spektrni "aks etish" muammolari qiziqtirdi. Ikkinchisi SDR radiolarida LSB pastki yon tarmoqli radio eshittirishlarini tinglash uchun talab qilinadi.
Men sizga nazariyani yuklamayman va Furye o'zgarishi nima ekanligini tushuntirmayman; bu mavzu bo'yicha juda ko'p materiallar mavjud, men foydalangan narsalardan: wiki va juda yaxshi va ma'lumotli kitobdan bo'lim.
Dasturiy ta'minotni amalga oshirish
FFT-ning ko'plab dasturlari mavjud, ammo men o'zim yozganman. Mening asosiy maqsadim ma'lum bir arxitektura uchun kodni optimallashtirish edi. Birinchidan, men darhol 32-bitga e'tibor qaratdim, ikkinchidan, faqat butun sonlarni hisoblash talab qilindi va bo'linish operatsiyasidan qochish kerak edi. Ushbu talablarga javob beradigan tayyor narsalarni topish allaqachon muammoli.
Oldindan hisoblab chiqilishi mumkin bo'lgan barcha konstantalar hisoblab chiqilgan va jadvallarga joylashtirilgan (asosan trigonometrik funktsiyalarning qiymatlari). Bu algoritmning asosiy optimallashidir, aks holda u tasvirlangan algoritmni deyarli to'liq takrorlaydi.
Eng muhimi, butun sonlarni hisoblash uchun talab. Amalga oshirish jarayonida hatto 32-bitli tsikl o'zgaruvchilardan birida to'lib ketishga olib keladigan xatolik yuz berdi. Bundan tashqari, u barcha test ma'lumotlarida ko'rinmadi, shuning uchun topilmaguncha u juda bosh og'rig'iga sabab bo'ldi.
Men barcha manba matnlarni bitta arxivda to'pladim. Amalga oshirish yakuniy emas, takroriy hisob-kitoblar mavjud (spektr va faza simmetriyasi hisobga olinmaydi) va buferlardan foydalanishni optimallashtirish talab etiladi, chunki hozirda hisob-kitoblar uchun juda ko'p RAM ishlatiladi (1024 ballni konvertatsiya qilish uchun deyarli 12k). ).
Birinchi sinovlar
Baraban rulosi: 1024 ball namunasi uchun konversiya tezligini sinab ko'rmoqdaman, protsessor yadrosi chastotasi 60 MGts. Sinov emulyatorda o'tkazildi, shuning uchun u 100% aniq deb da'vo qilmaydi, ammo bu natijani ko'rsatkich sifatida ishlatish mumkin (oldingi tajribamda, emulyator yolg'on gapirgan bo'lsa ham, unchalik ko'p emas edi). Kodning birinchi versiyasi testi, RealView MDK kompilyatori, O3 optimallashtirish opsiyasi, ARM kodini yaratish rejimi.
Shunday qilib, biz nimani ko'rmoqdamiz:
Har bir konvertatsiya uchun 6 ms, ikki tomonlama konvertatsiya uchun jami 12 ms dan sal ko'proq. Ma'lum bo'lishicha, namuna olish chastotasi 44100 Gts (audio uchun standart) va 16 bitgacha bo'lgan namunalar bilan sof hisob-kitoblar ~ 44 * 12 ms = 528 ms vaqtni oladi. Va bu proshivkaning oraliq versiyasida, ba'zi kod optimallashtirishlari hali tugallanmagan (hisob-kitoblarga ko'ra, algoritmni deyarli 2 baravar tezlashtirish mumkin)! Menimcha, bu shunchaki ajoyib ko'rsatkich.
Umuman olganda, asosiy yuk 50% atrofida bo'lishi kutilmoqda, yana 50% ADC, DAC va boshqa ma'lumotlarni uzatish bilan ishlashda spektr bo'yicha konvertatsiya va qo'shimcha xarajatlar uchun qoladi. Agar siz namuna olish chastotasini "telefon" darajasiga (taxminan 4800-9600 Gts) tushirsangiz, u holda asosiy yuk yanada past bo'ladi (taxminan 15-30%).
Shunday qilib, matematik qism ko'proq yoki kamroq aniq. Siz aniq amalga oshirishga o'tishingiz mumkin.
Temir
Sinov platformasi uchun biz dinamikli Keil MCB2140 ishlab chiqish taxtasidan foydalandik. Qurilmaning chiziqli chiqishiga ulanish uchun Mini-Jack shnuri lehimlanadi va oddiy kirish zanjiri yig'iladi. Yuqorida aytib o'tilganidek, platada allaqachon mikrokontrollerning analog chiqishiga ulangan dinamik mavjud va boshqaruv elementlari (tugmacha va potansiyometr) mavjud.
![](https://i2.wp.com/igorkov.org/images/mcb2140.jpg)
Mana kirish sxemasining eskizi:
![](https://i0.wp.com/igorkov.org/images/dsp-amplifer.jpg)
Dasturiy ta'minotni nosozliklarni tuzatish bosqichma-bosqich amalga oshirildi:
- Barcha kerakli tashqi qurilmalarni disk raskadrovka qilish: ADC, DAC, taymerlar, LED ko'rsatkichi.
- Signalni raqamlashtirish bilan sinov: Men ma'lumotlarni kerakli tezlikda raqamlashtiraman va uni buferga joylashtiraman, keyin buferdan ma'lumotlarni chiqarib, signalni o'ynayman. Bular. hech qanday o'zgarishlarsiz vaqt bo'yicha oddiy signal almashinuvi. Ushbu bosqichda keyingi ish uchun zarur bo'lgan 2 ta bufer bilan ishlash mexanizmi sinovdan o'tkaziladi.
- To'g'ridan-to'g'ri va teskari Furye o'zgarishlari oldingi versiyaga qo'shiladi. Ushbu test, nihoyat, FFT kodining to'g'ri ishlashini, shuningdek kodning mavjud ishlashga mos kelishini tekshiradi.
- Shundan so'ng, dasturning asosiy skeleti amalga oshiriladi, siz amaliy dasturlarga o'tishingiz mumkin.
Kodga FFT qo'shgandan keyin muammo paydo bo'ldi: signalda begona shovqin va hushtak paydo bo'ldi. Umuman olganda, bu xatti-harakat menga juda g'alati tuyuldi, chunki ... Konvertatsiya qilmasdan, raqamli yo'ldan o'tadigan signal juda toza bo'lib qoldi. Buning birinchi sababi: analog sxemadan keyin ADCdagi signal amplitudasi to'liq emas edi (0-3,3V), lekin faqat pleerning maksimal hajmida 0,5-2V ichida, ikkinchisi: butun son tufayli juda kuchli shovqin. hisob-kitoblar (+-1 birlik, bu ovozli shovqinni keltirib chiqarish uchun etarli bo'lib chiqdi).
Birinchi muammoga qarshi kurashish uchun analog qismni sozlashni boshlashga qaror qilindi. Va shovqin bilan muammoni hal qilish uchun past chastotali filtrdan foydalanishga harakat qiling.
Ilova 1: signal ohangini o'zgartirish
Kengashda nazorat qilish uchun ishlatilishi mumkin bo'lgan potansiyometr (o'zgaruvchan qarshilik) mavjud. Bunday holda, u signal spektrini yuqoriga va pastga siljitish uchun o'rnatadi, bu sizning sevimli kompozitsiyalaringizni "o'zgartirish" uchun etarli.
Chastotalar domenida nima sodir bo'ladi:
![](https://i2.wp.com/igorkov.org/images/dsp-arm-3.png)
Bunday holda, konvertatsiya natijasi 2 ta buferda saqlanadi. Bitta bufer haqiqiy qism, ikkinchisi esa xayoliy qismdir. Ularda olingan raqamlarning jismoniy ma'nosi: haqiqiy qism harmonika qiymatlarini o'z ichiga oladi, xayoliy qism bu harmonikalar uchun fazaviy siljishni o'z ichiga oladi. Bundan tashqari, ko'rib turganingizdek, dastlabki signal N-qiymatlari bilan tavsiflanadi va konvertatsiya qilingandan so'ng 2N-qiymatlari olinadi. Axborot miqdori o'zgarmaydi va ma'lumotlar miqdorining 2 baravar ortishi bufer ma'lumotlarida qiymatlarni takrorlash shaklida ortiqcha bo'lganligi sababli sodir bo'ladi.
Displey qurilmasi sifatida ikki qatorli belgili LCD indikator ishlatiladi. Ushbu loyihani amalga oshirishda asosiy nuqta apparat emas, balki dasturiy ta'minot, aniqrog'i 8 bitli mikrokontrollerda diskret Furye transformatsiyasini (DFT) amalga oshirishdir. Darhol shuni ta'kidlash kerakki, muallif bu sohada mutaxassis emas va shuning uchun asosiy narsadan - oddiy diskret Furye konvertatsiyasidan boshlagan. Tez Furye o'zgartirish algoritmi nafaqat tez, balki juda murakkab.
Discrete Furier Transform (ingliz adabiyotida DFT, Discrete Fourier Transform) raqamli signallarni qayta ishlash algoritmlarida (uning modifikatsiyalari MP3 formatida audio siqishda, JPEG formatida tasvirni siqishda va hokazo) keng qo‘llaniladigan Furye transformlaridan biridir. diskret (masalan, raqamli analog) signaldagi chastotalarni tahlil qilish bilan bog'liq boshqa sohalar. Diskret Furye konvertatsiyasi kirish sifatida diskret funktsiyani talab qiladi. Bunday funktsiyalar ko'pincha namuna olish (uzluksiz funktsiyalardan qiymatlarni tanlash) orqali yaratiladi.
Ovozli signal spektr analizatorining sxemasi juda oddiy va raqamli va analog qismga bo'linishi mumkin.
Raqamli qism mikrokontroller va unga ulangan LCD indikator tomonidan shakllantiriladi. Mikrokontroller 16 MGts chastotali kvarts rezonatoridan ishlaydi; +5 V ta'minot kuchlanishi mikrokontrollerning ADC uchun mos yozuvlar kuchlanishi sifatida ishlatiladi.
LCD indikatorning ma'lumotlar shinasi mikrokontrollerning C portiga (PC0-PC3 kirish / chiqish liniyalari), boshqaruv shinasi mikrokontrollerning D (PD5, PD6) portiga ulangan. Ko'rsatkich 4 bitli rejimda ishlaydi. Kontrastni sozlash uchun nominal qiymati 4,7 kOm bo'lgan o'zgaruvchan qarshilik ishlatiladi. Ko'rsatkich bilan ishlash uchun analizatorning 8 ta gorizontal ustunini ko'rsatish uchun maxsus belgilar yaratilgan; bu maxsus belgilar LCD indikatorining barcha 64 bayt RAMni egallaydi.
Mikrokontroller tashqi 16 MGts chastotali kvarts rezonatoridan ishlaydi.
Qurilmaning analog qismi eng muhim qism bo'lib, elektret mikrofon signalining oldingi kuchaytirgichi bo'lib, uning chiqishi mikrokontrollerga o'rnatilgan ADC ning ADC0 kanaliga ulangan. ADC kirishidagi nol darajasini mos yozuvlar kuchlanishining to'liq yarmiga o'rnatishimiz kerak, ya'ni. 2,5 V. Bunday holda biz signalning ijobiy va salbiy yarim to'lqinidan foydalanishimiz mumkin, ammo uning amplitudasi belgilangan chegaradan oshmasligi kerak, ya'ni. Ortiqcha yuklanishning oldini olish uchun daromad nozik sozlanishi kerak. Yuqoridagi barcha shartlar umumiy kam quvvatli operatsion kuchaytirgich mikrosxema tomonidan bajariladi.
DFT algoritmi Fast Furier Transform bilan solishtirganda biroz sekinroq. Ammo bizning spektr analizatorimiz yuqori tezlikni talab qilmaydi va agar u sekundiga taxminan 30 kadr yangilanish tezligini ta'minlay olsa, bu audio signal spektrini tasavvur qilish uchun etarli bo'ladi. Har qanday holatda, bizning versiyamizda sekundiga 100 kvadrat tezlikka erishish mumkin, ammo bu allaqachon ikki qatorli belgilar LCD indikatori uchun juda yuqori parametr qiymati va tavsiya etilmaydi. Namuna olish chastotasi 32 nuqtali diskret Fourier transformatsiyasi uchun 20 kHz ni tashkil qiladi va transformatsiya natijasi nosimmetrik bo'lgani uchun biz faqat birinchi yarmini ishlatishimiz kerak, ya'ni. dastlabki 16 ta natija. Shuning uchun biz chastota spektrini 10 kHz gacha ko'rsatishimiz mumkin va analizator o'lchamlari 10 kHz/16 = 625 Hz.
Dizayn muallifi DFT hisob-kitoblarining tezligini oshirishga harakat qildi. Agar bu transformatsiya N nuqtaga ega bo'lsa, biz sinus va kosinusning N2/2 qiymatlarini topishimiz kerak. 32 nuqtali konvertatsiya qilish uchun biz 512 sinus va kosinus qiymatlarini topishimiz kerak. Ammo, ularni topishdan oldin, biz CPU vaqtini talab qiladigan burchakni (darajani) hisoblashimiz kerak, shuning uchun ushbu hisob-kitoblar uchun qiymat jadvallaridan foydalanishga qaror qilindi. Mikrokontroller dasturida hisoblashda suzuvchi nuqta va ikki tomonlama aniqlik raqamlari ishlatilmaydi, chunki bu 8 bitli mikrokontrollerda ishlov berish uchun ko'proq vaqt talab etadi. Buning o'rniga, qidiruv jadvallaridagi qiymatlar 10000 ga ko'paytirilgan 16 bitli butun ma'lumotlardan foydalanadi. Keyin, konvertatsiya qilgandan so'ng, natijalar 10000 ga bo'linadi. Ushbu yondashuv bilan soniyada 120 ta 32 nuqtali konvertatsiya qilish mumkin. , bu bizning qurilmalarimiz uchun etarli.
ATmega32 mikrokontrollerida spektr analizatorining ishlashini ko'rsatish
Yuklashlar
Manba kodi (mikrokontroller dasturi, sinus, kosinus va burchak ma'lumotlari jadvallari) -
- AVRda yorug'lik va musiqadan uzoqroqqa borish qiyinligi aniq, parametrlar to'g'ri emas. Ammo sekundiga 120 ta 32 ballli konvertatsiya ko'p vazifalar uchun etarli bo'lishi mumkin. Va siz, albatta, 625 Gts chastotali boshqa namunani olishingiz mumkin, aniqrog'i yangilanish tezligini yo'qotishingiz mumkin. Shuni ta'kidlash kerakki, MK o'zini yomon his qiladi, unumdorlik nuqtai nazaridan, siz unga bog'lashingiz mumkin bo'lgan boshqa narsa yo'q. Ammo bu erda siz apparat ma'lumotlarini uzatish usullaridan foydalangan holda natijaning chiqishini tashkil qilishingiz mumkin. Keyin u yordamchi mikrokontroller bo'ladi va asosiysi faqat undan ma'lumotlarni oladi va uni boshqa jarayonlarga mos ravishda qayta ishlaydi. Umuman olganda, bu hali ham protsessorning chastotasiga bog'liq. Bir vaqtlar 20 MGts dan yuqori mega overclock qilish mumkin edi, ammo bu vazifalar uchun biz, ehtimol, faqat yuqori chastotalarda nosozliklarni olamiz. Fikr yaxshi, agar matematikaning ko'proq qismlari yozilsa ... bu uning MKda amalga oshirilishi
- Bundan tashqari, men yanada qiziqarli analizatorlar yaratdim: You Tube yoki rangli LCD displeydagi versiya: You Tube mashhur Chen kutubxonasiga asoslangan :)
- "Biz burchakni (darajani) hisoblashimiz kerak" Kimdir bizga ushbu jadvallar uchun qiymatlar qanday hisoblanganligini batafsil aytib bera oladimi?
- Sinuslar va kosinuslar jadvali bilan hamma narsa aniq. Deraja_lookup jadvalidagi qiymatlar qanday hisoblangani aniq emasmi?