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.

Mana kirish sxemasining eskizi:


Dasturiy ta'minotni nosozliklarni tuzatish bosqichma-bosqich amalga oshirildi:

  1. Barcha kerakli tashqi qurilmalarni disk raskadrovka qilish: ADC, DAC, taymerlar, LED ko'rsatkichi.
  2. 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.
  3. 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.
  4. 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:


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?

Kirish

Raqamli signallarni qayta ishlash bo'yicha kitoblar va nashrlar ko'pincha ishlab chiquvchilar oldida turgan muammolar haqida hech qanday tasavvurga ega bo'lmagan yoki tushunmaydigan mualliflar tomonidan yozilgan. Bu, ayniqsa, real vaqtda ishlaydigan tizimlar uchun to'g'ri keladi. Ushbu mualliflar o'zlariga vaqt va makondan tashqarida mavjud bo'lgan xudoning kamtarona rolini belgilashadi, bu esa bunday adabiyot o'quvchilarini hayratda qoldiradi. Ushbu nashr ko'pchilik ishlab chiquvchilar o'rtasida paydo bo'ladigan chalkashlikni bartaraf etishga va ularga "kirish ostonasini" engib o'tishga yordam berishga qaratilgan; bu maqsadlar uchun matn dasturlash sohasidagi analogiya va atamalardan ataylab foydalanadi.

Bu opus o'zini to'liq va izchil deb ko'rsatmaydi.

Izohlarni o'qib chiqqandan keyin qo'shildi.
FFTni qanday qilish haqida son-sanoqsiz nashrlar mavjud, ammo FFTni qanday qilish, spektrni o'zgartirish va signalni qayta yig'ish bo'yicha va hatto real vaqt rejimida nashrlar etarli emas. Muallif bu bo'shliqni to'ldirishga harakat qiladi.

Birinchi qism, umumiy ko'rinish

Diskret chiziqli dinamik tizimlarni qurishning ikkita asosiy usuli mavjud. Adabiyotda bunday tizimlar odatda raqamli filtrlar deb ataladi, ular ikkita asosiy turga bo'linadi: chekli impulsli javob filtrlari (FIR) va cheksiz impulsli javob (IIR) filtrlari.

FIR filtrining algoritmik mohiyati konvolyutsiya integralini diskret hisoblashdan iborat:

Bu erda x(t) - kirish signali
y(t) – chiqish signali
h(t) – filtrning impulsli javobi yoki filtrning delta funksiyasiga javobi. Impulsli javob K(f) filtrining kompleks chastotali javobining teskari Furye konvertatsiyasidir.

O'quvchi uchun aniq tasavvur hosil qilish uchun biz real vaqtda C tilida konvolyutsiya integralini diskret hisoblash misolini keltiramiz.

#define L (4) //filtr uzunligi int FIR(int a) ( static int i=0; //joriy pozitsiya static int reg[L]; //kirish qiymatlari qatori static const int h[L]= (1, 1,1,1);//impuls javobi int b=0;//chiqish qiymati reg[i]=a; //kirish qiymatini (int j=0) kirish qiymatlari qatoriga nusxalash ;j

Ushbu funktsiyani ma'lum vaqt oralig'ida T chaqirib, uni argument sifatida kirish signalini o'tkazib, chiqishda biz impulsli javobga ega bo'lgan filtrning javobiga mos keladigan chiqish signalini olamiz:

0 da H(t)=1 Boshqa hollarda h(t)=0.

Mavjud bo'lgan har bir kishi uchun bunday impulsli javobga ega filtr "harakatlanuvchi o'rtacha filtr" sifatida yaxshi tanilgan va shunga mos ravishda uni amalga oshirish ancha sodda. Bunday holda, bunday impulsli javob misol sifatida ishlatiladi.

Ko'pgina adabiyotlar FIR filtrlarining impulsli javoblarini sintez qilishga bag'ishlangan, shuningdek, belgilangan xususiyatlarga ega filtrlarni olish uchun tayyor dasturiy mahsulotlar mavjud. Muallif Matlab paketidagi buggy Filter Design vositasini afzal ko'radi, ammo bu didga bog'liq.

Cheklangan impulsli javobga ega bo'lgan filtrdan foydalanib, odatdagi haqiqatdan bir oz yuqoriga ko'tarilish mumkin, chunki tabiatda cheklangan impulsli javobga ega bo'lgan dinamik tizimlar mavjud emas. FIR filtri vaqt chastotasi domeniga tabiatning o'zi kabi emas, balki boshqa tomondan kirishga urinishdir, shuning uchun bu filtrlarning chastotali xarakteristikalari ko'pincha kutilmagan xususiyatlarga ega.

Cheksiz impulsli javobga ega filtrlar tabiatga ancha yaqin. Cheksiz impulsli javobga ega filtrlarning algoritmik mohiyati filtrni tavsiflovchi differensial tenglamaning takroriy (rekursiv bilan adashtirmaslik kerak!) yechimiga to'g'ri keladi. Ya'ni, filtr chiqish signalining har bir keyingi qiymati oldingi qiymat asosida hisoblanadi. Haqiqiy dunyoda jarayonlar aynan shunday ishlaydi. Har soniyada osmono'par binodan tushgan tosh tezligini 9,8 m/s ga oshiradi Tezlik=Tezlik+9,8, bosib o'tgan masofa esa har soniyada Masofa=Masofa+Tezlik ortadi. Kim bu takrorlanuvchi algoritm emas desa, birinchi bo‘lib menga tosh otsin. Faqat bizda Matritsa toshning o'rnini qaytaradigan funktsiyani chaqirish uchun vaqt oralig'i bizda mavjud bo'lgan o'lchov vositalarining bo'linish narxidan ancha past.

