Բովանդակություն:

Laser Harp սինթեզատոր Zybo տախտակի վրա. 10 քայլ (նկարներով)
Laser Harp սինթեզատոր Zybo տախտակի վրա. 10 քայլ (նկարներով)

Video: Laser Harp սինթեզատոր Zybo տախտակի վրա. 10 քայլ (նկարներով)

Video: Laser Harp սինթեզատոր Zybo տախտակի վրա. 10 քայլ (նկարներով)
Video: Laser-Harp&Zynthian 2024, Հուլիսի
Anonim
Laser Harp սինթեզատոր Zybo տախտակի վրա
Laser Harp սինթեզատոր Zybo տախտակի վրա

Այս ձեռնարկում մենք կստեղծենք լիարժեք ֆունկցիոնալ լազերային քնար ՝ IR սենսորների միջոցով սերիական ինտերֆեյսով, որը թույլ կտա օգտվողին փոխել գործիքի թյունինգը և հնչերանգը: Այս տավիղը կդառնա 21 -րդ դարի հնագույն գործիքի ռիմեյքը: Համակարգը ստեղծվել է Xilinx Zybo զարգացման տախտակի միջոցով ՝ Vivado Design Suites- ի հետ միասին: Այն, ինչ ձեզ հարկավոր է նախագիծն ավարտելու համար.

  • 12 IR տվիչներ և ճառագայթիչներ (քիչ թե շատ կարող են օգտագործվել ՝ կախված լարերի քանակից)
  • Zybo Zynq-7000 զարգացման տախտակ
  • Անվճար RTOS
  • Vivado Design Suite
  • Մետաղալար (սենսորները տախտակին միացնելու համար)
  • 3 կտոր PVC խողովակ ((2) 18 դյույմ և (1) 8 դյույմ)
  • 2 PVC արմունկ

Քայլ 1: Ձեռք բերեք Digilent- ի Zybo DMA աուդիո ցուցադրումը

Այս ծրագրի FPGA կողմը հիմնականում հիմնված է այստեղ գտնված ցուցադրական ծրագրի վրա: Այն օգտագործում է ուղիղ հիշողության հասանելիություն ՝ անմիջապես հիշողությունից տվյալներ ուղարկելու համար, որոնք պրոցեսորը կարող է գրել AXI Stream- ով ՝ I2S աուդիո բլոկին: Հետևյալ քայլերը կօգնեն ձեզ գործարկել DMA աուդիո ցուցադրական նախագիծը.

  1. Zybo տախտակի համար կարող է անհրաժեշտ լինել տախտակի ֆայլի նոր տարբերակ: Հետևեք այս հրահանգներին ՝ Vivado- ի համար տախտակի նոր ֆայլեր ձեռք բերելու համար:
  2. Հետևեք այս էջի հրահանգների 1 -ին և 2 -րդ քայլերին ՝ Vivado- ում ցուցադրական նախագիծը բացելու համար: Օգտագործեք Vivado մեթոդը, այլ ոչ թե SDK սարքավորումների փոխանցումը:
  3. Դուք կարող եք հաղորդագրություն ստանալ, որում ասվում է, որ ձեր ip բլոկներից մի քանիսը պետք է թարմացվեն: Եթե այո, ապա ընտրեք «Showույց տալ IP կարգավիճակը», այնուհետև IP կարգավիճակի ներդիրում ընտրեք բոլոր հնացած IP- ները և կտտացրեք «Upgrade Selected»: Երբ այն ավարտվի, և մի պատուհան հայտնվի ՝ հարցնելով, թե արդյոք ցանկանում եք արտադրել արտադրանք, շարունակեք և կտտացրեք «Ստեղծել»: Եթե քննադատական նախազգուշական հաղորդագրություն եք ստանում, անտեսեք այն:
  4. Դիզայնից անցեք աղբյուրների ներդիրին Vivado- ում ՝ սկզբնական ֆայլերը տեսնելու համար: Աջ սեղմեք բլոկի դիզայնի «design_1» և ընտրեք «Ստեղծել HDL փաթաթիչ»: Երբ հուշվում է, ընտրեք «պատճենված փաթաթան ՝ օգտվողի խմբագրումները թույլ տալու համար»: Wraրագրի փաթաթման ֆայլ կստեղծվի:
  5. Այժմ, երբ ավարտվում են այն կարևոր քայլերը, որոնք ինչ -որ կերպ դուրս էին մնացել մյուս ձեռնարկում, կարող եք վերադառնալ նախկինում կապված ձեռնարկին և շարունակել 4 -րդ քայլից մինչև վերջ և համոզվել, որ ցուցադրական նախագիծը ճիշտ է աշխատում: Եթե ձայնագրման համար ձայնագրություն մուտքագրելու միջոց չունեք, ապա ձայնագրեք ականջակալներով և նվագարկման կոճակը սեղմելիս լսեք 5-10 վայրկյան անորոշ ձայն: Քանի դեռ ականջակալների խցիկից ինչ -որ բան դուրս է գալիս նվագարկման կոճակը սեղմելիս, հավանաբար այն ճիշտ է աշխատում:

Քայլ 2: Որոշ փոփոխություններ կատարեք Vivado- ում

Որոշ փոփոխություններ կատարեք Vivado- ում
Որոշ փոփոխություններ կատարեք Vivado- ում

Այսպիսով, այժմ դուք աշխատում եք Digilent- ի DMA աուդիո ցուցադրական աշխատանքով, բայց դա ամենևին էլ վերջնական նպատակը չէ այստեղ: Այսպիսով, մենք պետք է վերադառնանք Vivado և որոշ փոփոխություններ կատարենք, որպեսզի մեր տվիչները միացվեն PMOD- ի վերնագրերին, և մենք կարողանանք դրանց արժեքը օգտագործել ծրագրաշարի կողմից:

  1. Բացեք բլոկ -դիագրամը Vivado- ում
  2. Ստեղծեք GPIO բլոկ ՝ բլոկ-դիագրամում դատարկ տարածության վրա աջ սեղմելով և ընտրացանկից ընտրելով «Ավելացնել IP»: Գտեք և ընտրեք «AXI GPIO»:
  3. Կրկնակի սեղմեք նոր IP բլոկի վրա և IP- ի վերակազմակերպման պատուհանում անցեք IP կազմաձևման ներդիրին: Ընտրեք բոլոր մուտքերը և լայնությունը սահմանեք տասներկու, քանի որ մենք կունենանք 12 «լար» մեր տավիղի վրա և, հետևաբար, պետք է 12 տվիչ: Եթե ցանկանում եք օգտագործել ավելի քիչ կամ ավելի տվիչներ, ապա համապատասխանաբար կարգավորեք այս թիվը: Նաև սահմանել միացման ընդհատում:
  4. Աջ սեղմեք նոր GPIO IP բլոկի վրա և ընտրեք «գործարկել կապի ավտոմատացում»: Ստուգեք AXI տուփը և կտտացրեք լավ: Սա պետք է ինքնաբերաբար միացնի AXI ինտերֆեյսը, սակայն բլոկի ելքերը թողնի չկապված:
  5. Լրացուցիչ ընդհատման համար տեղ ազատելու համար կրկնակի կտտացրեք xlconcat_0 IP բլոկի վրա և փոխեք պորտերի քանակը 4 -ից 5 -ը: Այնուհետև ip2intc_irpt կապը նոր GPIO բլոկից միացրեք xlconcat բլոկի նոր չօգտագործված պորտին:
  6. Աջ սեղմեք նոր GPIO IP բլոկի «GPIO» ելքի վրա և ընտրեք «կատարել արտաքին»: Գտեք, թե ուր է գնում տողը և կտտացրեք փոքրիկ կողային հնգանկյունի վրա, իսկ ձախ կողմում պետք է բացվի պատուհան, որտեղ կարող եք փոխել անունը: Փոխեք անունը «Սենսորներ»: Կարևոր է օգտագործել նույն անունը, եթե ցանկանում եք, որ մեր տրամադրած սահմանափակումների ֆայլը գործի, հակառակ դեպքում ստիպված կլինեք փոխել անունը սահմանափակումների ֆայլում:
  7. Վերադառնալով աղբյուրների ներդիրին, գտեք սահմանափակումների ֆայլը և այն փոխարինեք մեր տրամադրածով: Դուք կարող եք ընտրել կամ փոխարինել ֆայլը, կամ պարզապես պատճենել մեր սահմանափակումների ֆայլի բովանդակությունը և տեղադրել այն հինի բովանդակության վրա: Մեր սահմանափակումների ֆայլը կատարող կարևոր գործերից մեկը PMOD- ի վերնագրերի վրա միացման ձգողականների միացումն է: Սա անհրաժեշտ է մեր օգտագործած հատուկ սենսորների համար, սակայն ոչ բոլոր սենսորներն են նույնը: Եթե ձեր սենսորների համար պահանջվում է բարձրացման դիմադրիչներ, կարող եք փոխել «set_property PULLUP true» - ի յուրաքանչյուր օրինակ «set_property PULLDOWN true» - ով: Եթե դրանք պահանջում են տարբեր դիմադրության արժեք, քան գրատախտակին, ապա կարող եք հեռացնել այս տողերը և օգտագործել արտաքին ռեզիստորներ: Պին անունները գտնվում են սահմանափակումների ֆայլի մեկնաբանություններում և դրանք համապատասխանում են Zybo սխեմատիկայի առաջին դիագրամի պիտակներին: էջ, որը կարելի է գտնել այստեղ: Եթե ցանկանում եք օգտագործել տարբեր pmod կապեր, պարզապես համապատասխանեցրեք սահմանափակման ֆայլի անունները սխեմատիկ պիտակներին: Մենք օգտագործում ենք PMOD վերնագիր JE և JD և յուրաքանչյուրի վրա օգտագործում ենք վեց տվյալների կապ, բաց թողնելով 1 և 7 կապերը: Այս տեղեկատվությունը կարևոր է ձեր տվիչները միացնելիս: Ինչպես ցույց է տրված սխեմատիկայում, PMODS- ի 6 -րդ և 12 -րդ կապերը VCC են, իսկ 5 -րդ և 11 -րդ կապերը հիմնավորված են:
  8. Վերստեղծեք HDL փաթեթավորումը, ինչպես նախկինում, և պատճենեք և վերագրեք հինը: Երբ դա ավարտվի, ստեղծեք bitstream և արտահանեք ապարատային սարքավորումներ, ինչպես նախկինում և վերագործարկեք SDK- ն: Եթե ձեզ հարցնեն, թե արդյոք ցանկանում եք փոխարինել հին ապարատային ֆայլը, պատասխանը այո է: Հավանաբար, ամենալավն այն է, որ SDK- ն փակ լինի, երբ սարքավորում եք արտահանում, որպեսզի այն ճիշտ փոխարինվի:
  9. Գործարկեք SDK- ն:

Քայլ 3: Գործարկեք FreeRTOS- ը

Հաջորդ քայլն այն է, որ FreeRTOS- ը աշխատի Zybo- ի տախտակի վրա:

  1. Եթե դեռ չունեք պատճեն, ներբեռնեք FreeRTOS- ը այստեղ և հանեք ֆայլերը:
  2. Ներմուծեք FreeRTOS Zynq ցուցադրական տարբերակը, որը գտնվում է FreeRTOSv9.0.0 / FreeRTOS / Demo / CORTEX_A9_Zynq_ZC702 / RTOSDemo հասցեում: Ներմուծման գործընթացը գրեթե նույնն է, ինչ մյուս ցուցադրական նախագծի դեպքում, սակայն քանի որ FreeRTOS Zynq ցուցադրական ծրագիրը հիմնված է FreeRTOS թղթապանակի այլ ֆայլերի վրա, դուք չպետք է պատճենեք դրանք ձեր աշխատանքային տարածքում: Փոխարենը, դուք պետք է տեղադրեք ամբողջ FreeRTOS թղթապանակը ձեր ծրագրի թղթապանակի ներսում:
  3. Ստեղծեք տախտակի աջակցության նոր փաթեթ `անցնելով« ֆայլ » ->« նոր » ->« տախտակի աջակցության փաթեթ »: Համոզվեք, որ ինքնուրույն ընտրված է և կտտացրեք Ավարտել: Մի պահ հետո պատուհան կբացվի, նշեք lwip141- ի կողքին գտնվող վանդակը (սա կանգնեցնում է FreeRTOS- ի դեմոներից մեկին չհաջողվել կազմել) և սեղմել OK: Այն ավարտելուց հետո աջ սեղմեք RTOSdemo նախագծի վրա և գնացեք «հատկություններ», անցեք «ծրագրի հղումներ» ներդիրին և նշեք ձեր ստեղծած նոր bsp- ի կողքին գտնվող վանդակը: Հուսանք, որ այն կճանաչվի, բայց երբեմն Xilinx SDK- ն կարող է տարօրինակ լինել նման բաների վերաբերյալ: Եթե այս քայլից հետո դեռ սխալ եք ստանում, որ xparameters.h- ն բացակայում է կամ նման մի բան, փորձեք կրկնել այս քայլը և գուցե դուրս գաք և վերագործարկեք SDK- ն:

Քայլ 4: Ավելացրեք Laser Harp Code

Այժմ, երբ FreeRTOS- ը ներմուծված է, կարող եք լազերային քնար նախագծի ֆայլերը բերել FreeRTOS- ի ցուցադրման մեջ

  1. Ստեղծեք նոր թղթապանակ src պանակի տակ FreeRTOS ցուցադրական տարբերակում և պատճենեք և տեղադրեք բոլոր տրամադրված գ ֆայլերը, բացառությամբ main.c- ի, այս պանակում:
  2. RTOSDemo main.c- ը փոխարինեք տրամադրված main.c- ով:
  3. Եթե ամեն ինչ ճիշտ է արված, ապա այս պահին պետք է կարողանաք գործարկել լազերային տավիղի կոդը: Փորձարկման նպատակով կոճակի մուտքագրումը, որն օգտագործվել է DMA ցուցադրական նախագծում, այժմ օգտագործվում է առանց սենսորների ձայներ նվագարկելու համար (չորս հիմնական կոճակներից որևէ մեկը կաշխատի): Ամեն անգամ սեղմելիս այն կխաղա լարով և համակարգի բոլոր տողերով պտտվում է բազմաթիվ սեղմումների վրա: Միացրեք ականջակալներ կամ բարձրախոսներ Zybo տախտակի ականջակալների խցիկին և համոզվեք, որ կոճակը սեղմելիս կարող եք լսել լարերի ձայները:

Քայլ 5: Օրենսգրքի մասին

Ձեզանից շատերը, ովքեր կարդում են այս ձեռնարկը, ամենայն հավանականությամբ այստեղ են սովորելու, թե ինչպես ստեղծել ձայնային ազդանշան կամ օգտագործել DMA ՝ այլ բան անելու կամ այլ երաժշտական գործիք ստեղծելու համար: Այդ իսկ պատճառով հաջորդ մի քանի բաժինները նվիրված են նկարագրել, թե ինչպես է տրամադրված ծածկագիրը աշխատում նախկինում նկարագրված սարքավորման հետ ՝ DMA- ի միջոցով աշխատող ձայնային ելք ստանալու համար: Եթե հասկանում եք, թե ինչու են կոդի կտորները այնտեղ, ապա պետք է կարողանաք դրանք հարմարեցնել այն ամենի համար, ինչ ցանկանում եք ստեղծել:

Ընդհատում է

Նախ նշեմ, թե ինչպես են ընդհատումներ ստեղծվում այս նախագծում: Ինչպես մենք դա արեցինք, նախ ստեղծեցինք ընդհատումների վեկտորային աղյուսակի կառուցվածք, որը հետևում է ID- ին, ընդհատումների կառավարիչին և սարքի հղմանը յուրաքանչյուր ընդհատման համար: Ընդհատված ID- ները գալիս են xparameters.h- ից: Ընդհատումների կարգավորիչը գործառույթ է, որը մենք գրել ենք DMA- ի և GPIO- ի համար, իսկ I2C ընդհատումը գալիս է Xlic I2C վարորդից: Սարքի հղումը մատնանշում է յուրաքանչյուր սարքի այն դեպքերը, որոնք մենք նախաստորագրում ենք այլուր: _Init_audio ֆունկցիայի ավարտին մի օղակ անցնում է ընդհատվող վեկտորային աղյուսակի յուրաքանչյուր տարրով և կանչում երկու գործառույթ ՝ XScuGic_Connect () և XScuGic_Enable () ՝ ընդհատումներն իրար միացնելու և միացնելու համար: Նրանք հղում են կատարում xInterruptController- ին, որը որպես կանխադրված FreeRTOS main.c- ում ստեղծված ընդհատումների վերահսկիչ է: Այսպիսով, հիմնականում մենք մեր ընդհատումներից յուրաքանչյուրը կցում ենք այս ընդհատման վերահսկիչին, որն արդեն մեզ համար ստեղծվել է FreeRTOS- ի կողմից:

DMA

DMA- ի սկզբնավորման կոդը սկսվում է lh_main.c- ից: Նախ հայտարարվում է XAxiDma կառուցվածքի ստատիկ օրինակ: Այնուհետև _init_audio () գործառույթում այն կազմաձևվում է: Նախ կանչվում է ցուցադրական նախագծի կազմաձևման գործառույթը, որը գտնվում է dma.c. Այն բավականին լավ փաստաթղթավորված է և գալիս է անմիջապես ցուցադրականից: Այնուհետև ընդհատումը միանում և միանում է: Այս նախագծի համար պահանջվում է միայն վարպետ-ստրուկ ընդհատում, քանի որ բոլոր տվյալները DMA- ն ուղարկում է I2S վերահսկիչին: Եթե ցանկանում եք ձայնագրել ձայնը, ձեզ նույնպես անհրաժեշտ կլինի ստրուկ-տիրոջ ընդհատումը: Գլխավոր-ստրուկ ընդհատումը զանգահարվում է, երբ DMA- ն ավարտում է այն տվյալների ուղարկումը, որոնք դուք ասել եք, որ ուղարկի: Այս ընդհատումը աներևակայելի կարևոր է մեր նախագծի համար, քանի որ ամեն անգամ, երբ DMA- ն ավարտում է մեկ բուֆերային աուդիո նմուշների ուղարկումը, այն պետք է անմիջապես սկսի ուղարկել հաջորդ բուֆերը, այլապես ուղարկվողների միջև լսելի ուշացում կլինի: Dma_mm2s_ISR () ֆունկցիայի ներսում կարող եք տեսնել, թե ինչպես ենք մենք վարում ընդհատումը: Կարևոր մասը մոտ է ավարտին, որտեղ մենք օգտագործում ենք xSemaphoreGiveFromISR () և portYIELD_FROM_ISR () ՝ ծանուցման համար _audio_task (), որ այն կարող է նախաձեռնել հաջորդ DMA փոխանցումը: Անընդհատ աուդիո տվյալներ ուղարկելու եղանակը երկու բուֆերների միջև հերթափոխն է: Երբ մեկ բուֆերը փոխանցվում է I2C բլոկին, մյուս բուֆերը հաշվարկում և պահում է իր արժեքները: Հետո, երբ ընդհատումը գալիս է DMA- ից, ակտիվ բուֆերը միանում է, և վերջերս գրված բուֆերը սկսում է փոխանցվել, մինչդեռ նախկինում փոխանցված բուֆերը սկսում է վերագրվել նոր տվյալներով: _Audio_task գործառույթի հիմնական մասն այն է, որտեղ fnAudioPlay () - ը կանչվում է: fnAudioPlay () վերցնում է DMA օրինակում, բուֆերի երկարությունը և ցուցիչ դեպի բուֆեր, որից տվյալները կփոխանցվեն: Մի քանի արժեքներ ուղարկվում են I2S գրանցամատյաններին `տեղեկացնելու համար, որ ավելի շատ նմուշներ են սպասվում: Այնուհետեւ XAxiDma_SimpleTransfer () - ը զանգահարում է փոխանցումը սկսելու համար:

I2S Աուդիո

audio.c և audio.h այն վայրերն են, որտեղ տեղի է ունենում I2S նախաստորագրումը: I2S սկզբնավորման կոդը բավականին տարածված կոդ է, որը լողում է մի շարք վայրերում, այլ աղբյուրներից կարող եք փոքր տատանումներ գտնել, բայց այս մեկը պետք է աշխատի: Այն բավականին լավ փաստագրված է և քնար նախագծի համար շատ բան փոխելու կարիք չունի: DMA աուդիո ցուցադրումը, որից այն ստացվել է, ունի միկրոֆոնային կամ գծային մուտքերին անցնելու գործառույթներ, այնպես որ կարող եք օգտագործել դրանք, եթե ձեզ անհրաժեշտ է այդ գործառույթը:

Ձայնի սինթեզ

Բնութագրելու համար, թե ինչպես է գործում ձայնի սինթեզը, ես պատրաստվում եմ թվարկել մշակման մեջ օգտագործվող ձայնային մոդելներից յուրաքանչյուրը, որը հանգեցրեց վերջնական մեթոդին, քանի որ այն ձեզ կզգա, թե ինչու է դա արվում այնպես, ինչպես դա արվում է:

Մեթոդ 1. Սինուսային արժեքների մեկ շրջան հաշվարկվում է յուրաքանչյուր տողի համար `համապատասխանաբար այդ լարային երաժշտական նոտայի համար և պահվում է զանգվածում: Օրինակ, զանգվածի երկարությունը կլինի սինուսային ալիքի ժամանակահատվածը նմուշներում, որը հավասար է # նմուշների / ցիկլի: Եթե նմուշառման արագությունը 48 կՀց է, իսկ նշման հաճախականությունը `100 Հց, ապա կան 48, 000 նմուշներ/երկրորդ և 100 ցիկլեր/վայրկյաններ, ինչը հանգեցնում է 4800 նմուշի մեկ ցիկլի համար, իսկ զանգվածի երկարությունը կլինի 4800 նմուշ և կպարունակի մեկ ամբողջականի արժեքները: սինուս ալիքի ժամանակաշրջան: Լարը նվագելիս աուդիո նմուշի բուֆերը լցվում է ՝ վերցնելով մի արժեք սինուս ալիքի զանգվածից և այն որպես նմուշ դնելով ձայնային բուֆերի մեջ, այնուհետև ինդեքսը մեծացնելով սինուս ալիքների զանգվածի մեջ, որպեսզի դասընթացի ընթացքում օգտագործենք մեր նախորդ օրինակը: 4800 նմուշներից մեկ ձայնային ալիքի ցիկլը դրվում է աուդիո բուֆերի մեջ: Modանգվածի ինդեքսի վրա օգտագործվում է մոդուլային գործողություն այնպես, որ այն միշտ ընկնում է 0 -ի և երկարության միջև, և երբ զանգվածի ինդեքսը անցնում է որոշակի շեմից (օրինակ ՝ գուցե 2 վայրկյան արժողությամբ նմուշներ) տողը անջատված է: Միաժամանակ մի քանի տող նվագարկելու համար հետևեք յուրաքանչյուր տողերի զանգվածների ինդեքսին առանձին և յուրաքանչյուր տիպի ստացման համար ավելացրեք արժեքը յուրաքանչյուր տողի լարային ալիքից:

Մեթոդ 2. Ավելի երաժշտական երանգ ստեղծելու համար մենք սկսում ենք նախորդ մոդելից և յուրաքանչյուր հիմնական հաճախականությանը ներդաշնակություն ենք ներդնում: Ներդաշնակ հաճախականությունները հաճախականություններ են, որոնք հիմնարար հաճախականության ամբողջ բազմապատիկ են: Ի տարբերություն այն դեպքերի, երբ երկու իրար հետ կապ չունեցող հաճախականություններ ամփոփվում են միասին, որի արդյունքում միաժամանակ հնչում են երկու տարբեր հնչյուններ, երբ ներդաշնակները միանում են իրար, այն շարունակում է հնչել միայն որպես մեկ հնչյուն, բայց այլ տոնով: Դա իրականացնելու համար ամեն անգամ ձայնային նմուշին սինուսային ալիքի արժեքը (զանգվածի ինդեքս % զանգվածի երկարություն) ենք ավելացնում, ավելացնում ենք նաև (2 * զանգվածի ինդեքս % զանգվածի երկարություն) և (3 * զանգվածի ինդեքս % զանգվածի երկարություն), և այլն, քանի դեռ շատ ներդաշնակություններ են ցանկալի: Այս բազմապատկված ինդեքսները կանցնեն սինուսային ալիքը այն հաճախականությունների վրա, որոնք սկզբնական հաճախականության ամբողջ բազմապատիկ են: Ձայնի ավելի շատ վերահսկողություն ապահովելու համար յուրաքանչյուր ներդաշնակության արժեքներ բազմապատկվում են փոփոխականով, որը ներկայացնում է ընդհանուր հնչողության մեջ այդ ներդաշնակության չափը: Օրինակ, հիմնական սինուսային ալիքը կարող է դրա բոլոր արժեքները բազմապատկել 6 -ով `այն ընդհանուր ձայնի ավելի մեծ գործոն դարձնելու համար, մինչդեռ 5 -րդ հարմոնիկը կարող է ունենալ 1 -ի բազմապատկիչ, ինչը նշանակում է, որ դրա արժեքները շատ ավելի քիչ են նպաստում ընդհանուր ձայնին:

Մեթոդ 3. Լավ, ուրեմն հիմա մենք շատ լավ տոն ունենք նոտաների վրա, բայց դեռ բավականին կարևոր խնդիր կա. Նրանք նվագում են ֆիքսված ձայնով `որոշակի տևողությամբ: Իրական գործիքի նման հնչելու համար նվագվող լարերի ծավալը ժամանակի ընթացքում պետք է սահուն քայքայվի: Դա իրականացնելու համար զանգվածը լցված է երկրաչափական քայքայվող գործառույթի արժեքներով: Այժմ, երբ ստեղծվում են աուդիո նմուշներ, յուրաքանչյուր տողից եկող ձայնը հաշվարկվում է նախորդ մեթոդի նման, բայց մինչ ձայնային նմուշին ավելացվելը բազմապատկվում է այդ տողերի զանգվածների ինդեքսի արժեքով `էքսոնենցիալ քայքայման գործառույթի զանգվածում: Սա ստիպում է ձայնը սահուն ցրվել ժամանակի ընթացքում: Երբ զանգվածների ինդեքսը հասնում է քայքայման զանգվածի ավարտին, տողը դադարում է:

Մեթոդ 4. Այս վերջին քայլն այն է, ինչն իսկապես տալիս է լարային հնչյուններին իրատեսական լարային հնչողություն: Նախքան դրանք հնչում էին հաճելի, բայց հստակ սինթեզված: Իրական տավիղի լարից ավելի լավ ընդօրինակելու համար յուրաքանչյուր ներդաշնակին տրվում է քայքայման այլ արագություն: Իրական լարերում, երբ լարն առաջին անգամ հարվածում է, առկա է բարձր հաճախականությամբ հարմոնիկայի բարձր պարունակություն, որը ստեղծում է պոկելու ձայնի տեսակ, որը մենք ակնկալում ենք լարից: Այս բարձր հաճախականությամբ հարմոնիկները շատ կարճ են հանդիսանում ձայնի հիմնական մասը ՝ լարային հարվածի ձայնը, բայց դրանք շատ արագ քայքայվում են, քանի որ դանդաղ ներդաշնակները վերցնում են իրենց ուժերը: Ձայնային սինթեզում օգտագործվող յուրաքանչյուր ներդաշնակ թվի համար ստեղծվում է քայքայման զանգված `յուրաքանչյուրն իր քայքայման արագությամբ: Այժմ յուրաքանչյուր ներդաշնակ կարող է ինքնուրույն բազմապատկվել տողի զանգվածի ինդեքսում իր համապատասխան քայքայման զանգվածով և ավելացնել ձայնին:

Ընդհանուր առմամբ ձայնի սինթեզը ինտուիտիվ է, բայց հաշվարկը ծանր: Ամբողջ լարային ձայնը միանգամից հիշողության մեջ պահելը չափազանց մեծ հիշողություն կպահանջի, բայց սինուսային ալիքի և յուրաքանչյուր շրջանակի միջև եղած ցուցադրական ֆունկցիայի հաշվարկը չափազանց երկար կտևի `ձայնային նվագարկման արագությանը համահունչ չլինելու համար: Կոդում օգտագործվում են մի շարք հնարքներ ՝ հաշվարկն արագացնելու համար: Բոլոր մաթեմատիկան, բացառությամբ սինուս և քայքայման աղյուսակների նախնական ստեղծման, կատարվում է ամբողջ թվով, ինչը պահանջում է 24 -բիթանոց աուդիո ելքի մեջ առկա թվային տարածության տարածում: Օրինակ, սինուսային աղյուսակը 150 ամպլիտուդի է, այնպես որ այն հարթ է, բայց ոչ այնքան մեծ, որ միասին նվագած բազմաթիվ լարերը կարող են ավելացնել 24 բիթից ավելի: Նմանապես, ցուցիչ աղյուսակի արժեքները բազմապատկվում են 80 -ով ՝ մինչև ամբողջ թվերի կլորացվել և պահվել: Ներդաշնակ կշիռները կարող են 0 -ից 10 -ի սահմաններում վերցնել դիսկրետ արժեքներ: Նաև բոլոր նմուշները իրականում կրկնապատկվում են, իսկ սինուսային ալիքները ինդեքսավորվում են 2 -ով, ինչը արդյունավետորեն կրճատում է ընտրանքի արագությունը երկու անգամ: Սա սահմանափակում է առավելագույն հաճախականությունը, որը կարելի է նվագել, բայց անհրաժեշտ էր, որ լարերի և ներդաշնակության ընթացիկ թիվը բավականաչափ արագ հաշվարկվեր:

Այս ձայնային մոդելի ստեղծումը և այն գործի բերելը զգալի ջանքեր պահանջեց պրոցեսորի կողմից, և անհավանական դժվար կլիներ, որ այս ծրագրի ընթացքում զրոյից այն աշխատեր զրոյից fpga- ով (պատկերացրեք, որ պետք է ամեն անգամ վերստեղծել բիթստրիմը ժամանակն է, որ բառը փոխվել է ՝ ձայնը ստուգելու համար): Այնուամենայնիվ, fpga- ով դա անելը, ամենայն հավանականությամբ, կարող է լինել ավելի լավ միջոց, հնարավոր է ՝ վերացնել նմուշները բավական արագ չկարողանալու հնարավորությունը և թույլ տալ ավելի շատ լարեր, ներդաշնակ և նույնիսկ ձայնային էֆեկտներ կամ այլ առաջադրանքներ: պրոցեսորի կողմը:

Քայլ 6: Սենսորների միացում

Սենսորների միացում
Սենսորների միացում

Լարերը ստեղծելու համար մենք օգտագործեցինք IR ճառագայթների ճառագայթների տվիչներ, որոնք կհայտնաբերեն, երբ լարը նվագարկվում է: Մենք պատվիրեցինք մեր տվիչներին հետևյալ հղումից: Սենսորներն ունեն հոսանքի, գրունտի և տվյալների հաղորդալար, մինչդեռ էմիտատորներն ունեն միայն հոսանքի և գրունտի լար: PMIT- ի վերնագրերից օգտագործեցինք 3.3 Վ լարման և գրունտային կապիչներ `ինչպես արտանետիչների, այնպես էլ սենսորների հզորացման համար: Բոլոր տվիչներն ու ճառագայթիչները սնուցելու համար անհրաժեշտ է զուգահեռաբար միացնել բոլոր տվիչներն ու արտանետողը: Սենսորներից ստացված տվյալների հաղորդալարերից յուրաքանչյուրը պետք է անցնի իր սեփական pmod կապին:

Քայլ 7: Կմախքի կառուցում

Կառուցելով կմախքը
Կառուցելով կմախքը

Տավիղի ձև ստեղծելու համար երեք կտորները օգտագործվում են որպես կմախք ՝ սենսորներն ու արտանետիչները տեղադրելու համար: Երկու 18 դյույմանոց PVC խողովակներից մեկի վրա հավասարեցրեք տվիչներն ու ճառագայթիչները միմյանցից 1,5 դյույմ հերթափոխով, այնուհետև դրանք կպցրեք խողովակին: Մյուս 18 դյույմանոց PVC խողովակի վրա հավասարեցրեք սենսորներն ու արտանետիչները փոփոխական հերթականությամբ, բայց համոզվեք, որ փոխեք կարգը (այսինքն, եթե առաջին խողովակը առաջինը ցուցիչ ուներ, երկրորդը պետք է ունենա առաջին թողարկիչ և հակառակը):Անհրաժեշտ կլինի ավելի երկար լարեր կպցնել տվյալների, հոսանքի և գրունտի լարերի վրա `ապահովելու համար, որ նրանք կկարողանան հասնել տախտակին:

Քայլ 8. Փայտի արտաքին կառուցում

Փայտի արտաքին կառուցում
Փայտի արտաքին կառուցում

Այս քայլը պարտադիր չէ, բայց խորհուրդ է տրվում: Փայտի արտաքին տեսքը ոչ միայն գեղեցիկ է դարձնում տավիղը, այլև պաշտպանում է սենսորներն ու լարերը վնասներից: Փայտե շրջանակը կարող է ստեղծվել փայտից պատրաստված ուղղանկյուն օղակով: Ուղղանկյան ներսը պետք է ունենա առնվազն 1-1/2 դյույմ բացվածք `խողովակին և սենսորային կմախքին տեղավորելու համար: Շրջանակի կառուցումից հետո բացեք երկու անցք, որոնք թույլ կտան սենսորից և ճառագայթներից լարերը դուրս գալ `դրանք տախտակի հետ միացնելու համար:

*Նշում. Խորհուրդ է տրվում ավելացնել մուտքի կետեր, որպեսզի կարողանաք հեռացնել և ներդնել խողովակի կմախքը, եթե վերանորոգման կարիք լինի կամ փոքր ճշգրտումներ կատարվեն:

Քայլ 9: Բոլոր կտորները միասին դնելը

Բոլոր կտորները միասին դնելը
Բոլոր կտորները միասին դնելը

Բոլոր նախորդ քայլերն ավարտելուց հետո ժամանակն է կառուցել քնարը: Նախ տեղադրեք խողովակի կմախքը փայտե արտաքին մասի ներսում: Այնուհետև տվիչների և ճառագայթիչների լարերը միացրեք տախտակի ճիշտ վայրին: Այնուհետև բացեք SDK- ն և կտտացրեք կարգաբերման կոճակին ՝ խորհուրդը ծրագրավորելու համար: Երբ խորհուրդը ծրագրավորվում է, միացրեք ականջակալներ կամ բարձրախոս: Կախված նրանից, թե որ սենսորն է հայտնվում pmod պորտում, ձեր քնարների լարերը, հավանաբար, շարքից դուրս կգան: Քանի որ դժվար է ասել, թե որ մետաղալարն է անցնում ինչ սենսորին, երբ այդքան լարեր են ներգրավված, մենք ներառեցինք մի տող ՝ քարտեզագրելու համար `ծրագրային ապահովման բիտ դիրքերն ընդհատելու համար: Գտեք «static int sensor_map [NUM_STRINGS]» և հարմարեցրեք զանգվածի արժեքները, մինչև տողերը չխաղան ամենացածրից մինչև ամենաբարձրը ըստ հերթականության:

Theաշացանկը կարող է օգտագործվել ՝ բացելով սերիական տերմինալ (օրինակ ՝ RealTerm) և բաուդ արագությունը սահմանել 115200, իսկ ցուցադրումը ՝ ANSI: Մենյուում կարող եք նավարկվել `օգտագործելով w և s ստեղները` վեր ու վար շարժվելու և a և d ստեղները `արժեքները փոխելու համար:

Քայլ 10

Երբ քնարը լիովին գործի: Տիրապետեք քնարին և լսեք ձեր իսկ երաժշտության քաղցր ձայնը:

Խորհուրդ ենք տալիս: