"Manifest për programues fillestarë nga specialitete të ngjashme" ose si arrita në këtë pikë të jetës

Artikulli im sot është mendime me zë të lartë nga një person që mori rrugën e programimit pothuajse rastësisht (megjithëse natyrshëm).

Po, e kuptoj që përvoja ime është vetëm përvoja ime, por më duket se përshtatet mirë me trendin e përgjithshëm. Për më tepër, përvoja e përshkruar më poshtë lidhet më shumë me fushën e veprimtarisë shkencore, por ajo që dreqin nuk është shaka - mund të jetë e dobishme jashtë.

"Manifest për programues fillestarë nga specialitete të ngjashme" ose si arrita në këtë pikë të jetës
Burimi: https://xkcd.com/664/

Në përgjithësi, dedikuar për të gjithë studentët aktualë nga një ish-student!

pritjet

Kur përfundova diplomën time bachelor në Teknologjitë e Infokomunikacionit dhe Sistemet e Komunikimit në vitin 2014, nuk dija pothuajse asgjë për botën e programimit. Po, si shumë të tjerë, unë mora lëndën “Shkenca Kompjuterike” në vitin tim të parë - por, Zot, ishte në vitin e parë! Ka qenë një përjetësi!

Në përgjithësi, nuk prisja asgjë veçanërisht të ndryshme nga një diplomë bachelor, dhe kur hyra në programin master "Komunikimi dhe përpunimi i sinjalit" Instituti Gjermano-Rus i Teknologjive të Reja.

Por më kot...

Ne ishim vetëm marrja e dytë, dhe djemtë nga i pari ishin ende duke paketuar valixhet për në Gjermaninë e largët (prazhi zgjat gjashtë muaj në vitin e dytë të masterit). Me fjalë të tjera, askush nga rrethi i afërt ende nuk kishte hasur seriozisht në metodat e edukimit evropian dhe nuk kishte kush të pyeste për detajet.

Në vitin tonë të parë, natyrisht, ne kishim lloje të ndryshme praktikash, në të cilat zakonisht na ofrohej në mënyrë demokratike një zgjedhje midis shkrimit të skripteve (kryesisht në gjuhën MATLAB) dhe përdorimit të GUI-ve të ndryshme shumë të specializuara (në kuptimin që pa shkruar skripta - simulim mjediset e modelimit).

"Manifest për programues fillestarë nga specialitete të ngjashme" ose si arrita në këtë pikë të jetës

Eshtë e panevojshme të thuhet se ne, masterat e ardhshëm të shkencave, nga marrëzia jonë rinore, shmangëm shkrimin e kodit si zjarr. Këtu, për shembull, është Simulink nga MathWorks: këtu janë blloqet, këtu janë lidhjet, këtu janë të gjitha llojet e cilësimeve dhe çelsave.

Një pamje që është vendase dhe e kuptueshme për një person që ka punuar më parë në dizajnimin e qarkut dhe inxhinierinë e sistemeve!

"Manifest për programues fillestarë nga specialitete të ngjashme" ose si arrita në këtë pikë të jetës
Burimi: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Kështu na dukej ...

realitet

Një nga punët praktike të semestrit të parë ishte zhvillimi i një transmetuesi të sinjalit OFDM si pjesë e lëndës “Metodat për Modelim dhe Optimizim”. Ideja është shumë e suksesshme: teknologjia është ende e rëndësishme dhe mjaft e njohur për shkak të përdorimit të saj, për shembull, në rrjetet Wi-Fi dhe LTE/LTE-A (në formën e OFDMA). Kjo është gjëja më e mirë që mjeshtrit të praktikojnë aftësitë e tyre në modelimin e sistemeve të telekomit.

"Manifest për programues fillestarë nga specialitete të ngjashme" ose si arrita në këtë pikë të jetës