Alohida, men "filtr tartibi" tushunchasini aniqlamoqchiman. Bu takroriy operatsiyalarga bog'liq bo'lgan o'zgaruvchilar soni. Yuqoridagi misolda toshning tezligini qaytaruvchi funksiya birinchi tartibli, bosib o‘tgan masofani qaytaruvchi funksiya ikkinchi tartibli.

O'quvchini nihoyat yoritish uchun biz C tilida eng oddiy past o'tkazuvchan filtrga misol keltiramiz, keng tarqalgan "eksponensial tekislash filtri" filtri sifatida tanilgan.

#define alfa (2) //tekislash parametri int filter(int a) ( statik int out_alfa=0; out_alfa=out_alfa - (out_alfa >>alfa) + a; return (out_alfa >> alfa); )

Ushbu funktsiyani F chastotasi bilan chaqirish va uni kirish signalini argument sifatida o'tkazish orqali biz birinchi darajali past chastotali filtrning kesish chastotasi bilan javobiga mos keladigan chiqish signalini olamiz:

Berilgan manba kod misoli algoritm mohiyatini tushunish nuqtai nazaridan mutlaqo tushunarsizdir. Algoritmning takroriy mohiyati ("toshning qulashi" ga qarang) nuqtai nazaridan, bu to'g'riroq y=y+((x-y)>>alfa);, ammo bu holda alfa sezilarli darajada yo'qoladi. raqamlar. Misol kodidagi takroriy filtr ifodasi muhim bitlarni yo'qotmaslik uchun tuzilgan. Bu cheksiz impulsli javob bilan raqamli filtrning go'zalligini buzishi mumkin bo'lgan hisob-kitoblarning cheklangan aniqligi. Bu, ayniqsa, yuqori sifat omiliga ega yuqori tartibli filtrlarda seziladi. Haqiqiy dinamik tizimlarda bu muammo yuzaga kelmaydi; bizning Matritsa biz uchun aql bovar qilmaydigan aniqlik bilan hisob-kitoblarni amalga oshiradi.

Bunday filtrlarning sinteziga juda ko'p adabiyotlar bag'ishlangan va tayyor dasturiy mahsulotlar ham mavjud (yuqoriga qarang).

Ikkinchi qism. Furye filtri

Universitet kurslaridan (siz uchun haqiqatan ham bu OTEC kursi edi), hozir bo'lganlarning ko'pchiligi chiziqli dinamik tizimlarni tahlil qilishning ikkita asosiy yondashuvini eslaydilar: vaqt sohasida tahlil va chastota domenida tahlil. Vaqt sohasi tahlili differensial tenglamalar, konvolyutsiya va Dyuhamel integrallarining yechimidir. Ushbu tahlil usullari raqamli IIR va FIR filtrlarida diskret tarzda mujassamlangan.

Ammo chiziqli dinamik tizimlarni tahlil qilishda chastotali yondashuv mavjud. Ba'zan u operator deb ataladi. Operator sifatida Furye transformatsiyasi, Laplas konvertatsiyasi va boshqalar ishlatiladi. Quyida biz faqat Furye konvertatsiyasi haqida gaplashamiz.

Ushbu tahlil usuli raqamli filtrlarni qurishda keng qo'llanilmaydi. Muallif rus tilida bunday filtrlarni qurish uchun oqilona amaliy tavsiyalarni topa olmadi. Amaliy adabiyotlarda bunday filtr haqida yagona qisqacha eslatma [Rabiner L., Gould B., Raqamli signallarni qayta ishlash nazariyasi va qo'llanilishi 1978], ammo bu kitobda bunday filtrni ko'rib chiqish juda yuzaki. Ushbu kitobda filtrni qurish sxemasi: "FFT usuli yordamida real vaqtda konvolyutsiya" deb nomlanadi, bu mening kamtarona fikrimcha, mohiyatni umuman aks ettirmaydi, nom qisqa bo'lishi kerak, aks holda vaqt qolmaydi. dam olish uchun.

Chiziqli dinamik tizimning javobi kirish signali x(t) va kompleks uzatish koeffitsienti K(f)ning Furye tasviri mahsulotining teskari Furye transformatsiyasidir:

Amaliy nuqtai nazardan, bu analitik ifoda quyidagi tartibni nazarda tutadi: kirish signalining Furye konvertatsiyasini olamiz, natijani kompleks uzatish koeffitsientiga ko'paytiramiz, teskari Furye konvertatsiyasini bajaramiz, natijada chiqish signali bo'ladi. Haqiqiy diskret vaqtda bu protsedurani bajarib bo'lmaydi. Vaqt o'tishi bilan integralni minusdan ortiqcha cheksizgacha qanday olish mumkin?! Uni faqat vaqtdan tashqarida olish mumkin...

