ā€œManifests iesācējiem programmētājiem no radniecÄ«gām specialitātēmā€ jeb kā es nonācu lÄ«dz Å”im dzÄ«ves punktam

Mans raksts Å”odien ir skaļas domas no cilvēka, kurÅ” gandrÄ«z nejauÅ”i (kaut arÄ« dabiski) izvēlējās programmÄ“Å”anas ceļu.

Jā, es saprotu, ka mana pieredze ir tikai mana pieredze, bet man Ŕķiet, ka tā labi iekļaujas kopējā tendencē. Turklāt tālāk aprakstÄ«tā pieredze vairāk saistās ar zinātniskās darbÄ«bas jomu, bet, kas pie velna nav joks ā€“ tā var noderēt ārpusē.

ā€œManifests iesācējiem programmētājiem no radniecÄ«gām specialitātēmā€ jeb kā es nonācu lÄ«dz Å”im dzÄ«ves punktam
Avots: https://xkcd.com/664/

Kopumā veltīts visiem esoŔajiem studentiem no bijuŔā studenta!

Cerības

Kad 2014. gadā pabeidzu bakalaura grādu infokomunikāciju tehnoloÄ£ijās un sakaru sistēmās, es gandrÄ«z neko nezināju par programmÄ“Å”anas pasauli. Jā, tāpat kā daudzi citi, es mācÄ«jos ā€œDatorzinātnesā€ savā pirmajā kursā, bet, Kungs, tas bija manā pirmajā kursā! Ir pagājusi vesela mūžība!

Vispār neko īpaŔi atŔķirīgu no bakalaura negaidīju un stājoties maģistrantūrā "Sakari un signālu apstrāde" Vācijas-Krievijas Jauno tehnoloģiju institūts.

Bet velti...

Mēs bijām tikai otrā uzņemÅ”ana, un puiÅ”i no pirmās vēl kravāja somas uz tālo Vāciju (maÄ£istra otrajā kursā prakse ilgst seÅ”us mēneÅ”us). Citiem vārdiem sakot, neviens no tuvākās vides vēl nebija nopietni saskāries ar Eiropas izglÄ«tÄ«bas metodēm, un nebija neviena, kas pajautātu par detaļām.

Pirmajā kursā, protams, mums bija dažāda veida prakses, kurās mums parasti demokrātiski tika piedāvāta izvēle starp skriptu rakstÄ«Å”anu (galvenokārt MATLAB valodā) un dažādu augsti specializētu GUI izmantoÅ”anu (tādā ziņā, ka bez skriptu rakstÄ«Å”anas - simulācija modelÄ“Å”anas vides).

ā€œManifests iesācējiem programmētājiem no radniecÄ«gām specialitātēmā€ jeb kā es nonācu lÄ«dz Å”im dzÄ«ves punktam

Lieki piebilst, ka mēs, topoÅ”ie zinātņu maÄ£istri, sava jaunÄ«bas stulbuma dēļ izvairÄ«jāmies no koda rakstÄ«Å”anas kā uguns. Å eit, piemēram, ir Simulink no MathWorks: Å”eit ir bloki, Å”eit ir savienojumi, Å”eit ir visādi iestatÄ«jumi un slēdži.

Skats, kas ir iedzimts un saprotams cilvēkam, kurÅ” iepriekÅ” strādājis ķēžu projektÄ“Å”anā un sistēmu inženierijā!

ā€œManifests iesācējiem programmētājiem no radniecÄ«gām specialitātēmā€ jeb kā es nonācu lÄ«dz Å”im dzÄ«ves punktam
Avots: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Tā mums Ŕķita...

Realitāte

Viens no pirmā semestra praktiskiem darbiem bija OFDM signālu raiduztvērēja izstrāde priekÅ”meta ā€œModelÄ“Å”anas un optimizācijas metodesā€ ietvaros. Ideja ir ļoti veiksmÄ«ga: tehnoloÄ£ija joprojām ir aktuāla un diezgan populāra tās izmantoÅ”anas dēļ, piemēram, Wi-Fi un LTE/LTE-A tÄ«klos (OFDMA formā). Tas ir labākais, ko meistari var praktizēt savas prasmes telekomunikāciju sistēmu modelÄ“Å”anā.

ā€œManifests iesācējiem programmētājiem no radniecÄ«gām specialitātēmā€ jeb kā es nonācu lÄ«dz Å”im dzÄ«ves punktam