Dhe tani na jepen disa opsione të specifikimeve teknike me parametra kornizë dukshëm jopraktike (për të mos kërkuar një zgjidhje në internet), dhe ne hidhemi në Simulinkun e përmendur tashmë ... Dhe goditemi në kokë me një çajnik e realitetit:

  • Çdo bllok është i mbushur me shumë parametra të panjohur, të cilët janë të frikshëm për t'u ndryshuar me rënien e kapelës.
  • Manipulimet me numrat duhen bërë, me sa duket, të thjeshta, por ju duhet të bëni bujë, Zoti na ruajt.
  • Makinat e katedrales ngadalësohen dukshëm nga përdorimi i furishëm i GUI, madje edhe në fazën e shfletimit nëpër bibliotekat e blloqeve të disponueshme.
  • Për të përfunduar diçka në shtëpi, duhet të keni të njëjtin Simulink. Dhe, në fakt, nuk ka alternativa.

Po, në fund, natyrisht, ne e përfunduam projektin, por e përfunduam atë me një frymëzim të lartë lehtësimi.

Kaloi pak kohë dhe arritëm në fund të vitit të parë të masterit. Sasia e detyrave të shtëpisë duke përdorur GUI filloi të bjerë proporcionalisht me rritjen e përqindjes së lëndëve gjermane, megjithëse nuk kishte arritur ende pikën e një ndryshimi paradigme. Shumë prej nesh, duke përfshirë edhe mua, duke kapërcyer amplituda tonë të konsiderueshme për të ndërtuar, gjithnjë e më shumë përdorim Matlab në projektet tona shkencore (megjithëse në formën e Toolboxes), dhe jo Simulink në dukje të njohur.

Pika në dyshimet tona ishte fraza e një prej studentëve të vitit të dytë (ata sapo ishin kthyer në Rusi në atë kohë):

  • Harrojeni, të paktën për kohëzgjatjen e praktikës, për Similink, MathCad dhe LabView të tjera - mbi kodër gjithçka është shkruar në MATLAB, duke përdorur vetë MatLab ose "versionin" e tij falas Octave.

Deklarata doli të ishte pjesërisht e vërtetë: në Ilmenau, mosmarrëveshja për zgjedhjen e mjeteve gjithashtu nuk u zgjidh plotësisht. Vërtetë, zgjedhja ishte kryesisht midis MATLAB, Python dhe C.

Në të njëjtën ditë, më përfshiu një eksitim i natyrshëm: a nuk duhet ta transferoj pjesën time të modelit të transmetuesit OFDM në një formë të shkruar? Vetëm për argëtim.

Dhe ia nisa punës.

Hap pas hapi

Në vend të llogaritjeve teorike, unë thjesht do të jap një lidhje me këtë artikull i shkëlqyer 2011 nga tgx dhe në sllajde Shtresa fizike LTE profesorët Mishel-Tila (TU Ilmenau). Unë mendoj se kjo do të mjaftojë.

"Pra," mendova, "le të përsërisim, çfarë do të modelojmë?"
Ne do të modelojmë Gjenerator i kornizës OFDM (gjenerator i kornizës OFDM).

Çfarë do të përfshijë:

  • simbolet e informacionit
  • sinjale pilot
  • zero (DC)

Nga çfarë abstraktojmë (për hir të thjeshtësisë):

  • nga modelimi i një prefiksi ciklik (nëse i dini bazat, shtimi i tij nuk do të jetë i vështirë)

"Manifest për programues fillestarë nga specialitete të ngjashme" ose si arrita në këtë pikë të jetës

Bllok diagrami i modelit në shqyrtim. Ne do të ndalemi në bllokun e kundërt FFT (IFFT). Për të plotësuar pamjen, të gjithë mund të vazhdojnë vetë pjesën tjetër - u premtova mësuesve të departamentit që të linin diçka për studentët.

Le t'i përcaktojmë ato për veten tonë. ushtrim:

  • numri fiks i nën-bartësve;
  • gjatësi fikse e kornizës;
  • duhet të shtojmë një zero në mes dhe një palë zero në fillim dhe në fund të kornizës (gjithsej, 5 copë);
  • simbolet e informacionit modulohen duke përdorur M-PSK ose M-QAM, ku M është rendi i modulimit.

Le të fillojmë me kodin.

I gjithë skripti mund të shkarkohet nga lidhje.

Le të përcaktojmë parametrat e hyrjes:

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