Diskret dunyoda Furye konvertatsiyasini amalga oshirish uchun vosita - Fast Furier Transform (FFT) algoritmi mavjud. Biz Furye filtrini qo'llashda foydalanamiz. FFT funksiyasining argumenti 2^n elementlarning vaqt namunalari massivi bo‘lib, natijada Furye konvertatsiyasining haqiqiy va xayoliy qismlariga mos keladigan uzunlikdagi 2^n elementlarning ikkita massivi hosil bo‘ladi. FFT algoritmining diskret xususiyati shundan iboratki, kirish signali 2^n interval bilan davriy hisoblanadi. Bu Furye filtri algoritmiga ba'zi cheklovlar qo'yadi. Agar siz kirish signalining namunalari ketma-ketligini olsangiz, ular bo'yicha FFT ni bajaring, FFT natijasini filtrning kompleks daromadiga ko'paytiring va teskari transformatsiyani bajaring... hech narsa chiqmaydi! Chiqish signali namunali ulanishlar yaqinida katta chiziqli bo'lmagan buzilishlarga ega bo'ladi.

Ushbu muammoni hal qilish uchun siz ikkita texnikadan foydalanishingiz kerak:

  • 1. Namunalar bir-birining ustiga chiqishi bilan Furye transformatsiyasi bilan qayta ishlanishi kerak. Ya'ni, har bir keyingi namuna avvalgisining bir qismini o'z ichiga olishi kerak. Ideal holda, namunalar (2 ^ n-1) namunalar bilan bir-biriga mos kelishi kerak, ammo bu juda katta hisoblash kuchini talab qiladi. Amalda to'rtdan uchdan ko'proq (2^n-2^(n-2)), yarmi (2^(n-1)) va hatto chorak bir-birining ustiga chiqishi (2^(n-2)) etarli.
  • 2. Chiqish signalini olish uchun teskari Furye konvertatsiyasi natijalari bir-birining ustiga tushishidan oldin og'irlik funktsiyasiga (vazn koeffitsientlari massivi) ko'paytirilishi kerak. Og'irlik funktsiyasi quyidagi shartlarga javob berishi kerak:
  • 2.1 2^n oralig'idan tashqari hamma joyda nolga teng.
  • 2.2 Intervalning chekkalarida u nolga intiladi.
  • 2.3 Va, eng muhimi, Fv(t) bir-birining ustiga chiqish oralig'i bilan siljigan og'irlik funksiyalarining yig'indisi doimiy bo'lishi kerak:

Bunday funktsiyalar raqamli signallarni qayta ishlash texnologiyasida keng qo'llaniladi va ular odatda derazalar deb ataladi. Muallifning kamtarona fikriga ko'ra, eng yaxshisi, amaliy nuqtai nazardan, Xon nomidagi deraza:

Rasmda uzunligi 2^n=256 bo'lgan Hahn oynasining xususiyatlarini aks ettiruvchi grafiklar ko'rsatilgan. Oyna misollari yarim qoplamali k=128 bilan qurilgan. Ko'rib turganingizdek, yuqorida aytib o'tilgan barcha xususiyatlar mavjud.

Ishchilarning iltimosiga ko'ra, quyidagi rasmda Furye filtri hisob-kitoblarining diagrammasi ko'rsatilgan, namuna uzunligi 2^n=8, namunalar soni 3. Bunday raqamlarda hisoblash jarayonini ko'rsatish juda qiyin. , ayniqsa, uning siklligini ko'rsatish qiyin, shuning uchun biz namunalar sonini uchtagacha chekladik.

Kirish signali uzunligi 2^n=8 bo'lgan bloklarga bo'linadi, 50% ustma-ust tushadi, har bir blokdan FFT olinadi, FFT natijalari kerakli transformatsiyadan o'tadi, teskari FFT olinadi, teskari FFT natijasi. skalyar ravishda oynaga ko'paytiriladi, ko'paytirishdan keyin bloklar bir-birining ustiga qo'shiladi.

