“Hasitako programatzaileentzako manifestua erlazionatutako espezialitateetatik” edo nola iritsi naizen bizitzako puntu honetara

Nire gaurko artikulua ia ustekabean (naturalki bada ere) programazioaren bidea hartu zuen pertsona baten gogoetak dira.

Bai, ulertzen dut nire esperientzia nire esperientzia besterik ez dela, baina joera orokorrean ondo sartzen dela iruditzen zait. Gainera, behean deskribatzen den esperientzia jarduera zientifikoaren eremuarekin erlazionatzen da gehiago, baina zer demontre ez den txantxetan ari: kanpoan erabilgarria izan daiteke.

“Hasitako programatzaileentzako manifestua erlazionatutako espezialitateetatik” edo nola iritsi naizen bizitzako puntu honetara
Iturria: https://xkcd.com/664/

Oro har, ikasle ohi baten egungo ikasle guztiei eskainia!

itxaropenak

2014an Infokomunikazio Teknologietan eta Komunikazio Sistemetan lizentziatura amaitu nuenean, ez nekien ia ezer programazioaren munduari buruz. Bai, beste askok bezala, “Informatika” irakasgaia egin nuen nire lehenengo urtean - baina, Jauna, nire lehenengo urtean izan zen! Eternitate bat izan da!

Orokorrean, ez nuen ezer berezirik espero lizentziaturatik, eta masterrean sartu nintzenean "Komunikazioa eta seinaleen tratamendua" Teknologia Berrien Alemania-Errusiar Institutua.

Baina alferrik...

Bigarren sarrera baino ez ginen, eta lehenengoko mutilak oraindik ere maletak prestatzen ari ziren Alemania urrunerako (praktikak sei hilabete behar ditu masterreko bigarren urtean). Beste era batera esanda, zirkulu hurbileko inork ez zituen oraindik seriotasunez topatu Europako hezkuntzaren metodoekin, eta ez zegoen inor xehetasunez galdetzeko.

Gure lehen urtean, jakina, hainbat praktika mota izan genituen, eta horietan normalean demokratikoki gidoiak idaztea (batez ere MATLAB lengoaian) eta hainbat GUI oso espezializatuak erabiltzea (gidoiak idatzi gabe - simulazioa) aukera ematen ziguten. modelaketa inguruneak).

“Hasitako programatzaileentzako manifestua erlazionatutako espezialitateetatik” edo nola iritsi naizen bizitzako puntu honetara

Esan beharrik ez dugu, etorkizuneko Zientzien Maisuok, gure gaztetako ergelkeriagatik, sua bezalako kodea idaztea saihestu genuen. Hona hemen, adibidez, MathWorks-eko Simulink: hona hemen blokeak, hona hemen konexioak, hemen mota guztietako ezarpenak eta etengailuak.

Aurretik zirkuituen diseinuan eta sistemen ingeniaritzan lan egin duen pertsona batentzat jatorrizkoa eta ulergarria den ikuspegia!

“Hasitako programatzaileentzako manifestua erlazionatutako espezialitateetatik” edo nola iritsi naizen bizitzako puntu honetara
Iturria: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Beraz, iruditu zitzaigun...

errealitate

Lehenengo seihilekoko lan praktikoetako bat OFDM seinale-transceptor bat garatzea izan zen, “Modelizazio eta Optimizaziorako Metodoak” irakasgaiaren barruan. Ideia oso arrakastatsua da: teknologia oraindik garrantzitsua eta nahiko ezaguna da erabileragatik, adibidez, Wi-Fi eta LTE/LTE-A sareetan (OFDMA moduan). Hau da maisuek telekomunikazio sistemen modelizazioan trebetasunak lantzeko gauzarik onena.

“Hasitako programatzaileentzako manifestua erlazionatutako espezialitateetatik” edo nola iritsi naizen bizitzako puntu honetara

