„Manifestas pradedantiesiems programuotojams iš susijusių specialybių“ arba kaip aš atsidūriau iki šio gyvenimo taško

Mano šiandieninis straipsnis yra garsiai išreikštos mintys iš žmogaus, kuris programavimo keliu pasuko beveik atsitiktinai (nors ir natūraliai).

Taip, aš suprantu, kad mano patirtis yra tik mano patirtis, bet man atrodo, kad ji puikiai dera į bendrą tendenciją. Be to, toliau aprašyta patirtis labiau susijusi su mokslinės veiklos sritimi, bet ko velnių, nejuokaujame – ji gali būti naudinga ir už jos ribų.

„Manifestas pradedantiesiems programuotojams iš susijusių specialybių“ arba kaip aš atsidūriau iki šio gyvenimo taško
Šaltinis: https://xkcd.com/664/

Apskritai, skirta visiems dabartiniams studentams iš buvusio studento!

Lūkesčiai

Kai 2014 m. baigiau Infokomunikacijų technologijų ir ryšių sistemų bakalauro studijas, beveik nieko nežinojau apie programavimo pasaulį. Taip, kaip ir daugelis kitų, aš mokiausi „Kompiuterijos“ dalyką pirmaisiais metais, bet, Viešpatie, tai buvo mano pirmaisiais metais! Tai praėjo amžinybė!

Apskritai nieko ypatingo nesitikėjau iš bakalauro, o įstojau į magistrantūrą "Ryšis ir signalų apdorojimas" Vokietijos ir Rusijos naujųjų technologijų institutas.

Bet veltui...

Mes buvome tik antrasis, o vaikinai iš pirmos vis dar kraunasi lagaminus į tolimąją Vokietiją (antraisiais magistrantūros metais praktika trunka šešis mėnesius). Kitaip tariant, niekas iš artimiausių ratų dar nebuvo rimtai susidūręs su europietiško ugdymo metodais, nebuvo kam pasiteirauti smulkmenų.

Žinoma, pirmaisiais metais turėjome įvairių praktikų, kuriose dažniausiai demokratiškai buvo siūloma rinktis tarp scenarijų rašymo (daugiausia MATLAB kalba) ir įvairių labai specializuotų GUI (ta prasme, kad be scenarijų rašymo – modeliavimas). modeliavimo aplinkas).

„Manifestas pradedantiesiems programuotojams iš susijusių specialybių“ arba kaip aš atsidūriau iki šio gyvenimo taško

Savaime suprantama, mes, būsimieji mokslų magistrai, iš savo jaunatviško kvailumo vengėme kodą rašyti kaip ugnies. Štai, pavyzdžiui, Simulink iš MathWorks: čia yra blokai, čia yra jungtys, čia yra visokie nustatymai ir jungikliai.

Vaizdas, kuris yra gimtasis ir suprantamas žmogui, kuris anksčiau dirbo grandinių projektavimo ir sistemų inžinerijos srityje!

„Manifestas pradedantiesiems programuotojams iš susijusių specialybių“ arba kaip aš atsidūriau iki šio gyvenimo taško
Šaltinis: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Taip mums atrodė...

Realybė

Vienas iš pirmojo semestro praktinių darbų buvo OFDM signalo siųstuvo-imtuvo sukūrimas pagal dalyką „Modeliavimo ir optimizavimo metodai“. Idėja labai sėkminga: technologija vis dar aktuali ir gana populiari dėl jos naudojimo, pavyzdžiui, Wi-Fi ir LTE/LTE-A tinkluose (OFDMA pavidalu). Tai geriausia meistrams praktikuoti savo telekomunikacijų sistemų modeliavimo įgūdžius.

„Manifestas pradedantiesiems programuotojams iš susijusių specialybių“ arba kaip aš atsidūriau iki šio gyvenimo taško