Spektr o'zgarishlarini amalga oshirayotganda, haqiqiy signallarning FFT massivining asosiy xususiyatini unutmang, FFT massivining birinchi yarmi ikkinchi yarmi bilan murakkab konjugatsiyalangan, ya'ni Re[i]=Re[(1)<

Endi biz Furye filtri algoritmini yozish uchun kerak bo'lgan hamma narsani bilamiz. Algoritmni C tilida tasvirlab beramiz.

#o'z ichiga oladi #define FSempl (8000) //namuna olish chastotasi Hz #define BufL (64) //Bufer uzunligini qayta ishlash #define Perk (2) //ramkaning oʻzaro kelishi 2-1/2, 4-3/4 //spektrni cheklash, tarmoqli oʻtkazuvchanlik filtri #define FsrLow (300)//past filtr chastotasi Hz #define FsrHi (3100)//yuqori filtr chastotasi Hz #define FsrLowN ((BufL*FsrLow+(FSempl/2))/FSempl)//harmonikada past chastotani #define FsrHiN ((BufL*FsrHi +(FSempl/2))/FSempl)//harmonikada yuqori chastota //Spektr siljishi #define SdvigSp (0)//harmonikada spektr siljishi +(pastga) -(yuqoriga) 0 (siljishsiz) //Vaqt spektri filtri, echo #define FilterSpekrtaT_EN (1)//spektr filtrini ishlating 1/0 #define FiltSpektrFsr (0.100025f) //spektr filtrini kesish chastotasi uchuvchi belgisiz qisqa ShBuf;//kirish bufer hisoblagichi imzolangan qisqa BufIn;/ / kirish buferi imzolangan qisqa BufOut;//chiqish buferi imzolangan qisqa BufInOut;//float FurRe qayta yozish uchun bufer;//Fourier real qismi float FurIm;//Fourier xayoliy qismi #if (FilterSpekrtaT_EN!=0) float FStektr;//tude spektr #endif //Sinus kosinuslar jadvali #if BufL==64 const float SinCosF= ( 0.000000000 , 0.098017140 , 0.195090322 , 0.290284677 , 0.3826835 , 0.3826835 , 0.3826835 . 0233, 0,634393284, 0,707106781, 0,773010453, 0,831469612, 0,881921264, 0,923879533, 0,956940398, 0,956940398, 0,995184727, 1,000000000, 0,995184727, 0,980785280, 0,956940336, 0,923879533, 0,881921264, 0,881921264, 0,67013, 0,67013, 106781 , 0,634393284 , 0,555570233 , 0,471396737 , 0,382683432 , 0,290284677 , 0,195090328 , 0,195090328 , 0,10000, 0,1000. 98017140, -0,195090322, -0,290284677, -0,382683432, - 0,471396737 , -0,555570233, -0,634393284, -0,707106781, -0,773010453, -0,831469612, -0,881921264, -0,881921268, -0,9593, -0,9593, -0,9593, 785280, -0,99 5184727, -1,000000000, -0,995184727, -0,980785280, -0,956940336, -0,923879533, -0,88192126 , - 0,831469612, -0,773010453, -0,707106781, -0,634393284, -0,555570233, -0,471396737, -0,382683490, -0,382683490, -0,902, -8902, -8902, 980 17140, 0.000000000, 0.098017140, 0.195090322, 0.290284677, 0.382683432, 0.471396737, 0.5337, 0.535407, 0.5355506. 81 , 0,773010453, 0,831469612, 0,881921264, 0,923879533, 0,956940336, 0,980785280, 0,995184727); #endif //FFT saralash jadvali #if BufL==64 const unsigned short sortFFT= ( 0x0000,0x0020,0x0010,0x0030,0x0008,0x0028,0x0018,0x0038, 0x0004,0x0038, 0x0004,040,0x0,0x0,0x, x002C, 0x001C, 0x003C , 0x0002,0x0022,0x0012,0x0032,0x000A,0x002A,0x001A,0x003A, 0x0006,0x0026,0x0016,0x0036,0x0016,0x0036,03E0,E0,E0,E0, 0x0001, 0x0021,0x0011,0x0031,0x0009,0x0029,0x0019,0x0039, 0x0005 ,0x0025,0x0015,0x0035,0x000D,0x002D,0x001D,0x003D, 0x0003,0x0023,0x0013,0x0033,0x002B,0x0000,B,0x000,B x0027,0 x0017,0x0037,0x000F,0x002F,0x001F,0x003F ); #endif //Han oyna jadvali #if BufL==64 const float WinHanF= ( 0. 0, 0,002407637, 0,00960736, 0,021529832, 0,038060234, 0,059039368, 0,084265194, 0,113494773, 0,113494774, 0,113494774, 0,6082, 0,6105. 22214883, 0,264301632, 0,308658284, 0,354857661, 0,402454839, 0,45099143, 0,5, 0,54900857, 0,54900857, 0,51619, 0,59015 1716, 0,735698368, 0,777785117, 0,817196642, 0,853553391, 0,886505227, 0,915734806, 0,940960632, 0,961939766, 0,978470168, 0,99039264, 0,99039264, 0,99759, 0,99759 9903 9264, 0,978470168, 0,961939766, 0,940960632, 0,915734806, 0,886505227, 0,853553391, 0,853553391, 0,8427, 0,81717, 0,8427195. 68, 0,691341716, 0,645142339, 0,597545161, 0,54900857, 0,5, 0,45099143, 0,402454839, 0,354857661, 0,308658284, 0,264301632, 0,222214883, 0,182803146, 0,182803358, 0,401, 0,354857661. 084265194, 0,059039368, 0,038060234, 0,021529832, 0,00960736, 0,002407637); #endif //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@ // Toʻgʻridan-toʻgʻri Tez Furye oʻzgarishini hisoblash //argumentlar //Real uchun massivga koʻrsatgich ReFT va xayoliy qism ImFT // Amalga oshirilgandan so'ng, massivlar koeffitsientni o'z ichiga oladi. haqiqiy va xayoliy qismlar bekor FFTnoInv(float* ReFT,float* ImFT) ( //nusxa olish va qayta tartiblash for(int i=0;i) >1; long arg=0; //yadro argumenti, faza for(int j=0;j >1; long arg=0;////yadro argumenti, faza for(int j=0;j 0 //spektrni pastga siljiting, Karabas-Barabas for(int i=1;i<(BufL/2);i++) { if(i>=(BufL/2-SdvigSp)) ( FurRe[i]=FurIm[i]=0; FurRe=FurIm=0; davom; ) FurRe[i]=FurRe; FurIm[i]=FurIm; FurRe=FurRe[i]; FurIm=-FurIm[i]; ) #endif #if SdvigSp<0 //сдвиг спектра вверх, Буратино for(int i=(BufL/2-1);i>0;i--) (agar(i<=(-SdvigSp)) { FurRe[i]=FurIm[i]=0; FurRe=FurIm=0; continue; } FurRe[i]=FurRe; FurIm[i]=FurIm; FurRe=FurRe[i]; FurIm=-FurIm[i]; } #endif //обрезание спектра, полосовой фильтр FurRe=0.0F;FurIm=0.0F; //постоянная составляющая FurRe[(BufL/2)]=0.0F;FurIm[(BufL/2)]=0.0F;//последняя гармоника float ZnStektr;//амплитудный спектр кадра for(int i=1;i<(BufL/2);i++) { if((i < FsrLowN)//нижняя частота || (i >FsrHiN)//yuqori chastotali) (//spektrni kesish, diapazondan tashqari harmonikalar nolga teng FurRe[i]=0,0F;FurIm[i]=0,0F;//to'g'ridan-to'g'ri harmonikalar FurRe=0,0F;FurIm=0,0F ;//konjugat garmoniklar ) else //kesilmagan qismning amplituda spektrini hisoblang ( ZnStektr[i]=sqrtf(FurRe[i]*FurRe[i])+(FurIm[i]*FurIm[i]);// amplituda spektri ) ) // vaqt ichida amplituda spektr filtri, echo for(int i= FsrLowN;//pastki chastota i<=FsrHiN ;//верхняя частота i++) { #if FilterSpekrtaT_EN!=0 //фильтр спектра во времени, эхо FStektr[i]=FStektr[i]+ FiltSpektrFsr*(ZnStektr[i]-FStektr[i]); #endif //переходим от модуля к комплексному числу FurRe[i]=FurRe=(FStektr[i]*FurRe[i])/ZnStektr[i]; FurIm[i]=(FStektr[i]*FurIm[i])/ZnStektr[i]; FurIm=-FurIm[i]; } //выполняем обратное БПФ FFTInv(FurRe,FurIm); //копирование буферов for(int i=0;i<(BufL);i++) { BufInOut[i]=((signed short)(FurRe[i]+0.5f)); } } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //Фурье фильтр signed short FureFilter(signed short t1) { //записываем во входной буфер BufIn=t1; //выходное значение signed short out=BufOut; //инкремент указателя буфера ShBuf=(ShBuf+1)&((BufL*2)-1); //если в буфере часть кадра обработки if((ShBuf&((BufL/Perk)-1))==0) { //переписываем буфер обработки в выходной буфер int ShTmpOut=ShBuf; int ShTmpIn=(ShBuf-BufL)&((BufL*2)-1); for(int i=0;i<(BufL);i++) { if(i<(BufL-(BufL/Perk))) { //переписываем первую часть буфера обработки в выходной буфер BufOut=BufOut+BufInOut[i]; } else { //переписываем вторую часть буфера обработки в выходной буфер BufOut=BufInOut[i]; } //инкремент указателя выходного буфера ShTmpOut=(ShTmpOut+1)&((BufL*2)-1); //переписываем входной буфер в буфер обработки BufInOut[i]=BufIn; //инкремент указателя входного буфера ShTmpIn=(ShTmpIn+1)&((BufL*2)-1); } }//конец if((ShBuf&((BufL/Perk)-1))==0) //вызов функции обработки //в на реальном процессоре распараллелить! if((ShBuf&((BufL/Perk)-1))==0)ObrBuf(); return out; }

FSempl chastotasi bilan FureFilter() funksiyasini chaqirish va unga kirish signalini argument sifatida o'tkazish orqali natija chiqish signali bo'ladi. Ushbu misolda kirish signali quyidagicha qayta ishlanadi: signal FsrLow, FsrHi kesish chastotalari bo'lgan tarmoqli o'tkazuvchan filtr orqali o'tkaziladi, ko'rsatilgan chastotalar ustidagi va pastdagi barcha spektral komponentlar bostiriladi, signal spektri siljiydi (audio signallar uchun bu Buratino-Karabas effekti sifatida qabul qilingan), signalning amplituda spektri past o'tkazuvchan filtr tomonidan tekislanadi (ovoz uchun bu gullab-yashnagan xonaning ta'siri). Signal bilan bu harakatlar signalni chastota sohasida qayta ishlashning texnik usullarini ko'rsatish uchun misol sifatida amalga oshiriladi, masalan: koeffitsientlarning murakkab konjugatsiyasini saqlash, trigonometrik funktsiyalardan foydalanmasdan murakkab spektrni amplitudadan tiklash va boshqalar.

