«Մանիֆեստ հարակից մասնագիտությունների սկսնակ ծրագրավորողների համար» կամ ինչպես ես հասա կյանքի այս կետին

Իմ այսօրվա հոդվածը բարձրաձայն մտքեր է մի մարդու, ով գրեթե պատահաբար (թեև բնականաբար) բռնել է ծրագրավորման ճանապարհը:

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

«Մանիֆեստ հարակից մասնագիտությունների սկսնակ ծրագրավորողների համար» կամ ինչպես ես հասա կյանքի այս կետին
Source: https://xkcd.com/664/

Ընդհանուր առմամբ, նվիրված բոլոր ներկա ուսանողներին նախկին ուսանողից:

Սպասումներ

Երբ ես ավարտեցի իմ բակալավրի աստիճանը տեղեկատվական հաղորդակցության տեխնոլոգիաների և հաղորդակցման համակարգերի ոլորտում 2014 թվականին, ես գրեթե ոչինչ չգիտեի ծրագրավորման աշխարհի մասին: Այո, ինչպես շատ ուրիշներ, ես «Համակարգչային գիտություն» առարկան վերցրեցի իմ առաջին կուրսում, բայց, Տեր, դա իմ առաջին կուրսում էր: Դա եղել է հավերժություն:

Ընդհանրապես, ես առանձնապես տարբեր բան չէի սպասում բակալավրի կոչումից և երբ ընդունվեցի մագիստրատուրա. «Հաղորդակցություն և ազդանշանների մշակում» Գերմանա-ռուսական նոր տեխնոլոգիաների ինստիտուտ.

Բայց իզուր...

Մենք միայն երկրորդ ընդունողն էինք, իսկ առաջինի տղաները դեռ ճամպրուկները հավաքում էին հեռավոր Գերմանիա (մագիստրատուրայի երկրորդ կուրսում պրակտիկան տևում է վեց ամիս): Այսինքն՝ մերձավոր շրջապատից դեռ ոչ ոք լրջորեն չէր բախվել եվրոպական կրթության մեթոդներին, և չկար մեկը, որ հարցներ մանրամասների մասին։

Մեր առաջին տարում, իհարկե, մենք ունեինք տարբեր տեսակի պրակտիկա, որտեղ մեզ սովորաբար ժողովրդավարական ճանապարհով առաջարկում էին ընտրություն գրել սցենարներ գրելու (հիմնականում MATLAB լեզվով) և տարբեր բարձր մասնագիտացված GUI-ներ օգտագործելու միջև (այն իմաստով, որ առանց սցենարներ գրելու՝ սիմուլյացիա): մոդելավորման միջավայրեր):

«Մանիֆեստ հարակից մասնագիտությունների սկսնակ ծրագրավորողների համար» կամ ինչպես ես հասա կյանքի այս կետին

Ավելորդ է ասել, որ մենք՝ ապագա գիտությունների մագիստրոսներս, մեր պատանեկան հիմարությունից ելնելով, խուսափեցինք կրակի պես ծածկագրեր գրելուց։ Ահա, օրինակ, Simulink-ը MathWorks-ից. ահա բլոկները, ահա միացումները, այստեղ բոլոր տեսակի կարգավորումներն ու անջատիչները:

Տեսակետ, որը բնիկ և հասկանալի է այն մարդու համար, ով նախկինում աշխատել է սխեմաների նախագծման և համակարգերի ճարտարագիտության մեջ:

«Մանիֆեստ հարակից մասնագիտությունների սկսնակ ծրագրավորողների համար» կամ ինչպես ես հասա կյանքի այս կետին
Source: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Այսպիսով, մեզ թվում էր ...

Իրականություն

Առաջին կիսամյակի գործնական աշխատանքներից մեկը OFDM ազդանշանի հաղորդիչի մշակումն էր «Մոդելավորման և օպտիմալացման մեթոդներ» առարկայի շրջանակներում: Գաղափարը շատ հաջողված է՝ տեխնոլոգիան դեռևս արդիական է և բավականին տարածված՝ շնորհիվ դրա օգտագործման, օրինակ՝ Wi-Fi և LTE/LTE-A ցանցերում (OFDMA-ի տեսքով)։ Սա լավագույն բանն է, որ վարպետները կիրառեն հեռահաղորդակցության համակարգերի մոդելավորման իրենց հմտությունները:

«Մանիֆեստ հարակից մասնագիտությունների սկսնակ ծրագրավորողների համար» կամ ինչպես ես հասա կյանքի այս կետին