Tani ne përcaktojmë indekset e simboleve të informacionit, duke pranuar premisën që sinjalet pilot duhet të shkojnë domosdoshmërisht para dhe/ose pas zerove:

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

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

Pastaj pozicionet mund të përcaktohen duke përdorur funksionin linspace, duke reduktuar vlerat në numrin më të vogël të numrave të plotë më të afërt:

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

Le të shtojmë indekset e zerove në këtë dhe të renditim:

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

Prandaj, indekset e sinjalit pilot janë gjithçka tjetër:

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

Tani le të kuptojmë sinjalet pilot.

Ne kemi një shabllon (ndryshues Pilotët), dhe le të themi se duam që pilotët nga ky shabllon të futen në kornizën tonë në mënyrë sekuenciale. Sigurisht, kjo mund të bëhet në një lak. Ose mund të luani pak të ndërlikuar me matricat - për fat të mirë, MATLAB ju lejon ta bëni këtë me komoditet të mjaftueshëm.

Së pari, le të përcaktojmë se sa nga këto shabllone përshtaten plotësisht në kornizë:

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

Më pas, ne formojmë një vektor që përbëhet nga shabllonet tona:

% 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

Dhe ne përcaktojmë një vektor të vogël që përmban vetëm një pjesë të shabllonit - "bishtin", i cili nuk përshtatet plotësisht në kornizë:

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

Ne marrim personazhe pilot:

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

Le të kalojmë te simbolet e informacionit, domethënë, ne do të formojmë një mesazh dhe do ta modulojmë atë:

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 

Gjithçka është gati! Montimi i kornizës:

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

Ju duhet të merrni diçka të tillë:

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

"Lumturi!" — Mendova i kënaqur dhe mbylla laptopin. M'u deshën disa orë për të bërë gjithçka: duke përfshirë shkrimin e kodit, mësimin e disa funksioneve të Matlab dhe të menduarit përmes trukeve matematikore.

Çfarë përfundimesh nxora atëherë?

Subjektive:

  • Shkrimi i kodit është i këndshëm dhe i ngjashëm me poezinë!
  • Skriptimi është metoda më e përshtatshme e kërkimit për fushën e Komunikimit dhe Përpunimit të Sinjalit.

Objektiv:

  • Nuk ka nevojë të qëlloni harabela nga një top (përveç nëse një qëllim i tillë arsimor, natyrisht, ia vlen): duke përdorur Simulink, ne morëm përsipër zgjidhjen e një problemi të thjeshtë me një mjet të sofistikuar.
  • GUI është i mirë, por është më mirë të kuptosh se çfarë përmban "nën kapuç".

Dhe tani, duke qenë larg të qenit student, dua t'i them sa vijon vëllazërisë studentore:

  • Shkoni për të!

Provoni të shkruani kodin, edhe nëse në fillim është i keq. Me programimin, si me çdo aktivitet tjetër, pjesa më e vështirë është fillimi. Dhe është më mirë të filloni më herët: nëse jeni një shkencëtar apo edhe thjesht një teknik, herët a vonë do t'ju duhet kjo aftësi.

  • Kërkoni!

Kërkoni qasje dhe mjete progresive nga mësuesit dhe mbikëqyrësit. Nëse kjo është e mundur, sigurisht ...

  • Krijo!

Ku tjetër është më mirë të kapërceni të gjitha plagët e një fillestari, nëse jo në kuadrin e një programi arsimor? Krijoni dhe përmirësoni aftësitë tuaja - përsëri, sa më shpejt të filloni, aq më mirë.

Programues aspirantë nga të gjitha vendet, bashkohuni!

PS

Për të regjistruar marrëdhënien time të drejtpërdrejtë me studentët, po bashkangjit një foto të paharrueshme të vitit 2017 me dy rektorë: Peter Scharff (në të djathtë) dhe Albert Kharisovich Gilmutdinov (në të majtë).

"Manifest për programues fillestarë nga specialitete të ngjashme" ose si arrita në këtë pikë të jetës

Ia vlente te mbaroje programin te pakten per keto kostume! (bëj shaka)

Burimi: www.habr.com

Shto një koment