Xulosa

Shuni ta'kidlash kerakki, bu Furye filtri funktsiyasi amalda ishlamaydi. Ushbu funktsiyani chaqirganda, hatto past chastotasi 8000 Gts bo'lsa ham, keyingi qo'ng'iroq vaqtida uni bajarishga vaqt topa olmaydi, ishlash etarli bo'lmaydi. Ushbu Furye filtri kodi algoritmning tavsifi sifatida, muayyan apparat resurslariga havolalarsiz taqdim etilgan va faqat ta'lim maqsadlariga ega (Kirishga qarang).

Amaliy amalga oshirishda BufInOut buferni to'ldirish-bo'shatish funktsiyasini (afzalroq DMA va boshqalar) va buferni qayta ishlash ObrBuf() funktsiyasini parallellashtirish kerak, ammo bu butunlay boshqacha hikoya.

Furye teoremasi shuni ko'rsatadiki, har qanday signal davriy signal chastotasiga karrali chastotalar bilan davriy funktsiyalarning ortonormal to'plamida (masalan, sinuslar va kosinuslar) qatorga kengaytirilishi mumkin. Shunday qilib, signalning spektral tahlili moduli barcha harmoniklarning umumiy superpozitsiyasiga kiritilgan mos keladigan harmonikaning tebranish kuchining ulushiga to'g'ri keladigan og'irlik koeffitsientlarini (umumiy holatda, murakkab) izlashga asoslanadi. .

Tez Furye o'zgarishi