Իսկ հիմա մեզ տրված են տեխնիկական բնութագրերի մի քանի տարբերակներ՝ շրջանակի ակնհայտ անիրագործելի պարամետրերով (որպեսզի լուծում չփնտրենք համացանցում), և մենք ցատկում ենք արդեն նշված Simulink-ի վրա... Ու թեյնիկով հարվածում ենք գլխին։ իրականության:

  • Յուրաքանչյուր բլոկ հղի է բազմաթիվ անհայտ պարամետրերով, որոնք սարսափելի են փոխել գլխարկի անկման ժամանակ:
  • Թվերի հետ մանիպուլյացիաները պետք է անել, թվում է, պարզ է, բայց դեռ պետք է իրարանցում անել, Աստված մի արասցե։
  • Մայր տաճարի մեքենաները նկատելիորեն դանդաղում են GUI-ի կատաղի օգտագործումից, նույնիսկ հասանելի բլոկների գրադարաններով ճամփորդելու փուլում:
  • Տանը ինչ-որ բան ավարտելու համար հարկավոր է ունենալ նույն Simulink-ը: Եվ, ըստ էության, այլընտրանքներ չկան։

Այո, ի վերջո մենք, իհարկե, ավարտեցինք նախագիծը, բայց այն ավարտին հասցրինք թեթեւության բարձր արտաշնչումով։

Անցավ որոշ ժամանակ, և հասանք մագիստրատուրայի առաջին կուրսի ավարտին։ GUI-ներ օգտագործող տնային աշխատանքների քանակը սկսեց համաչափ նվազել գերմանական առարկաների համամասնության աճին զուգահեռ, չնայած այն դեռ չէր հասել պարադիգմային փոփոխության կետին: Մեզանից շատերը, այդ թվում՝ ես, հաղթահարելով մեր զգալի ամպլիտուդը՝ ստեղծելով, ավելի ու ավելի շատ օգտագործում էին Matlab-ը մեր գիտական ​​նախագծերում (թեև Գործիքների տուփերի տեսքով), և ոչ թե ծանոթ թվացող Simulink-ը:

Մեր կասկածների կետը երկրորդ կուրսի ուսանողներից մեկի (այդ ժամանակ նրանք նոր էին վերադարձել Ռուսաստան) արտահայտությունն էր.

  • Մոռացեք, գոնե պրակտիկայի ընթացքում, Similink-ի, MathCad-ի և LabView-ի մասին. բլրի վրա ամեն ինչ գրված է MATLAB-ում՝ օգտագործելով հենց MatLab-ը կամ դրա անվճար «տարբերակը» Octave-ը:

Հայտարարությունը մասամբ ճշմարիտ է պարզվել. Իլմենաուում գործիքների ընտրության շուրջ վեճը նույնպես ամբողջությամբ չի լուծվել։ Ճիշտ է, ընտրությունը հիմնականում եղել է MATLAB-ի, Python-ի և C-ի միջև:

Նույն օրը ինձ տարավ բնական հուզմունք. չպե՞տք է արդյոք փոխանցեմ OFDM հաղորդիչի մոդելի իմ մասը գրված ձևի: Պարզապես հաճույքի համար.

Եվ ես գործի անցա:

Քայլ առ քայլ

Տեսական հաշվարկների փոխարեն սրան ուղղակի հղում կտամ գերազանց հոդված 2011 թվականից tgx և սլայդների վրա LTE ֆիզիկական շերտ դասախոսներ Միշել-Թիլա (TU Ilmenau). Կարծում եմ՝ սա բավական կլինի։

«Ուրեմն,- մտածեցի ես,- կրկնենք, ի՞նչ ենք մոդելավորելու»:
Մենք մոդելավորելու ենք OFDM շրջանակի գեներատոր (OFDM շրջանակի գեներատոր):

Ինչ կներառի.

  • տեղեկատվական խորհրդանիշներ
  • փորձնական ազդանշաններ
  • զրոներ (DC)

Ինչից (պարզության համար) մենք վերացում ենք.

  • ցիկլային նախածանցի մոդելավորումից (եթե գիտեք հիմունքները, ավելացնելը դժվար չի լինի)

«Մանիֆեստ հարակից մասնագիտությունների սկսնակ ծրագրավորողների համար» կամ ինչպես ես հասա կյանքի այս կետին

Դիտարկվող մոդելի բլոկային դիագրամ: Մենք կանգ կառնենք հակադարձ FFT (IFFT) բլոկի վրա: Պատկերն ամբողջացնելու համար մնացածը յուրաքանչյուրն ինքը կարող է շարունակել,- ես բաժնի ուսուցիչներին խոսք եմ տվել ուսանողների համար ինչ-որ բան թողնել։