Un tagad mums tiek doti vairāki tehnisko specifikāciju varianti ar acīmredzami nepraktiskiem rāmja parametriem (lai nemeklētu risinājumu internetā), un mēs uzbrūkam jau pieminētajam Simulink... Un dabūjam pa galvu ar tējkannu. no realitātes:

  • Katrs bloks ir pilns ar daudziem nezināmiem parametriem, kurus ir biedējoÅ”i mainÄ«t pēc cepures.
  • Manipulācijas ar cipariem ir jātaisa, Ŕķiet, vienkārÅ”i, bet tomēr jāpabāž, nedod Dievs.
  • Katedrāles maŔīnas ievērojami palēninās no izmisÄ«gās GUI izmantoÅ”anas pat tad, kad pārlÅ«kojat pieejamo bloku bibliotēkas.
  • Lai kaut ko pabeigtu mājās, jums ir jābÅ«t tam paÅ”am Simulink. Un patiesÄ«bā nav alternatÄ«vu.

Jā, beigās mēs, protams, projektu pabeidzām, bet pabeidzām to ar skaļu atvieglojuma izelpu.

Pagāja kāds laiks, un mēs nonācām pie pirmā maÄ£istra kursa beigām. Mājas darbu apjoms, izmantojot GUI, sāka samazināties proporcionāli, pieaugot vācu priekÅ”metu Ä«patsvaram, lai gan tas vēl nebija sasniedzis paradigmas maiņas punktu. Daudzi no mums, tostarp es, pārvarot mÅ«su ievērojamo palielināŔanas amplitÅ«du, arvien vairāk savos zinātniskajos projektos izmantoja Matlab (kaut arÄ« rÄ«klodziņu veidā), nevis Ŕķietami pazÄ«stamo Simulink.

MÅ«su Å”aubu punkts bija viena otrā kursa studenta frāze (viņi tikko bija atgriezuÅ”ies Krievijā):

  • Aizmirstiet vismaz uz prakses laiku par Similink, MathCad un citiem LabView - pāri kalnam viss ir uzrakstÄ«ts MATLAB, izmantojot paÅ”u MatLab vai tā bezmaksas ā€œversijuā€ Octave.

Apgalvojums daļēji izrādījās patiess: Ilmenavā arī strīds par instrumentu izvēli netika līdz galam atrisināts. Tiesa, izvēle lielākoties bija starp MATLAB, Python un C.

Tajā paŔā dienā mani pārņēma dabisks satraukums: vai man nevajadzētu pārnest savu OFDM raidÄ«tāja modeļa daļu uz skriptu? Prieka pēc.

Un es ķēros pie darba.

Soli pa solim

Teorētisku aprēķinu vietā es vienkārÅ”i iedoÅ”u saiti uz Å”o lielisks raksts 2011 no tgx un uz slaidiem LTE fiziskais slānis profesori MiÅ”els-Tila (TU Ilmenau). Es domāju, ka ar to pietiks.

"Tātad," es domāju, "atkārtosim, ko mēs modelēsim?"
Mēs modelēsim OFDM rāmja ģenerators (OFDM kadru ģenerators).

Kas tajā ietvers:

  • informācijas simboli
  • pilota signāli
  • nulles (lÄ«dzstrāvas)

No kā mēs (vienkārŔības labad) abstrahējamies:

  • no cikliskā prefiksa modelÄ“Å”anas (ja zināt pamatus, to pievienot nebÅ«s grÅ«ti)

ā€œManifests iesācējiem programmētājiem no radniecÄ«gām specialitātēmā€ jeb kā es nonācu lÄ«dz Å”im dzÄ«ves punktam

Apskatāmā modeļa blokshēma. Mēs apstāsimies pie apgrieztā FFT (IFFT) bloka. Lai bilde būtu pilnīga, pārējo var turpināt katrs pats - apsolīju katedras skolotājiem kaut ko atstāt skolēniem.

Definēsim tos paÅ”i. vingrinājums:

  • fiksēts apakÅ”pārvadātāju skaits;
  • fiksēts rāmja garums;
  • mums jāpievieno viena nulle vidÅ« un nulles pāris kadra sākumā un beigās (kopā, 5 gabali);
  • informācijas simboli tiek modulēti, izmantojot M-PSK vai M-QAM, kur M ir modulācijas secÄ«ba.

Sāksim ar kodu.

Visu skriptu var lejupielādēt no saite.

Definēsim ievades parametrus:

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