Tez Furye transformatsiyasi - bu diskret Furye konvertatsiyasida (DFT) keraksiz hisob-kitoblarni oldini olish uchun trigonometrik funktsiyalarning davriylik xususiyatlaridan muvaffaqiyatli foydalanadigan va shu bilan Furye kengayishidagi koeffitsientlarni tezroq topishga yordam beradigan hisoblash algoritmidir. Diskret konversiyadan asosiy farq faqat raqamli qiymatlarni hisoblash usulida (algoritm) bo'lib, signalni qayta ishlashning o'zida emas. FFTda ham, DFTda ham hisob-kitoblarning natijasi bir xil bo'ladi. FFT algoritmiga qo'yiladigan yagona talab N = 2L ning ko'paytmasi bo'lgan namuna o'lchamidir, bu erda L har qanday musbat sondir. Eng keng tarqalgan tayanch-2 FFT algoritmlari quyidagilardir: vaqt bo'yicha kamaytirilgan va chastotasi kamaygan.

Bu ishda vaqtni yupqalash bilan radix-2 FFT algoritmi (Kuli-Tukey algoritmi) amalga oshirilgan. Ba'zi DFT qonunlarini o'rganish orqali uni olish oson. Keling, aylanish koeffitsientini kiritamiz:

Bunday holda, DFTda bir qator signal qiymatlari (f0, f1,…, fN-1) uchun Furye koeffitsientlari quyidagi munosabat bilan ifodalanadi:

4 ta qiymatli signal seriyasini ko'rib chiqing: (f0, f1, f2, f3). Furye konvertatsiyasini matritsa ko‘rinishida keltiramiz (normalizatsiya koeffitsienti 1/N ifodaning o‘ng tomonidagi Cij ustun vektoriga kiritilgan):

Eyler formulasidan foydalangan holda aylanish koeffitsientlarini yozib, ularning k = 0, 1, 2, .. 9 uchun qiymatlarini aniqlagandan so'ng, takroriy koeffitsientlar naqshini ko'rish mumkin bo'lgan diagrammani (2-rasm) qurishingiz mumkin.

2-rasm. N=4 uchun w quvvat seriyasi

Raqamli qiymatlarni (4) ga almashtirsak, biz quyidagilarni olamiz:

