“Manifest seotud erialadelt alustavatele programmeerijatele” ehk kuidas ma elus selle punktini jõudsin

Minu tänane artikkel on valjuhäälsed mõtted inimeselt, kes peaaegu juhuslikult (ehkki loomulikult) programmeerimise teele läks.

Jah, ma saan aru, et minu kogemus on vaid minu kogemus, aga mulle tundub, et see sobib hästi üldisesse trendi. Pealegi puudutab allpool kirjeldatud kogemus rohkem teadustegevuse valdkonda, aga mis kuradit siin nalja pole – sellest võib väljaspool kasu olla.

“Manifest seotud erialadelt alustavatele programmeerijatele” ehk kuidas ma elus selle punktini jõudsin
Allikas: https://xkcd.com/664/

Üldiselt pühendatud kõigile praegustele õpilastele endisest õpilasest!

Ootused

Kui ma 2014. aastal infokommunikatsioonitehnoloogiate ja sidesüsteemide bakalaureuseõppe lõpetasin, ei teadnud ma programmeerimismaailmast peaaegu midagi. Jah, nagu paljud teised, võtsin ma esimesel aastal arvutiteaduse aine – aga issand, see oli minu esimesel aastal! Sellest on möödas terve igavik!

Üldiselt ei oodanud ma bakalaureuseõppest ja magistriõppesse astudes midagi erilist "Side ja signaalitöötlus" Saksa-Vene uute tehnoloogiate instituut.

Aga asjata...

Olime alles teine ​​vastuvõtt ja esimese tüübid pakkisid veel kohvreid kaugele Saksamaale (magistriõppe teisel kursusel kestab praktika kuus kuud). Ehk siis keegi lähiringkonnast polnud euroopaliku hariduse meetoditega veel tõsiselt kokku puutunud ja polnud kelleltki detaile küsida.

Esimesel kursusel oli meil muidugi mitmesuguseid praktikaid, kus tavaliselt pakuti meile demokraatlikult valida skriptide kirjutamise (peamiselt MATLAB-keeles) ja erinevate kõrgelt spetsialiseerunud GUI-de kasutamise vahel (selles mõttes, et ilma skripte kirjutamata – simulatsioon). modelleerimiskeskkonnad).

“Manifest seotud erialadelt alustavatele programmeerijatele” ehk kuidas ma elus selle punktini jõudsin

Ütlematagi selge, et meie, tulevased teadusmagistrid, vältisime oma nooruslikust rumalusest koodi kirjutamist nagu tuld. Siin on näiteks Simulink MathWorksist: siin on plokid, siin on ühendused, siin on igasugused seadistused ja lülitid.

Vaade, mis on omapärane ja arusaadav inimesele, kes on varem töötanud vooluringide projekteerimise ja süsteemitehnika alal!

“Manifest seotud erialadelt alustavatele programmeerijatele” ehk kuidas ma elus selle punktini jõudsin
Allikas: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Nii meile tundus...

Reaalsus

Esimese semestri üheks praktiliseks tööks oli OFDM signaali transiiveri väljatöötamine õppeaine “Modelleerimise ja optimeerimise meetodid” raames. Idee on väga edukas: tehnoloogia on endiselt aktuaalne ja üsna populaarne tänu selle kasutamisele näiteks Wi-Fi ja LTE/LTE-A võrkudes (OFDMA kujul). See on meistritele parim võimalus telekommunikatsioonisüsteemide modelleerimisel oma oskusi harjutada.

“Manifest seotud erialadelt alustavatele programmeerijatele” ehk kuidas ma elus selle punktini jõudsin

Ja nüüd antakse meile mitmeid ilmselgelt ebapraktiliste kaadriparameetritega tehniliste näitajate variante (et mitte Internetist lahendust otsida) ja põrutame juba mainitud Simulinkile... Ja saame teekannuga pähe. tegelikkusest:

  • Iga plokk on täis palju tundmatuid parameetreid, mida on hirmutav mütsi tilkhaaval muuta.
  • Manipulatsioonid numbritega tuleb ära teha, tundub, et lihtne, aga jumal hoidku tuleb ikka pabistada.
  • Katedraali masinad aeglustuvad märgatavalt GUI meeletu kasutamise tõttu isegi saadaolevate plokkide teekides surfamise etapis.
  • Kodus millegi lõpetamiseks peab sul olema sama Simulink. Ja tegelikult pole alternatiive.

Jah, lõpuks saime projekti muidugi valmis, aga lõpetasime selle valju kergendustundega.

Möödus mõni aeg ja jõudsime magistriõppe esimese aasta lõpuni. GUI-d kasutavate kodutööde maht hakkas proportsionaalselt vähenema saksakeelsete ainete osakaalu suurenemisega, kuigi paradigma muutuseni see veel ei jõudnud. Paljud meist, sealhulgas mina, ületades oma märkimisväärse ülesehitamise amplituudi, kasutasid oma teadusprojektides üha enam Matlabi (ehkki tööriistakastide kujul), mitte näiliselt tuttavat Simulinki.

Meie kahtluste punktiks oli ühe teise kursuse üliõpilase lause (nad olid selleks ajaks just Venemaale naasnud):

  • Unustage vähemalt praktika ajaks Similink, MathCad ja muu LabView - üle mäe on kõik MATLABis kirjas, kasutades MatLabi ennast või selle tasuta “versiooni” Octave.

