Laser Harp սինթեզատոր Zybo տախտակի վրա. 10 քայլ (նկարներով)
Laser Harp սինթեզատոր Zybo տախտակի վրա. 10 քայլ (նկարներով)
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

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

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