Եկեք դրանք սահմանենք մեզ համար: վարժություն.

  • ենթափոխադրողների ֆիքսված քանակ;
  • ֆիքսված շրջանակի երկարություն;
  • մենք պետք է ավելացնենք մեկ զրո մեջտեղում և մի զույգ զրո շրջանակի սկզբում և վերջում (ընդհանուր, 5 հատ);
  • տեղեկատվական սիմվոլները մոդուլացվում են M-PSK-ի կամ M-QAM-ի միջոցով, որտեղ M-ը մոդուլյացիայի կարգն է:

Սկսենք ծածկագրից։

Ամբողջ սցենարը կարելի է ներբեռնել այստեղից ՈՒղեցույց.

Եկեք սահմանենք մուտքագրման պարամետրերը.

clear all; close all; clc

M = 4; % e.g. QPSK 
N_inf = 16; % number of subcarriers (information symbols, actually) in the frame
fr_len = 32; % the length of our OFDM frame
N_pil = fr_len - N_inf - 5; % number of pilots in the frame
pilots = [1; j; -1; -j]; % pilots (QPSK, in fact)

nulls_idx = [1, 2, fr_len/2, fr_len-1, fr_len]; % indexes of nulls

Այժմ մենք որոշում ենք տեղեկատվական նշանների ինդեքսները՝ ընդունելով այն նախադրյալը, որ փորձնական ազդանշանները պետք է անպայման գնան զրոյից առաջ և/կամ հետո.

idx_1_start = 4;
idx_1_end = fr_len/2 - 2;

idx_2_start = fr_len/2 + 2;
idx_2_end =  fr_len - 3;

Այնուհետև դիրքերը կարելի է որոշել՝ օգտագործելով ֆունկցիան linsspace, արժեքները նվազեցնելով մոտակա ամբողջ թվերից ամենափոքրին՝

inf_idx_1 = (floor(linspace(idx_1_start, idx_1_end, N_inf/2))).'; 
inf_idx_2 = (floor(linspace(idx_2_start, idx_2_end, N_inf/2))).';

inf_ind = [inf_idx_1; inf_idx_2]; % simple concatenation

Եկեք սրան ավելացնենք զրոների ինդեքսներ և դասավորենք.

%concatenation and ascending sorting
inf_and_nulls_idx = union(inf_ind, nulls_idx); 

Համապատասխանաբար, փորձնական ազդանշանային ցուցանիշները մնացած ամեն ինչն են.

%numbers in range from 1 to frame length 
% that don't overlape with inf_and_nulls_idx vector
pilot_idx = setdiff(1:fr_len, inf_and_nulls_idx); 

Հիմա եկեք հասկանանք օդաչուի ազդանշանները:

Մենք ունենք ձևանմուշ (փոփոխական օդաչուները), և ենթադրենք, որ մենք ցանկանում ենք, որ այս կաղապարի օդաչուները հաջորդաբար տեղադրվեն մեր շրջանակում: Իհարկե, դա կարելի է անել հանգույցով: Կամ դուք կարող եք մի փոքր բարդ խաղալ մատրիցներով. բարեբախտաբար MATLAB-ը թույլ է տալիս դա անել բավարար հարմարավետությամբ:

Նախ, եկեք որոշենք, թե այս կաղապարներից քանիսն են ամբողջությամբ տեղավորվում շրջանակի մեջ.

pilots_len_psudo = floor(N_pil/length(pilots));

Հաջորդը, մենք ձևավորում ենք վեկտոր, որը բաղկացած է մեր ձևանմուշներից.

% linear algebra tricks:
mat_1 = pilots*ones(1, pilots_len_psudo); % rank-one matrix
resh = reshape(mat_1, pilots_len_psudo*length(pilots),1); % vectorization

Եվ մենք սահմանում ենք մի փոքրիկ վեկտոր, որը պարունակում է միայն կաղապարի մի կտոր՝ «պոչը», որն ամբողջությամբ չի տեղավորվում շրջանակի մեջ.

tail_len = fr_len  - N_inf - length(nulls_idx) ...
                - length(pilots)*pilots_len_psudo; 
tail = pilots(1:tail_len); % "tail" of pilots vector

Մենք ստանում ենք օդաչուների կերպարներ.

vec_pilots = [resh; tail]; % completed pilots vector that frame consists

Եկեք անցնենք տեղեկատվական խորհրդանիշներին, մասնավորապես, մենք կկազմենք հաղորդագրություն և կձևակերպենք այն.

message = randi([0 M-1], N_inf, 1); % decimal information symbols

if M >= 16
    info_symbols = qammod(message, M, pi/4);