Eta orain zehaztapen teknikoen hainbat aukera ematen dizkigute, jakina denez praktikoa ez den marko-parametroekin (Interneten konponbiderik ez bilatzeko), eta dagoeneko aipaturiko Simulink-era jo dugu... Eta buruan kolpatzen dugu teontzi batekin. errealitatea:

  • Bloke bakoitzak parametro ezezagun asko ditu, eta horiek beldurgarriak dira txanoaren tantatik aldatzea.
  • Zenbakiekin manipulazioak egin behar dira, dirudienez, sinpleak, baina oraindik zalaparta egin behar duzu, Jainkoak ez dezala.
  • Katedraleko makinak nabarmen moteltzen dira GUIaren erabilera frenetika, baita eskuragarri dauden blokeen liburutegietan nabigatzeko fasean ere.
  • Etxean zerbait amaitzeko, Simulink bera izan behar duzu. Eta, egia esan, alternatibarik ez.

Bai, azkenean, noski, proiektua burutu genuen, baina erliebe arnasa ozen batekin osatu genuen.

Denbora pixka bat pasa zen, eta masterreko lehen kurtsoa amaitzera iritsi ginen. GUI erabiliz etxeko lanen kopurua proportzionalki murrizten hasi zen alemaniar irakasgaien kuota handitzean, nahiz eta oraindik paradigma-aldaketara iritsi ez. Gutako askok, ni barne, eraikitzeko dugun anplitude nabarmena gaindituz, gero eta gehiago erabiltzen genuen Matlab gure proiektu zientifikoetan (tresna-kutxetan bada ere), eta ez itxuraz ezaguna den Simulink.

Gure zalantzen puntua bigarren mailako ikasle baten esaldia zen (orduan Errusiara itzuli berriak ziren):

  • Ahaztu, praktikak irauten duen bitartean behintzat, Similink, MathCad eta beste LabView-ri buruz - muino gainean dena MATLABen idatzita dago, MatLab bera edo bere doako "bertsioa" Octave erabiliz.

Adierazpena neurri batean egia izan zen: Ilmenaun, tresnak aukeratzeko auzia ere ez zen guztiz konpondu. Egia da, gehienbat MATLAB, Python eta C artean izan zen aukera.

Egun berean, zirrara natural batek hartu ninduen: ez al dut OFDM transmisore-ereduaren nire zatia gidoi forma batera transferitu behar? Dibertitzeko besterik ez.

Eta lanari ekin nion.

Urratsez urrats

Kalkulu teorikoen ordez, esteka bat emango dut artikulu bikaina 2011tik aurrera tgx eta diapositibetan LTE geruza fisikoa irakasleak Michel-Tila (TU Ilmenau). Hau nahikoa izango dela uste dut.

"Beraz", pentsatu nuen, "errepikatu dezagun, zer modelatuko dugu?"
Modelatu egingo dugu OFDM fotograma-sorgailua (OFDM fotograma-sorgailua).

Zer barne hartuko du:

  • informazio-ikurrak
  • pilotu-seinaleak
  • zeroak (DC)

Zertatik (erraztasunaren mesedetan) abstrakzioa egiten dugu:

  • aurrizki zikliko bat modelatzetik (oinarriak ezagutzen badituzu, gehitzea ez da zaila izango)

“Hasitako programatzaileentzako manifestua erlazionatutako espezialitateetatik” edo nola iritsi naizen bizitzako puntu honetara

Aztertutako ereduaren bloke-diagrama. Alderantzizko FFT (IFFT) blokean geldituko gara. Irudia osatzeko, bakoitzak bere kabuz jarraitu ahal izango ditu gainontzekoekin -Departamenduko irakasleei ikasleei zerbait utziko ziela agindu nien.

Defini ditzagun horiek geuk. ariketa:

  • azpieramaile kopuru finkoa;
  • markoaren luzera finkoa;
  • erdian zero bat eta markoaren hasieran eta amaieran zero pare bat gehitu behar ditugu (guztira, 5 pieza);
  • informazio-ikurrak M-PSK edo M-QAM erabiliz modulatzen dira, non M modulazio-ordena den.

Has gaitezen kodearekin.

Script osoa deskargatu daiteke link.