O dabar mums pateikiami keli techninių specifikacijų variantai su akivaizdžiai nepraktiškais rėmo parametrais (kad neieškotume sprendimo internete), o mes puolame į jau minėtą Simulink... Ir mums trenkia į galvą arbatinuku. tikrovės:

  • Kiekvienas blokas yra kupinas daug nežinomų parametrų, kuriuos baisu pakeisti vos nuleidus skrybėlę.
  • Manipuliacijas su skaičiais reikia daryti, rodos, paprastos, bet vis tiek reikia papurtyti, neduok Dieve.
  • Katedros mašinos pastebimai sulėtėja dėl pašėlusio GUI naudojimo net naršant po turimų blokų bibliotekas.
  • Norint ką nors baigti namuose, reikia turėti tą patį Simulink. Ir, tiesą sakant, alternatyvų nėra.

Taip, galiausiai mes, žinoma, užbaigėme projektą, bet užbaigėme jį garsiai iškvėpdami palengvėjimą.

Praėjo šiek tiek laiko, ir priėjome pirmųjų magistrantūros metų pabaigą. Namų darbų, naudojant GUI, kiekis ėmė mažėti proporcingai didėjant vokiečių mokinių daliai, nors jis dar nebuvo pasiekęs paradigmos poslinkio. Daugelis iš mūsų, įskaitant mane, įveikę didelę kūrimo amplitudę, vis dažniau savo moksliniuose projektuose naudojome Matlab (nors ir įrankių dėžių pavidalu), o ne iš pažiūros pažįstamą Simulink.

Mūsų abejonių taškas buvo vieno iš antro kurso studentų (tuo metu jie buvo ką tik grįžę į Rusiją) frazė:

  • Pamirškite bent jau stažuotės metu apie Similink, MathCad ir kitus LabView - už kalno viskas parašyta MATLAB, naudojant patį MatLab arba jo nemokamą „versiją“ Octave.

Teiginys iš dalies pasitvirtino: Ilmenau ginčas dėl įrankių pasirinkimo taip pat nebuvo iki galo išspręstas. Tiesa, dažniausiai buvo pasirinkta tarp MATLAB, Python ir C.

Tą pačią dieną mane apėmė natūralus jaudulys: ar neturėčiau savo OFDM siųstuvo modelio dalies perkelti į scenarijų? Dėl linksmumo.

Ir aš pradėjau dirbti.

Žingsnis po žingsnio

Vietoj teorinių skaičiavimų tiesiog pateiksiu nuorodą į tai puikus straipsnis 2011 nuo tgx ir skaidrėse LTE fizinis sluoksnis profesoriai Michelis-Tila (TU Ilmenau). Manau, kad šito užteks.

„Taigi, – pagalvojau, – pakartokime, ką modeliuosime?
Mes modeliuosime OFDM rėmo generatorius (OFDM rėmo generatorius).

Kas bus įtraukta:

  • informaciniai simboliai
  • piloto signalai
  • nuliai (DC)

Iš ko (paprastumo dėlei) abstrahuojame:

  • nuo ciklinio priešdėlio modeliavimo (jei žinote pagrindus, jį pridėti nebus sunku)

„Manifestas pradedantiesiems programuotojams iš susijusių specialybių“ arba kaip aš atsidūriau iki šio gyvenimo taško

Nagrinėjamo modelio blokinė schema. Sustosime ties atvirkštiniu FFT (IFFT) bloku. Kad paveikslas būtų užbaigtas, poilsį kiekvienas gali tęsti pats – katedros dėstytojams pažadėjau ką nors palikti mokiniams.

Apibrėžkime juos patys. pratimas:

  • fiksuotas antrinių nešėjų skaičius;
  • fiksuotas rėmo ilgis;
  • turime pridėti vieną nulį viduryje ir porą nulių rėmelio pradžioje ir pabaigoje (iš viso, 5 vnt.);
  • informacijos simboliai moduliuojami naudojant M-PSK arba M-QAM, kur M yra moduliavimo tvarka.

Pradėkime nuo kodo.