else
    info_symbols = pskmod(message, M, pi/4);
end 

Ամեն ինչ պատրաստ է: Շրջանակի հավաքում.

%% Frame construction
frame = zeros(fr_len,1);
frame(pilot_idx) = vec_pilots;
frame(inf_ind) = info_symbols

Դուք պետք է ստանաք այսպիսի բան.

frame =

   0.00000 + 0.00000i
   0.00000 + 0.00000i
   1.00000 + 0.00000i
  -0.70711 - 0.70711i
  -0.70711 - 0.70711i
   0.70711 + 0.70711i
   0.00000 + 1.00000i
  -0.70711 + 0.70711i
  -0.70711 + 0.70711i
  -1.00000 + 0.00000i
  -0.70711 + 0.70711i
  -0.70711 - 0.70711i
   0.00000 - 1.00000i
   0.70711 + 0.70711i
   1.00000 + 0.00000i
   0.00000 + 0.00000i
   0.00000 + 1.00000i
   0.70711 - 0.70711i
  -0.70711 + 0.70711i
  -1.00000 + 0.00000i
  -0.70711 + 0.70711i
   0.70711 + 0.70711i
   0.00000 - 1.00000i
  -0.70711 - 0.70711i
   0.70711 + 0.70711i
   1.00000 + 0.00000i
   0.70711 - 0.70711i
   0.00000 + 1.00000i
   0.70711 - 0.70711i
  -1.00000 + 0.00000i
   0.00000 + 0.00000i
   0.00000 + 0.00000i

— Երանությո՜ւն։ — գոհ մտածեցի ու փակեցի նոութբուքը։ Ինձնից մի քանի ժամ պահանջվեց ամեն ինչ անելու համար՝ ներառյալ կոդ գրելը, Matlab-ի որոշ գործառույթներ սովորելը և մաթեմատիկական հնարքների միջոցով մտածելը:

Ի՞նչ եզրակացություններ արեցի այն ժամանակ:

Սուբյեկտիվ:

  • Կոդ գրելը հաճելի է և նման է պոեզիայի:
  • Սցենարավորումը կապի և ազդանշանների մշակման ոլորտի համար հետազոտության ամենահարմար մեթոդն է:

Օբյեկտիվ:

  • Թնդանոթից ճնճղուկներին կրակելու կարիք չկա (եթե նման կրթական նպատակը, իհարկե, արժանի չէ). Simulink-ի միջոցով մենք ձեռնամուխ եղանք բարդ գործիքի միջոցով պարզ խնդրի լուծմանը:
  • GUI-ն լավն է, բայց ավելի լավ է հասկանալ, թե ինչ է պարունակվում «գլխարկի տակ»:

Եվ հիմա, հեռու լինելով ուսանող լինելուց, ուսանողական եղբայրությանը ուզում եմ ասել հետևյալը.

  • Չարաճճի

Փորձեք գրել կոդ, նույնիսկ եթե այն սկզբում վատ է: Ծրագրավորման դեպքում, ինչպես ցանկացած այլ գործունեության դեպքում, ամենադժվարը սկիզբն է: Եվ ավելի լավ է սկսել ավելի վաղ. եթե դուք գիտնական եք կամ նույնիսկ պարզապես տեխնոլոգ, վաղ թե ուշ ձեզ այս հմտությունը պետք կգա:

  • Պահանջե՜

Ուսուցիչներից և ղեկավարներից պահանջեք առաջադեմ մոտեցումներ և գործիքներ: Եթե ​​դա հնարավոր է, իհարկե...

  • Ստեղծել!

Էլ որտե՞ղ է ավելի լավ հաղթահարել սկսնակի բոլոր խոցերը, եթե ոչ կրթական ծրագրի շրջանակներում։ Ստեղծեք և հղկեք ձեր հմտությունները. կրկին, որքան շուտ սկսեք, այնքան լավ:

Բոլոր երկրներից ձգտող ծրագրավորողներ, միավորվեք:

PS

Ուսանողների հետ իմ անմիջական հարաբերություններն արձանագրելու համար կցում եմ 2017 թվականի հիշարժան լուսանկարը երկու ռեկտորների հետ՝ Պիտեր Շարֆի (աջ կողմում) և Ալբերտ Խարիսովիչ Գիլմուտդինովի (ձախ կողմում):

«Մանիֆեստ հարակից մասնագիտությունների սկսնակ ծրագրավորողների համար» կամ ինչպես ես հասա կյանքի այս կետին

Գոնե այս զգեստների համար արժեր ավարտել ծրագիրը։ (կատակ)

Source: www.habr.com

Добавить комментарий