Väide osutus osaliselt tõeks: Ilmenaus jäi ka vaidlus tööriistade valiku üle lõplikult lahendamata. Tõsi, valik oli valdavalt MATLABi, Pythoni ja C vahel.

Samal päeval valdas mind loomulik elevus: kas ma ei peaks oma osa OFDM-saatja mudelist skriptitud kujule üle kandma? Lihtsalt lõbu pärast.

Ja ma asusin tööle.

Samm sammu haaval

Teoreetiliste arvutuste asemel annan lihtsalt selle lingi suurepärane artikkel 2011 aastast tgx ja slaididel LTE füüsiline kiht professorid Michel-Tila (TLÜ Ilmenau). Ma arvan, et sellest piisab.

"Nii," mõtlesin, "kordame, mida me modelleerima hakkame?"
Me modelleerime OFDM raami generaator (OFDM kaadri generaator).

Mida see sisaldab:

  • teabe sümbolid
  • piloodi signaalid
  • nullid (DC)

Millest (lihtsuse huvides) abstraheerime:

  • tsüklilise prefiksi modelleerimisest (kui teate põhitõdesid, pole selle lisamine keeruline)

“Manifest seotud erialadelt alustavatele programmeerijatele” ehk kuidas ma elus selle punktini jõudsin

Vaadeldava mudeli plokkskeem. Peatume FFT (IFFT) pöördploki juures. Pildi täiendamiseks võib igaüks ise ülejäänut jätkata - lubasin osakonna õpetajatele õpilastele midagi jätta.

Määratleme need enda jaoks. harjutus:

  • fikseeritud arv alamkandjaid;
  • fikseeritud raami pikkus;
  • peame lisama ühe nulli keskele ja paar nulli kaadri algusesse ja lõppu (kokku, 5 tükki);
  • infosümboleid moduleeritakse M-PSK või M-QAM abil, kus M on modulatsiooni järjekord.

Alustame koodiga.

Kogu skripti saab alla laadida saidilt link.

Määratleme sisendparameetrid:

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

Nüüd määrame teabesümbolite indeksid, nõustudes eeldusega, et pilootsignaalid peavad tingimata minema enne ja/või pärast nulle:

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

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

Seejärel saab funktsiooni abil positsioone määrata linspace, vähendades väärtusi lähimatest täisarvudest väikseimateni:

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

Lisame sellele nullide indeksid ja sorteerime:

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

Seega on pilootsignaali indeksid kõik muu:

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

Nüüd mõistame pilootsignaale.

Meil on mall (muutuja piloodid) ja oletame, et tahame, et selle malli pilootfailid sisestataks meie kaadrisse järjestikku. Muidugi saab seda teha tsüklina. Või võib ka maatriksitega veidi nipet-näpet mängida – õnneks võimaldab MATLAB seda piisava mugavusega teha.

Esmalt määrame kindlaks, kui palju neist mallidest täielikult kaadrisse mahub:

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

Järgmisena moodustame vektori, mis koosneb meie mallidest:

% 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

Ja määratleme väikese vektori, mis sisaldab ainult osa mallist - "saba", mis ei mahu täielikult kaadrisse:

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

Saame piloottegelased:

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

Liigume edasi infosümbolite juurde, nimelt moodustame sõnumi ja moduleerime seda:

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 

Kõik on valmis! Raami kokkupanek:

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

Peaksite saama midagi sellist:

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

"Õndsus!" — mõtlesin rahulolevalt ja sulgesin sülearvuti. Mul kulus paar tundi kõige tegemiseks: sealhulgas koodi kirjutamiseks, mõne Matlabi funktsiooni õppimiseks ja matemaatiliste nippide läbimõtlemiseks.

Mis järeldused ma siis tegin?

Subjektiivne:

  • Koodi kirjutamine on meeldiv ja sarnane luulega!
  • Skriptimine on side ja signaalitöötluse valdkonnas kõige mugavam uurimismeetod.

Objektiivne:

  • Varblasi kahurist tulistada pole vaja (kui selline hariv eesmärk muidugi ei tasu): Simulinki kasutades võtsime ette lihtsa probleemi lahendamise keeruka tööriistaga.
  • GUI on hea, kuid kapoti all olevast on parem aru saada.

Ja nüüd, olles kaugel õpilasest, tahan öelda üliõpilaste vennaskonnale järgmist:

  • Tee seda!

Proovige koodi kirjutada, isegi kui see on alguses halb. Programmeerimisel, nagu iga teise tegevuse puhul, on kõige raskem algus. Ja parem on alustada varem: kui olete teadlane või isegi lihtsalt tehnik, vajate varem või hiljem seda oskust.

  • Nõudmine!

Nõudke õpetajatelt ja juhendajatelt progressiivseid lähenemisviise ja tööriistu. Kui see on muidugi võimalik...

  • Loo!

Kus mujal on parem kõigist algaja valudest üle saada, kui mitte haridusprogrammi raames? Looge ja lihvige oma oskusi – jällegi, mida varem alustate, seda parem.

Püüdlikud programmeerijad kõikidest riikidest, ühinege!

PS

Et jäädvustada oma vahetu suhe üliõpilastega, lisan meeldejääva foto 2017. aastast kahe rektoriga: Peter Scharff (paremal) ja Albert Kharisovich Gilmutdinov (vasakul).

“Manifest seotud erialadelt alustavatele programmeerijatele” ehk kuidas ma elus selle punktini jõudsin

Vähemalt nende kostüümide puhul tasus programm lõpetada! (nali)

Allikas: www.habr.com

Lisa kommentaar