Tagad mēs nosakām informācijas simbolu indeksus, pieņemot pieņēmumu, ka pilota signāliem noteikti jāiet pirms un/vai aiz nullēm:

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

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

Pēc tam pozīcijas var noteikt, izmantojot funkciju linspace, samazinot vērtības līdz mazākajam no tuvākajiem veselajiem skaitļiem:

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

Pievienosim nulles indeksus un sakārtosim:

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

Attiecīgi pilota signāla indeksi ir viss pārējais:

%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); 

Tagad sapratīsim pilota signālus.

Mums ir veidne (mainÄ«gs piloti), un pieņemsim, ka mēs vēlamies, lai Ŕīs veidnes piloti mÅ«su kadrā tiktu ievietoti secÄ«gi. Protams, to var izdarÄ«t cilpā. Vai arÄ« varat nedaudz paspēlēties ar matricām ā€“ par laimi MATLAB ļauj to izdarÄ«t ar pietiekamu komfortu.

Vispirms noteiksim, cik no Ŕīm veidnēm pilnÄ«bā iekļaujas kadrā:

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

Tālāk mēs veidojam vektoru, kas sastāv no mūsu veidnēm:

% 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

Un mēs definējam nelielu vektoru, kas satur tikai veidnes daļu - ā€œastiā€, kas pilnÄ«bā neietilpst kadrā:

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

Mēs iegūstam izmēģinājuma varoņus:

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

Pāriesim pie informācijas simboliem, proti, veidosim ziņojumu un modulēsim to:

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 

Viss ir gatavs! Rāmja salikŔana:

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

Jums vajadzētu iegÅ«t kaut ko lÄ«dzÄ«gu Å”im:

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

ā€” Svētlaime! ā€” apmierināti nodomāju un aizvēru portatÄ«vo datoru. Man vajadzēja pāris stundas, lai paveiktu visu: ieskaitot koda rakstÄ«Å”anu, dažu Matlab funkciju apgÅ«Å”anu un matemātisko triku pārdomāŔanu.

Kādus secinājumus es toreiz izdarīju?

Subjektīvs:

  • Koda rakstÄ«Å”ana ir patÄ«kama un lÄ«dzÄ«ga dzejai!
  • SkriptÄ“Å”ana ir ērtākā pētniecÄ«bas metode komunikācijas un signālu apstrādes jomā.

Mērķis:

  • Nav nepiecieÅ”ams Å”aut zvirbuļus no lielgabala (ja vien Ŕāds izglÄ«tojoÅ”s mērÄ·is, protams, nav tā vērts): izmantojot Simulink, mēs ķērāmies pie vienkārÅ”as problēmas risināŔanas ar izsmalcinātu rÄ«ku.
  • GUI ir laba, taču labāk ir saprast, kas atrodas ā€œzem pārsegaā€.

Un tagad, būdams tālu no studenta, es gribu teikt studentu brālībai sekojoŔo:

  • Turiet droÅ”u prātu!

Mēģiniet rakstÄ«t kodu, pat ja sākumā tas ir slikti. Ar programmÄ“Å”anu, tāpat kā ar jebkuru citu darbÄ«bu, grÅ«tākais ir sākums. Un labāk ir sākt agrāk: ja esat zinātnieks vai pat vienkārÅ”i tehniÄ·is, agrāk vai vēlāk Ŕī prasme jums bÅ«s nepiecieÅ”ama.

  • PieprasÄ«t!

Pieprasiet no skolotājiem un vadītājiem progresīvas pieejas un rīkus. Ja tas ir iespējams, protams...

  • Izveidot!

Kur gan citur labāk tikt pāri visām iesācēja sāpēm, ja ne izglÄ«tÄ«bas programmas ietvaros? Izveidojiet un uzlabojiet savas prasmes ā€“ atkal, jo ātrāk sākat, jo labāk.

TopoÅ”ie programmētāji no visām valstÄ«m, apvienojieties!

PS

Lai fiksētu savas tieŔās attiecÄ«bas ar studentiem, pievienoju atmiņā paliekoÅ”u 2017. gada foto ar diviem rektoriem: Pēteri Å arfu (labajā pusē) un Albertu Harisoviču Gilmutdinovu (kreisajā pusē).

ā€œManifests iesācējiem programmētājiem no radniecÄ«gām specialitātēmā€ jeb kā es nonācu lÄ«dz Å”im dzÄ«ves punktam

Bija vērts vismaz par Å”iem tērpiem programmu pabeigt! (joks)

Avots: www.habr.com

Pievieno komentāru