Микроконтроллер дээрх Фурье хувиргалт. Дохионы спектрийн шинжилгээ. Хурдан Фурье хувиргалт
Энгийн бүхэл тоон цөм, хөвөгч цэгийн өгөгдлийг боловсруулдаг C6000 гэр бүлийн дэд бүлэг гэх мэт мангасуудыг багтаасан Texas Instruments TMS320 цувралын DSP зэрэг дижитал дохио боловсруулах (DSP) олон тусгай процессорууд байдаг. Analog Devices-ийн бүхэл бүтэн цуврал ADSP байдаг (үүнд бүх нийтийн BlackFin багтдаг), MicroChip - dsPIC-ээс илүү хялбар шийдлүүд байдаг.
Гэсэн хэдий ч тусгай DSP сайн, гэхдээ энэ нь үргэлж шаардлагатай байдаг уу? Тийм ээ, асар их мэдээллийн урсгалтай бол үүнийг орлуулшгүй, гэхдээ боловсруулахад хялбар даалгавар байдаг. Тодруулбал, би давхар хөрвүүлэх даалгаврыг сонирхож байсан - аудио дохио нь эргэлдэж, улмаар спектрийг олж авдаг бөгөөд дараа нь спектр дээр ямар ч үйлдлүүдийг хийж, урвуу хувиргалтыг хийж, улмаар боловсруулсан дохиог олж авдаг. Энэ бүгдийг бодит цаг хугацаанд хийж, утасны чанараас доогуур биш чанарыг авах хэрэгтэй.
Энэ бол 2000 он биш, өндөр хүчин чадалтай ARM7/Cortex-M3 цөмд суурилсан нэг чиптэй шийдлүүд байгаа бөгөөд үнэ нь мэдэгдэхүйц буурсан; тэдгээр нь 32 бит, 32 битийн үржүүлэх үйлдлийн техник хангамжийн хэрэгжилттэй (түүнээс гадна) , бараг DSP үржүүлэх-хуримтлуулах үйлдэл ба 64 битийн үр дүн), Cortex-M3 нь мөн техник хангамжийн хуваагдлыг агуулдаг.
Дохио боловсруулах нь миний мэргэжил биш гэдгийг би даруй анхааруулахыг хүсч байна, бараг бүх мэдлэг (эсвэл зарчмын талаархи ойлголт) хүрээлэнгээс хадгалагдан үлдсэн боловч одоо би үүнийг туршиж, хэрэгжүүлэхийг хүссэн. Миний хэлэх гэсэн зүйл бол тайлбар, ойлголтыг орлуулах гэх мэт алдаатай байж магадгүй юм. Үнэндээ эрдэм шинжилгээний нарийвчлал намайг нэг их санаа зовсонгүй.
Бараг ямар ч DSP-ийн хувьд дээр дурдсан даалгавар нь энгийн бөгөөд ойлгомжтой байдаг. Гэхдээ ерөнхий зориулалтын RISC цөм үүн дээр хэрхэн ажиллах вэ? Хэрэв бид AVR эсвэл PIC гэж үзвэл тэдгээр нь хангалттай байх магадлал багатай. 8 бит ба бага цагийн давтамж нөлөө үзүүлдэг. Хэдийгээр Элм-Чан нь AVR дээр FFT хийж, дохионы спектрийг зурдаг загвартай байдаг. Гэсэн хэдий ч энэ тохиолдолд бодит цаг хугацаанд зөвхөн дүрслэлийг (боловсруулах хамгийн бага нарийвчлалтайгаар) хийдэг бөгөөд дохиог хүлээн авах боломжтой аудио чанараар бүрэн боловсруулдаггүй.
LPC2146-ийг туршилтын чип болгон сонгосон бөгөөд ARM7TDMI-S цөмд суурилсан бөгөөд хамгийн их давтамж нь 60 МГц (практикт 72 эсвэл бүр 84 МГц давтамжтай ажилладаггүй). Яагаад? Нэгдүгээрт, надад дибаг хийх самбар байгаа, хоёрдугаарт, самбар дээр ADC ба DAC байдаг, өөрөөр хэлбэл. хамгийн бага гадаад обудтай байх шаардлагатай.
Бага зэрэг онол
Юуны өмнө ARM микроконтроллерууд дээрх FFT (Fast Fourier Transform)-ийн гүйцэтгэлийг үнэлэх нь сонирхолтой байв. Энэхүү үнэлгээнд үндэслэн бид аудио мэдээллийн урсгалыг боловсруулахад хангалттай хурдтай эсэх, ийм микроконтроллер дээр ямар түүвэрлэлтийн давтамж, хэдэн сувгийг боловсруулах боломжтой дохиог дүгнэж болно.
Фурье хувиргалт дээр үндэслэн та ухаалаг шүүлтүүр (маш сэтгэл татам шинж чанартай) бүтээж болно. Би дохионы аяыг өөрчлөх (спектрийг өсгөх, багасгах) болон спектрийг "тусгах" асуудлуудыг голчлон сонирхож байсан. Сүүлийнх нь LSB доод зурвасын радио нэвтрүүлгийг сонсохын тулд SDR радиод шаардлагатай.
Би танд онол ачихгүй бөгөөд Фурье хувиргалт гэж юу болохыг тайлбарлахгүй; миний ашигласан зүйлээс энэ сэдвээр маш олон материал байгаа: вики, маш сайн, мэдээлэл сайтай номын нэг бүлэг.
Програм хангамжийн хэрэгжилт
FFT-ийн програм хангамжийн олон хувилбарууд байдаг, гэхдээ би өөрөө бичсэн. Миний зорьж байсан гол зорилго бол тодорхой архитектурын кодыг оновчтой болгох явдал байв. Нэгдүгээрт, би тэр даруй 32 бит дээр анхаарлаа төвлөрүүлсэн, хоёрдугаарт, зөвхөн бүхэл тоон тооцоолол хийх шаардлагатай байсан тул хуваах үйлдлээс зайлсхийх нь зүйтэй болов. Эдгээр шаардлагыг хангахад бэлэн зүйлийг олох нь аль хэдийн асуудалтай байдаг.
Урьдчилан тооцоолж болох бүх тогтмолуудыг тооцоолж, хүснэгтэд байрлуулсан (ихэвчлэн тригонометрийн функцүүдийн утгууд). Энэ бол алгоритмын гол оновчлол бөгөөд өөрөөр хэлбэл энэ нь тайлбарласан алгоритмыг бараг бүрэн давтах болно.
Хамгийн чухал нь бүхэл тоон тооцоонд тавигдах шаардлага юм. Хэрэгжүүлэх явцад 32 битийн давталтын хувьсагчийн аль нэгэнд халихад хүргэсэн алдаа гарсан. Түүгээр ч барахгүй туршилтын бүх өгөгдөл дээр харагдахгүй байсан тул олдох хүртэл нэлээд толгой өвдсөн.
Би бүх эх бичвэрийг нэг архивт цуглуулсан. Хэрэгжилт нь эцсийнх биш, давхардсан тооцоолол (спектр ба фазын тэгш хэмийг тооцдоггүй) байгаа бөгөөд буферийн ашиглалтыг оновчтой болгох шаардлагатай, учир нь тооцоололд хэт их хэмжээний RAM ашигладаг (1024 цэгийг хөрвүүлэхэд бараг 12к) ).
Эхний туршилтууд
Бөмбөрийн оролт: Би хөрвүүлэх хурдыг 1024 цэгийн дээжээр туршиж байна, процессорын гол давтамж нь 60 МГц. Туршилтыг эмулятор дээр хийсэн тул 100% үнэн зөв гэж хэлэхгүй, гэхдээ энэ үр дүнг үзүүлэлт болгон ашиглаж болно (миний өмнөх туршлагаас харахад эмулятор худал хэлж байсан ч тийм ч их биш байсан). Кодын эхний хувилбарын туршилт, RealView MDK хөрвүүлэгч, O3 оновчтой болгох сонголт, ARM код үүсгэх горим.
Тэгэхээр бид юу харж байна:
Хөрвүүлэлт бүрт 6 мс, хоёр талдаа хөрвүүлэхэд нийтдээ 12 мс гаруй. Дээж авах давтамж 44100 Гц (аудиогийн стандарт) ба 16 бит хүртэлх нарийвчлалтай дээжтэй бол цэвэр тооцоололд ~ 44 * 12 мс = 528 мс шаардлагатай болно. Энэ нь зарим кодын оновчлол хараахан дуусаагүй байгаа програм хангамжийн завсрын хувилбар дээр байна (тооцооллоор алгоритмыг бараг 2 дахин хурдасгах боломжтой)! Миний бодлоор энэ бол зүгээр л маш сайн үзүүлэлт юм.
Нийтдээ үндсэн ачаалал нь ойролцоогоор 50% байх төлөвтэй байгаа бөгөөд ADC, DAC болон бусад өгөгдөл дамжуулахтай ажиллах үед спектрийн хөрвүүлэлт, нэмэлт зардалд 50% үлдэх болно. Хэрэв та дээж авах давтамжийг "утас" түвшинд (ойролцоогоор 4800-9600 Гц) бууруулбал үндсэн ачаалал бүр бага (ойролцоогоор 15-30%) байх болно.
Тэгэхээр математикийн хэсэг нь их бага тодорхой байна. Та тодорхой хэрэгжилтийг үргэлжлүүлж болно.
Төмөр
Туршилтын платформын хувьд бид чанга яригчтай Keil MCB2140 хөгжүүлэх самбар ашигласан. Төхөөрөмжийн шугаман гаралттай холбохын тулд Mini-Jack утсыг гагнаж, энгийн оролтын хэлхээг угсардаг. Өмнө дурьдсанчлан, самбар нь микроконтроллерийн аналог гаралттай холбогдсон чанга яригчтай бөгөөд удирдлага (товчлуур ба потенциометр) байдаг.
Энд оролтын хэлхээний тойм зураг байна.
Програм хангамжийн дибаг хийх үе шаттайгаар явагдсан:
- Шаардлагатай бүх дагалдах хэрэгслийн дибаг хийх: ADC, DAC, таймер, LED заалт.
- Дохионы дижиталчлалтай тест: Би өгөгдлийг шаардлагатай хурдаар дижитал болгож, буферт хийж, дараа нь буферээс өгөгдлийг гаргаж аваад дохиог тоглуулдаг. Тэдгээр. ямар ч өөрчлөлтгүйгээр цаг хугацааны энгийн дохио шилжилт. Энэ үе шатанд цаашдын ажилд шаардлагатай 2 буфертэй ажиллах механизмыг туршиж байна.
- Урд болон урвуу Фурье хувиргалтыг өмнөх хувилбарт нэмсэн. Энэхүү тест нь эцэст нь FFT кодын зөв ажиллаж, код нь боломжит гүйцэтгэлд нийцэж байгаа эсэхийг шалгадаг.
- Үүний дараа програмын үндсэн араг яс хийгдсэн тул та практик хэрэглээ рүү шилжиж болно.
Код дээр FFT нэмсний дараа асуудал үүссэн: дохионд гадны чимээ, шүгэл гарч ирэв. Ерөнхийдөө энэ зан надад их хачин санагдсан, учир нь... Хөрвүүлэлт хийлгүйгээр тоон замаар дамждаг дохио нь нэлээд цэвэр хэвээр байв. Үүний эхний шалтгаан нь: аналог хэлхээний дараа ADC дээрх дохионы далайц бүрэн биш байсан (0-3.3V), гэхдээ тоглуулагчийн хамгийн их эзлэхүүн дээр зөвхөн 0.5-2V дотор байсан бол хоёр дахь нь: бүхэл тооноос болж нэлээд хүчтэй дуу чимээ. тооцоолол (+-1 нэгж, энэ нь сонсогдоход саад учруулахад хангалттай байсан).
Эхний асуудалтай тэмцэхийн тулд аналог хэсгийг тохируулж эхлэхээр шийдсэн. Дуу чимээний асуудлыг шийдэхийн тулд бага нэвтрүүлэх шүүлтүүр ашиглаж үзээрэй.
Хэрэглээ 1: дохионы аяыг өөрчлөх
Самбар нь потенциометртэй (хувьсах резистор) бөгөөд үүнийг удирдахад ашиглаж болно. Энэ тохиолдолд энэ нь таны дуртай зохиолуудыг "өөрчлөх" хангалттай дохионы спектрийг дээш доош шилжүүлэхээр тохируулдаг.
Давтамжийн домэйнд юу болдог вэ:
Энэ тохиолдолд хөрвүүлэлтийн үр дүн 2 буферт агуулагдана. Нэг буфер нь бодит хэсэг, нөгөө нь төсөөллийн хэсэг юм. Тэдгээрээс олж авсан тоонуудын физик утга нь: бодит хэсэг нь гармоникуудын утгыг агуулдаг бол төсөөлөл нь эдгээр гармоникуудын фазын шилжилтийг агуулдаг. Үүнээс гадна, таны харж байгаагаар анхны дохиог N-утгуудаар дүрсэлсэн бөгөөд хөрвүүлсний дараа 2N-утгыг олж авдаг. Мэдээллийн хэмжээ өөрчлөгдөхгүй бөгөөд мэдээллийн хэмжээ 2 дахин нэмэгдэх нь буфер өгөгдөл нь утгын давхардал хэлбэрээр илүүдэлтэй байгаатай холбоотой юм.
Хоёр мөрт тэмдэгтийн LCD үзүүлэлтийг дэлгэцийн төхөөрөмж болгон ашигладаг. Энэ төслийг хэрэгжүүлэх гол зүйл бол техник хангамж биш, харин програм хангамж, илүү нарийвчлалтай 8 битийн микроконтроллер дээр дискрет Фурье хувиргалтыг (DFT) хэрэгжүүлэх явдал юм. Зохиогч нь энэ чиглэлээр мэргэшсэн мэргэжилтэн биш тул үндсэн ойлголтоос эхлээд энгийн Furier хувиргалтаас эхэлсэн гэдгийг нэн даруй тэмдэглэх нь зүйтэй. Хурдан Фурье хувиргах алгоритм нь хурдан төдийгүй нэлээд төвөгтэй юм.
Дискрет Фурье хувиргалт (Англи уран зохиолд DFT, Discrete Fourier Transform) нь дижитал дохио боловсруулах алгоритмд өргөн хэрэглэгддэг Фурье хувиргуудын нэг юм (түүний өөрчлөлтийг MP3 форматаар аудио шахах, JPEG форматаар дүрсийг шахах гэх мэт) ашигладаг. салангид (жишээлбэл, дижитал аналог) дохионы давтамжийг шинжлэхтэй холбоотой бусад хэсгүүд. Дискрет Фурье хувиргалт нь дискрет функцийг оролт болгон шаарддаг. Ийм функцийг ихэвчлэн түүвэрлэлт (үргэлжилсэн функцүүдээс түүврийн утгууд) үүсгэдэг.
Аудио дохионы спектр анализаторын хэлхээний диаграм нь маш энгийн бөгөөд тоон болон аналог хэсэгт хуваагддаг.
Дижитал хэсэг нь микроконтроллер ба түүнд холбогдсон LCD индикатороос бүрдэнэ. Микроконтроллер нь 16 МГц-ийн кварцын резонатороос ажилладаг бөгөөд +5 В тэжээлийн хүчдэлийг микроконтроллерийн ADC-ийн лавлах хүчдэл болгон ашигладаг.
LCD индикаторын өгөгдлийн автобус нь микроконтроллерийн C порттой (PC0-PC3 оролт/гаралтын шугамууд), хяналтын автобус нь микроконтроллерийн D (PD5, PD6) порттой холбогдсон. Заагч нь 4 битийн горимд ажилладаг. 4.7 кОм-ийн нэрлэсэн утгатай хувьсах резисторыг тодосгогчийг тохируулахад ашигладаг. Заагчтай ажиллахын тулд анализаторын 8 хэвтээ баганыг харуулах тусгай тэмдэгтүүдийг бүтээсэн бөгөөд эдгээр тусгай тэмдэгтүүд нь LCD үзүүлэлтийн бүх 64 байт RAM-ыг эзэлдэг.
Микроконтроллер нь гадны 16 МГц кварц резонатороос ажилладаг.
Төхөөрөмжийн аналог хэсэг нь хамгийн чухал хэсэг бөгөөд цахилгаан микрофоны дохионы урьдчилсан өсгөгч бөгөөд гаралт нь микроконтроллерт суурилуулсан ADC-ийн ADC0 сувагт холбогдсон байдаг. Бид ADC оролт дээрх тэг түвшинг лавлагааны хүчдэлийн яг хагаст тохируулах хэрэгтэй, өөрөөр хэлбэл. 2.5 V. Энэ тохиолдолд бид дохионы эерэг ба сөрөг хагас долгионыг ашиглаж болох боловч түүний далайц нь тогтоосон хязгаараас хэтрэхгүй байх ёстой, i.e. Хэт ачааллаас сэргийлэхийн тулд олзыг нарийн тохируулах ёстой. Дээрх бүх нөхцөлийг бага чадлын үйлдлийн өсгөгчийн нийтлэг микро схемээр хангадаг.
DFT алгоритм нь Fast Fourier Transform-тай харьцуулахад арай удаан байдаг. Гэхдээ манай спектрийн анализатор нь өндөр хурд шаарддаггүй бөгөөд хэрэв энэ нь секундэд 30 орчим фрэймийн шинэчлэлт хийх боломжтой бол энэ нь аудио дохионы спектрийг дүрслэн харуулахад хангалттай байх болно. Ямар ч тохиолдолд манай хувилбарт секундэд 100 фрэймийн хурдыг авах боломжтой боловч энэ нь хоёр мөрт тэмдэгтийн LCD үзүүлэлтийн хувьд аль хэдийн хэт өндөр параметрийн утга учир хэрэглэхийг зөвлөдөггүй. Дээж авах давтамж нь 32 цэгийн салангид Фурье хувиргалтанд 20 кГц байх ба хувиргалтын үр дүн нь тэгш хэмтэй тул бид зөвхөн эхний хагасыг ашиглах хэрэгтэй, өөрөөр хэлбэл. эхний 16 үр дүн. Тиймээс бид 10 кГц хүртэлх давтамжийн спектрийг харуулах боломжтой бөгөөд анализаторын нарийвчлал нь 10 кГц/16 = 625 Гц байна.
Загварын зохиогч DFT тооцооллын хурдыг нэмэгдүүлэх оролдлого хийсэн. Хэрэв энэ хувиргалт N цэгтэй бол бид синус ба косинусын N2/2 утгыг олох ёстой. 32 цэгийн хувиргалтыг хийхийн тулд 512 синус ба косинусын утгыг олох хэрэгтэй. Гэхдээ тэдгээрийг олохын өмнө бид өнцгийг (градус) тооцоолох хэрэгтэй бөгөөд энэ нь CPU-д бага зэрэг хугацаа шаардагдах тул эдгээр тооцоололд утгын хүснэгтийг ашиглахаар шийдсэн. Микроконтроллерийн программ дээр тооцоолохдоо хөвөгч цэг болон давхар нарийвчлалтай тоог ашигладаггүй, учир нь 8 битийн микроконтроллер дээр үүнийг боловсруулахад удаан хугацаа шаардагдах болно. Үүний оронд хайлтын хүснэгт дэх утгууд нь 16 битийн бүхэл тоон өгөгдлийг 10000-аар үржүүлдэг. Дараа нь хөрвүүлсний дараа үр дүнг 10000-д хуваана. Энэ аргын тусламжтайгаар 120 32 цэгийн хөрвүүлэлт хийх боломжтой. хоёрдугаарт, энэ нь бидний төхөөрөмжүүдэд хангалттай юм.
ATmega32 микроконтроллер дээрх спектр анализаторын ажиллагааг харуулсан үзүүлбэр
Татаж авсан зүйлс
Эх код (микроконтроллерийн програм, синус, косинус, өнцгийн өгөгдлийн хүснэгтүүд) -
- AVR дээр гэрэл, хөгжмөөс цааш явахад хэцүү байгаа нь тодорхой байна, параметрүүд нь буруу байна. Гэхдээ ихэнх ажилд секундэд 120 32 цэгийн хөрвүүлэлт хангалттай байж болно. Мэдээжийн хэрэг, та 625 Гц-ийн өөр дээж авах боломжтой, эс тэгвээс сэргээх хурдаа алдаж болно. MK муу санагдах болно гэдгийг тэмдэглэх нь зүйтэй бөгөөд гүйцэтгэлийн хувьд та үүн дээр бэхлэхээс өөр зүйл байхгүй. Гэхдээ энд та техник хангамжийн өгөгдөл дамжуулах аргыг ашиглан үр дүнгийн гаралтыг зохион байгуулж болно. Дараа нь энэ нь туслах микроконтроллер байх бөгөөд гол нь зөвхөн түүнээс өгөгдлийг хүлээн авч, бусад процессуудтай нийцүүлэн боловсруулах болно. Ерөнхийдөө энэ нь процессорын давтамжаас хамаарна. Нэгэн цагт 20 МГц-ээс дээш мега-г overclock хийх боломжтой байсан ч эдгээр даалгаврын хувьд бид зөвхөн өндөр давтамжтай үед алдаа гарах болно. Санаа сайн байна, хэрвээ илүү олон тооны математикийн хэсгүүдийг бичсэн бол ... энэ нь MK дээр хэрэгжсэн явдал юм
- Би бас илүү сонирхолтой анализатор хийсэн: You Tube эсвэл өнгөт LCD дээрх хувилбар: You Tube нь алдарт Чен номын сан дээр суурилдаг :)
- "Бид өнцгийг (градус) тооцоолох хэрэгтэй" Эдгээр хүснэгтийн утгыг хэрхэн тооцдог талаар хэн нэгэн бидэнд илүү дэлгэрэнгүй хэлж чадах уу?
- Синус ба косинусын хүснэгтээр бүх зүйл тодорхой байна. Зэрэглэл_хайлтын хүснэгт дэх утгыг хэрхэн тооцдог нь тодорхойгүй байна уу?