Visą scenarijų galima atsisiųsti iš nuoroda.

Apibrėžkime įvesties 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

Dabar nustatome informacinių simbolių indeksus, priimdami prielaidą, kad pilotiniai signalai būtinai turi būti prieš ir (arba) po nulių:

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

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

Tada padėtis gali būti nustatytos naudojant funkciją linspace, sumažinant reikšmes iki mažiausio iš artimiausių sveikųjų skaičių:

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

Pridėkime prie to nulių indeksus ir rūšiuokime:

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

Atitinkamai, bandomojo signalo indeksai yra visa kita:

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

Dabar supraskime piloto signalus.

Turime šabloną (kintamąjį pilotai), ir tarkime, kad norime, kad šio šablono pilotai būtų įterpti į mūsų kadrą nuosekliai. Žinoma, tai gali būti padaryta kilpoje. Arba galite šiek tiek pažaisti su matricomis – laimei, MATLAB leidžia tai padaryti pakankamai patogiai.

Pirmiausia nustatykime, kiek iš šių šablonų visiškai telpa į rėmelį:

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

Tada sudarome vektorių, kurį sudaro mūsų šablonai:

% 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

Ir mes apibrėžiame nedidelį vektorių, kuriame yra tik šablono dalis - „uodega“, kuri visiškai netelpa į kadrą:

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

Gauname bandomuosius personažus:

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

Pereikime prie informacinių simbolių, būtent, suformuosime pranešimą ir jį moduliuosime:

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 

Viskas paruošta! Rėmo surinkimas:

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

Turėtumėte gauti kažką panašaus:

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

— Palaima! – patenkintas pagalvojau ir uždariau nešiojamąjį kompiuterį. Man prireikė poros valandų, kol padariau viską: įskaitant kodo rašymą, kai kurių Matlab funkcijų išmokimą ir matematinių gudrybių apmąstymą.

Kokias išvadas tada padariau?

Subjektyvus:

  • Rašyti kodą malonu ir panašu į poeziją!
  • Scenarijų sudarymas yra patogiausias tyrimo metodas komunikacijos ir signalų apdorojimo srityje.

Tikslas:

  • Nereikia šaudyti į žvirblius iš patrankos (nebent toks edukacinis tikslas, žinoma, to vertas): naudodamiesi Simulink ėmėmės paprastos problemos sprendimo sudėtingu įrankiu.
  • GUI yra gera, tačiau geriau suprasti, kas yra „po gaubtu“.

Ir dabar, būdamas toli gražu ne studentas, studentų brolijai noriu pasakyti štai ką:

  • Būk drąsus!

Pabandykite parašyti kodą, net jei iš pradžių jis blogas. Programuojant, kaip ir bet kurioje kitoje veikloje, sunkiausia yra pradžia. Ir geriau pradėti anksčiau: jei esate mokslininkas ar net tiesiog technikos specialistas, anksčiau ar vėliau jums prireiks šio įgūdžio.

  • Paklausa!

Reikalaukite pažangių metodų ir priemonių iš mokytojų ir vadovų. Jei tai įmanoma, žinoma...

  • Sukurti!

Kur dar geriau įveikti visas pradedančiojo nuoskaudas, jei ne edukacinės programos rėmuose? Kurkite ir tobulinkite savo įgūdžius – vėlgi, kuo anksčiau pradėsite, tuo geriau.

Trokštantys programuotojai iš visų šalių, vienykitės!

PS

Siekdamas užfiksuoti savo tiesioginį ryšį su studentais, pridedu įsimintiną 2017 metų nuotrauką su dviem rektoriais: Peteriu Scharffu (dešinėje) ir Albertu Kharisovičiumi Gilmutdinovu (kairėje).

„Manifestas pradedantiesiems programuotojams iš susijusių specialybių“ arba kaip aš atsidūriau iki šio gyvenimo taško

Verta baigti programą bent jau dėl šių kostiumų! (juokauju)

Šaltinis: www.habr.com

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