Ya'ni, w ning w4 dan boshlab qiymatlari w0 dan w3 gacha bo'lgan mos qiymatga teng. Keyinchalik, biz (4) matritsa tenglamasini nostandart shaklda qayta yozamiz (keyingi operatsiyalar ravshanligi uchun shunga o'xshash belgilar kiritilgan):

Matritsaning ustunlarini ikki guruhga bo'lgan holda almashtiramiz: juft f0, f2 va toq f1, f3 indekslari:

wk+1 = wkw1 ekanligini hisobga olsak, (6) ifoda quyidagicha qayta yoziladi:

Nisbatlardan foydalanish:

Biz kerakli kengayish koeffitsientlarini hujayra qiymatlari bilan ustun vektori shaklida olamiz:

Algoritmning grafik tasviri (3-rasm) qanotlari ochiq kapalak kabi ko'rinadi, shuning uchun bu hisoblash usuli "kapalak" deb ataladi.

3-rasm. 4 ta haddan iborat qator uchun kapalak grafigi

Shunday qilib, algoritmning birinchi bosqichida bir qator signal qiymatlari a'zolari juft va toq indekslarga bo'linadi. Keyin "kapalak" grafigi bajariladi, u ikki bosqichdan iborat bo'lib, ularning soni namunaviy o'lchamdagi ikkitasining kuchiga teng (N = 4 = 22). Har bir bosqichda ikkita "kapalak" bajariladi va ularning umumiy soni o'zgarishsiz qoladi. Har bir kapalak operatsiyasi bitta ko'paytirish operatsiyasiga to'g'ri keladi. Taqqoslash uchun: namuna olish (f0,f1,f2,f3) bilan DFTda ko'paytirish operatsiyasi 4×4 = 16 marta, FFTda esa atigi 4 marta bajarilishi kerak bo'ladi.

Nazariya

Birinchidan, bir oz nazariya. Hammaga ma'lumki, bunday analizatorlar tez Furye transformatsiyasidan foydalanadilar va ko'pincha DFTni bunday dizaynlarda ishlatish mumkin emas, faqat FFT va hatto assemblerda ham aytiladi. Buning o'rniga men diskret Furye transformatsiyasidan (DFT) va Uolsh transformatsiyasidan foydalandim. Va bu maqolada men siz faqat FFT emas, balki C-da yozilgan DFT dan foydalanishingiz mumkinligini isbotlayman. Lekin birinchi navbatda, DFT dan oddiy DFT funktsiyasini qanday olish kerak va Uolshga ko'ra. DFT klassik tarzda quyidagicha ko'rinadi:

m ning resurslari kam bo'lgani uchun ular cos va sin ni N o'lchamli massivlar bilan almashtiradilar. Bundan tashqari, m 8 bitli va massivlarni 8 bitli qiymatlar ko'rinishida saqlash maqsadga muvofiqdir. Cos va sin -1 dan 1 gacha o'zgarganligi sababli, bu diapazonni 127 martaga oshirish yaxshidir, chunki 8 bitli imzolangan o'zgaruvchi qiymatlarni -127 dan 127 gacha saqlashi mumkin. Shunday qilib, formulaning o'zgarishini hisobga olgan holda , bo'ladi:

bu erda m 0 dan N-1 ga k ga teng qadam bilan o'zgaradi, m N dan katta bo'lganda, m N-1 ga kamayadi. Hammasi bo'lib 12 ta kanal ishlatiladi, shuning uchun DFT quvvati shunchalik kam sonli kanallar bilan cheklangan.

Masalan, bizda 512 ta ADC namunasi bor, biz 19200 Gts namuna olish chastotasida 150 Gts uchun xayoliy va haqiqiy qismlarni hisoblashimiz kerak:

Shunday qilib, haqiqiy va xayoliy qismlar an'anaviy usulga qaraganda ancha tezroq olinadi, lekin 127 marta kattaroqdir. Ularning haqiqiy qiymatlarini olish uchun siz 127 ga bo'lishingiz kerak, lekin MKda bo'linish yo'q, she'rni bo'lmaslik, balki uni siljitish ancha oqilona bo'lar edi! Bir siljish 2 ga bo'lish bilan tengdir. Ya'ni, agar siz raqamni 7 marta almashtirsangiz, uni 128 ga bo'lasiz! Aniqlikdagi yo'qotishlar allaqachon muqarrar bo'lganligi sababli, 128 ga bo'linish rasmni o'zgartirmaydi.

19200 Gts namuna olish tezligida 150 Gts uchun diskret Furye o'zgarishi quyidagicha ko'rinadi:

Uolsh uchun sinus va kosinus to‘lqinlarini mos davrlarning o‘rtalari bilan almashtiramiz. Ya'ni, 0 dan 180 darajagacha bo'lgan gunoh uchun 1 bo'ladi va >180 dan 360 gacha -1 bo'ladi. Shunga ko'ra, 0 dan 90 gacha bo'lgan sinus uchun u 1 ga, 90 dan 270 gacha - 1 ga va 270 dan 360 gacha - 1 ga teng. Shunday qilib, xayoliy va haqiqiy qismlarning barcha hisoblari yig'indilari va farqlarining oddiy yig'indisi bo'ladi. ADC qiymati. Ya'ni, masalan, sinus 1 ga teng bo'lsa, ADC qiymati qo'shiladi va -1 ayirilsa. Ushbu yechimning nochorligi yana xato bo'lib, muqarrar ravishda oshadi va 20% ga etadi. Ammo mening dizaynim atigi 8 ta qiymatga ega bo'lganligi sababli, yana kam odam sezilarli farqni sezadi.

19200 va 512 namunali namuna olish chastotasida 150 Gts uchun xayoliy va haqiqiy qismlarni hisoblashni amalga oshirishga misol:

Shunday qilib, biz ko'paytirish protseduralarisiz xayoliy va haqiqiy qismlarni juda tez olamiz.

Shunday qilib, xayoliy va haqiqiy qismlarni olgandan so'ng, spektrning amplitudasini topish kerak. Buning uchun siz xayoliy va haqiqiy qismlar kvadratlari yig'indisining ildizini topishingiz kerak. Ammo agar siz matematik kutubxonadan funksiyadan foydalansangiz, ekstraktsiya uzoq vaqt oladi va funktsiya ROMning juda katta qismini ham iste'mol qiladi. Internetda biroz qazib bo'lgach, men oqlangan funktsiyani topdim, keyin uni kichik qiymatlarda ishlashi tufayli biroz soddalashtirdim. Bu funksiya:

Ushbu funktsiyani va matematik kutubxonadagi funktsiyani taqqoslab, men natija bir xil bo'lishi uchun uning aniqligi etarli degan xulosaga keldim. Funktsiyaning o'zi MK ROMning 12% ga nisbatan 2% ni tashkil qiladi. Bundan tashqari, u ancha tezroq hisoblab chiqadi.

Ammo qanday qilib MK 12 ta kanalni va hatto DFT-ni hisoblashga muvaffaq bo'ldi. Bo'linish o'rniga siljish va tez kvadrat funktsiyasi bilan barcha fokuslardan tashqari, yana bir hiyla bor. Bu haqda men hozir aytib beraman. Gap shundaki, tanlash chastotasi qanchalik baland bo'lsa, filtrning o'tish diapazoni shunchalik torayadi, chunki cos va sinning o'tish jarayoni tezlashadi va davrlar soni ortadi. Va bu kabi cos va sin o'tishlari qanchalik ko'p bo'lsa, tarmoqli kengligi shunchalik torayadi. Masalan, 150 Gts chastota uchun cos va sin 4 marta, 1,2 kHz uchun cos va sin 32 marta takrorlanadi. Bundan ko'rinib turibdiki, o'tish diapazoni barcha diapazonlarda bir xil bo'lishi va barcha chastota diapazonlarini qamrab olishi uchun filtrlash chastotasining oshishi bilan namunalar sonini kamaytirish kerak. Misol uchun, 150 Gts uchun barcha 512 namunalar, 600 Gts uchun 256 namunalar va 2,4 kHz uchun 32 namunalar va hokazo. Ko'payib borayotgan chastota bilan namunalar sonini kamaytirish orqali DFT tezligi keskin oshib borishini almashtirish qiyin emas, chunki ko'paytirish va yig'indilarni kamroq qilish kerak.

Amaliy amalga oshirish

Shunday qilib, nazariy qism tayyorlandi, biz dizaynni tasvirlashni boshlashimiz mumkin. Butun dizayn bitta mikrokontrolör, 4 tranzistor, bir nechta kondansatör va ko'plab rezistorlardan iborat. Ko'p rezistorlarni o'rnatish yaxshiroqdir, garchi siz o'zingizni faqat gorizontal rezistorlar bilan cheklashingiz mumkin, ya'ni. har bir port pin uchun bitta. Sxema klassik bo'lib, men dinamik skanerlashning 1 o'rniga 1 o'rniga 3 ta portdan foydalanganimdan tashqari, hamma joyda bo'lgani kabi. Bu supurish chastotasini kamaytirish va tranzistorlar sonini 4 tagacha kamaytirish imkonini berdi. Natijada, aslida 24x4 shkalasi bo'ldi.

Spektr analizatori 16 MGts kristalidan 19,2 kHz namuna olish tezligida ishlaydi.

Spektr analizatori quyidagi chastotalarning spektral amplitudalarini hisoblab chiqadi:

9,6 kHz, 4,8 kHz, 2,4 kHz, 1,6 kHz, 1,2 kHz, 800 Hz, 600 Hz, 500 Hz, 400 Hz, 300 Hz, 150 Hz, 75 Hz. Dastur 33 Gts uchun sinovdan o'tkazildi va DFT cos va sin o'lchamlari 512 ga teng bo'lganiga qaramay, uni 75 Gts gacha cheklashga qaror qildi.

Bu erda chastotalar mavjud bo'lib, ular 2 ning n-chi darajaga ko'paytmasi emas, lekin shunga qaramay hisoblab chiqilgan. Misol uchun, 400 Gts ni 19200 ga bo'linganda biz 48 ni olamiz, bu n quvvatiga 2 ning ko'paytmasi emas. Vaziyatdan chiqish yo'lini 2 raqamiga yaqin raqamni n darajasiga olib tanladim. Eng yaqini 240 ta, 256 ga yaqin. Ya'ni 512 tadan atigi 240 ta namuna oldik. Bunga qo'shimcha ravishda, siz shunchaki yaqinroq narsalarni ololmaysiz. Misol uchun, biz 512 ga yaqin bo'lgan 480 ni olishimiz mumkin edi, lekin shunga qaramay biz 256 ga yaqinlashdik. Buning tushuntirishi shundaki, turli chastotalarda namunalar soni tarmoqli kengligiga ta'sir qiladi. Namunalar soni qancha ko'p bo'lsa, tarmoqli kengligi shunchalik torroq bo'ladi. Buning sababi shundaki, yuqori chastotada kosinus past davrga qaraganda tezroq davrdan o'tadi va amplituda shunchalik aniq hisoblanganki, qo'shni chastotalar shunchaki tashqariga tashlanadi va sezilmaydigan chastotalar o'rtasida ko'r chastota zonalari hosil bo'ladi. analizator tomonidan. Analizator barcha chastotalarni idrok etishi va butun spektrni qamrab olishi uchun kamroq namunalar olish orqali yuqori chastotalarda diapazonni kengaytirish, past chastotalarda esa mos ravishda ko'proq namunalar olish orqali imkon qadar toraytirish kerak. Shunday qilib, o'qishlar sonini amaliy tanlash orqali men quyidagilarni tanladim:

9,6 kHz 16 hisoblash, 4,8 kHz 32 hisoblash, 2,4 kHz 32 hisoblash, 1,6 kHz 60 sanash, 1,2 kHz 64 hisoblash, 800 Gts 240 hisoblash, 600 Gts 256 hisoblash, 502 Hz, 250 Hz3s. 0 Hz 512 hisoblash, 150 Gts 512 hisoblash, 75 Gts 512 hisoblash.

Namuna sonining bunday tanlovi tarmoqni butun chastota diapazonida bir xil bo'lishiga imkon berdi.

Yana bir tuzoq 9,6 kHz chastotada sodir bo'ldi. Hayoliy qism yo'qligi sababli (buni yuqoridagi formulaga 256 spektr raqamini 512 ta namuna bilan almashtirish orqali osongina tekshirish mumkin va sinus har doim 0 ga teng bo'ladi), haqiqiy qism kosinus qiymati tufayli juda kuchli o'zgarishi mumkin. asosiy signalga antifazada boshqa har safar hisoblab chiqiladi. Ya'ni, bir marta hisoblab chiqiladi. Bunga yo'l qo'ymaslik uchun 90 gradusga siljigan haqiqiy qismning kamida 2 qiymatini hisoblash va ikkita qiymatdan maksimalni tanlash kerak.

Dastur algoritmi intervalda 512 ta namunani to'playdi, mikrokontrollerni uyqu rejimiga o'tkazadi va keyingi namuna tayyor bo'lganda uyg'onadi. Bundan tashqari, LEDlar 150 Gts chastotada skanerdan o'tkaziladi - bu 19200 namuna olish chastotasidan 128 marta ko'pdir. Ya'ni, ADC barcha namunalarni olishdan oldin, bitta to'liq tozalashni yakunlash uchun vaqt topadi. Barcha namunalar tayyor bo'lishi bilanoq, asosiy dastur siklida spektrning barcha amplitudalari hisoblanadi. Bu vaqtda supurish davom etmoqda, lekin MK uxlab qolmaydi, lekin amplitudalarni hisoblaydi. Amplitudalar hisoblangandan so'ng, mikrokontroller uyqu rejimiga o'tadi va dastur yana takrorlanadi. Amplitudalar 20 dB diapazoni asosida hisoblanadi, ya'ni ular logarifmikdir.

Barcha o'qishlarni qabul qilish vaqti va barcha amplitudalarni hisoblash vaqtiga asoslanib, yangilanish chastotasi 10-15 Gts oralig'ida.


Bepul dasturlar va foydali maslahatlar dunyosi
2024 whatsappss.ru