Definitu ditzagun sarrera-parametroak:

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

Orain informazio-sinboloen indizeak zehazten ditugu, seinale pilotuek nahitaez zeroen aurretik eta/edo ondoren joan behar dutelako premisa onartuz:

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

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

Ondoren, posizioak zehaztu daitezke funtzioaren bidez linspace, balioak hurbileneko zenbaki osoetatik txikienera murriztuz:

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

Gehi ditzagun zeroen indizeak honi eta ordenatu:

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

Horren arabera, seinale pilotuaren indizeak beste guztia dira:

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

Orain uler ditzagun seinale pilotuak.

Txantiloi bat dugu (aldagaia pilotuak), eta demagun txantiloi honetako pilotuak gure fotograman sekuentzialki txertatzea nahi dugula. Jakina, hau begizta batean egin daiteke. Edo delikatua egin dezakezu matrizeekin; zorionez, MATLABek erosotasun nahikoarekin egiteko aukera ematen dizu.

Lehenik eta behin, zehaztu dezagun txantiloi horietako zenbat sartzen diren guztiz markoan:

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

Ondoren, gure txantiloiez osatutako bektore bat osatuko dugu:

% 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

Eta txantiloiaren zati bat baino ez duen bektore txiki bat definitzen dugu - "buztana", markoan guztiz sartzen ez dena:

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

Pertsonaia pilotuak lortzen ditugu:

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

Goazen informazio-sinboloetara, hots, mezu bat osatu eta modulatu egingo dugu:

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 

Dena prest dago! Markoa muntatzea:

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

Horrelako zerbait lortu beharko zenuke:

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

"Zoriona!" — Pentsatu nuen pozik eta ordenagailu eramangarria itxi nuen. Ordu pare bat behar izan nituen dena egiteko: kodea idaztea, Matlab-en funtzio batzuk ikastea eta trikimailu matematikoen bidez pentsatzea barne.

Zein ondorio atera nituen orduan?

Subjektiboa:

  • Kodea idaztea atsegina da eta poesiaren antzekoa da!
  • Scripting-a komunikazioaren eta seinaleen prozesamenduaren alorreko ikerketa-metodorik egokiena da.

Helburu:

  • Ez dago txolarreak kanoi batetik jaurtitzeko beharrik (horrelako helburu didaktiko batek, noski, merezi ez badu): Simulink erabiliz, arazo soil bat tresna sofistikatu batekin konpontzeari ekin genion.
  • GUI ona da, baina "kanpaiaren azpian" dagoena ulertzea hobea da.

Eta orain, ikasle izatetik urrun egonik, honako hau esan nahi diot ikasle kofradiari:

  • Joan!

Saiatu kodea idazten, hasieran txarra izan arren. Programazioarekin, beste edozein jarduerarekin bezala, zailena hasiera da. Eta hobe da lehenago hastea: zientzialaria bazara edo nahiz eta teknikaria besterik ez bazara, lehenago edo geroago trebetasun hori beharko duzu.

  • Eskaria!

Irakasleei eta arduradunei planteamendu eta tresna progresiboak eskatzea. Hau posible bada, noski...

  • Sortu!

Non da hobe hasiberri baten min guztiak gainditzea, hezkuntza-programa baten barruan ez bada? Sortu eta hobetu zure gaitasunak - berriro ere, zenbat eta lehenago hasi, orduan eta hobeto.

Herrialde guztietako programatzaile aspiratzaileak, batu!

PS

Ikasleekin dudan harreman zuzena jasotzeko, 2017ko argazki gogoangarri bat eransten dizuet bi errektorerekin: Peter Scharff (eskuinean) eta Albert Kharisovich Gilmutdinov (ezkerrean).

“Hasitako programatzaileentzako manifestua erlazionatutako espezialitateetatik” edo nola iritsi naizen bizitzako puntu honetara

Mozorro hauengatik behintzat egitaraua bukatzea merezi zuen! (Txantxetan)

Iturria: www.habr.com

Gehitu iruzkin berria