“Manifest za programere početnike srodnih specijalnosti” ili kako sam došao do ove točke u životu

Moj današnji članak su misli naglas osobe koja je gotovo slučajno (iako prirodno) krenula putem programiranja.

Da, razumijem da je moje iskustvo samo moje iskustvo, ali čini mi se da se dobro uklapa u opći trend. Štoviše, dolje opisano iskustvo više se odnosi na područje znanstvene djelatnosti, ali što se, kvragu, ne šali - može biti korisno vani.

“Manifest za programere početnike srodnih specijalnosti” ili kako sam došao do ove točke u životu
Izvor: https://xkcd.com/664/

Općenito, posvećeno svim sadašnjim studentima od bivšeg studenta!

Očekivanja

Kada sam 2014. završio diplomski studij Infokomunikacijskih tehnologija i komunikacijskih sustava, nisam znao gotovo ništa o svijetu programiranja. Da, kao i mnogi drugi, pohađao sam predmet "Informatika" na prvoj godini - ali, Bože, bilo je to na mojoj prvoj godini! Prošla je cijela vječnost!

Općenito, nisam očekivao ništa posebno drugačije od diplome prvostupnika, a kada sam upisao magistarski "Komunikacija i obrada signala" Njemačko-ruski institut za nove tehnologije.

Ali uzalud...

Bili smo tek drugi prijemni, a dečki iz prvog još su pakirali kofere za daleku Njemačku (pripravnički staž traje šest mjeseci na drugoj godini magisterija). Drugim riječima, još se nitko iz bližeg kruga nije ozbiljnije susreo s metodama europskog obrazovanja, a o detaljima se nije imalo koga pitati.

U našoj prvoj godini, naravno, imali smo različite vrste praksi, u kojima nam je obično demokratski ponuđen izbor između pisanja skripti (uglavnom u jeziku MATLAB) i korištenja raznih visoko specijaliziranih GUI-ja (u smislu da bez pisanja skripti - simulacija modeliranje okruženja).

“Manifest za programere početnike srodnih specijalnosti” ili kako sam došao do ove točke u životu

Nepotrebno je reći da smo mi, budući magistri znanosti, iz svoje mladenačke gluposti izbjegavali pisanje koda kao od vatre. Evo, na primjer, Simulinka iz MathWorksa: ovdje su blokovi, ovdje su veze, ovdje su sve vrste postavki i prekidača.

Pogled koji je izvorni i razumljiv osobi koja se prethodno bavila projektiranjem sklopova i inženjeringom sustava!

“Manifest za programere početnike srodnih specijalnosti” ili kako sam došao do ove točke u životu
Izvor: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Tako nam se činilo...

Stvarnost

Jedan od praktičnih radova prvog semestra bio je razvoj OFDM primopredajnika signala u sklopu predmeta “Metode modeliranja i optimizacije”. Ideja je vrlo uspješna: tehnologija je još uvijek relevantna i prilično popularna zbog svoje upotrebe, primjerice, u Wi-Fi i LTE/LTE-A mrežama (u obliku OFDMA). Ovo je najbolja stvar za majstore da vježbaju svoje vještine u modeliranju telekomunikacijskih sustava.

“Manifest za programere početnike srodnih specijalnosti” ili kako sam došao do ove točke u životu

I sad nam se da nekoliko opcija tehničkih specifikacija s očito nepraktičnim parametrima okvira (da ne tražimo rješenje na internetu), a mi se bacimo na već spomenuti Simulink... I dobijemo čajnik po glavi stvarnosti:

  • Svaki blok je prepun puno nepoznatih parametara, koje je zastrašujuće mijenjati odmah.
  • Manipulacije s brojevima moraju biti, naizgled, jednostavne, ali ipak se morate petljati, ne daj Bože.
  • Cathedral strojevi primjetno usporavaju zbog bjesomučne upotrebe GUI-ja, čak i u fazi surfanja kroz biblioteke dostupnih blokova.
  • Da biste nešto završili kod kuće, morate imati isti Simulink. I zapravo nema alternative.

Da, na kraju smo, naravno, dovršili projekt, ali dovršili smo ga uz glasan izdisaj olakšanja.

Prošlo je neko vrijeme i došli smo do kraja prve godine magisterija. Količina domaćih zadaća koje koriste GUI počela je padati proporcionalno s povećanjem udjela njemačkih predmeta, iako još nije dosegla točku promjene paradigme. Mnogi od nas, uključujući i mene, prevladavajući svoju znatnu amplitudu izgradnje, sve više i više koristimo Matlab u svojim znanstvenim projektima (iako u obliku Toolboxesa), a ne naizgled poznati Simulink.

Poanta naših nedoumica bila je rečenica jednog od studenata druge godine (oni su se u to vrijeme tek vratili u Rusiju):

  • Zaboravite, barem za vrijeme trajanja prakse, Similink, MathCad i ostale LabViewe - preko brda sve je napisano u MATLAB-u, koristeći sam MatLab ili njegovu besplatnu "verziju" Octave.

Izjava se pokazala djelomično točnom: u Ilmenauu spor oko izbora alata također nije u potpunosti riješen. Istina, biralo se uglavnom između MATLAB-a, Pythona i C-a.

Istog dana obuzelo me prirodno uzbuđenje: ne bih li trebao svoj dio modela OFDM odašiljača prebaciti u skriptirani oblik? Samo za zabavu.

I primio sam se posla.

Korak po korak

Umjesto teoretskih proračuna, jednostavno ću dati link na ovo odličan članak 2011 od tgx i na slajdovima LTE fizički sloj profesori Michel-Tila (TU Ilmenau). Mislim da će ovo biti dovoljno.

"Dakle," pomislio sam, "da ponovimo, što ćemo modelirati?"
Modelirat ćemo OFDM generator okvira (OFDM generator okvira).

Što će uključivati:

  • informacijski simboli
  • pilot signali
  • nule (DC)

Od čega (radi jednostavnosti) apstrahiramo:

  • od modeliranja cikličkog prefiksa (ako znate osnove, dodavanje neće biti teško)

“Manifest za programere početnike srodnih specijalnosti” ili kako sam došao do ove točke u životu

Blok dijagram modela koji se razmatra. Zaustavit ćemo se na inverznom FFT (IFFT) bloku. Da slika bude potpuna, ostalo svatko može nastaviti sam – obećao sam profesorima s katedre ostaviti nešto i studentima.

Definirajmo ih sami. vježba:

  • fiksni broj pod-nosača;
  • fiksna duljina okvira;
  • moramo dodati jednu nulu u sredini i par nula na početku i kraju okvira (ukupno 5 komada);
  • informacijski simboli se moduliraju pomoću M-PSK ili M-QAM, gdje je M redoslijed modulacije.

Počnimo s kodom.

Cijelu skriptu možete preuzeti s link.

Definirajmo ulazne parametre:

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

Sada određujemo indekse informacijskih simbola, prihvaćajući premisu da pilot signali nužno moraju ići prije i/ili iza nula:

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

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

Zatim se položaji mogu odrediti pomoću funkcije linspace, svodeći vrijednosti na najmanji od najbližih cijelih brojeva:

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

Dodajmo ovome indekse nula i sortirajmo:

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

Prema tome, indeksi pilot signala su sve ostalo:

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

Hajdemo sada razumjeti pilot signale.

Imamo predložak (varijabilni Piloti), i recimo da želimo da piloti iz ovog predloška budu umetnuti u naš okvir redom. Naravno, to se može učiniti u petlji. Ili se možete igrati malo lukavo s matricama - srećom MATLAB vam omogućuje da to učinite s dovoljno udobnosti.

Prvo, odredimo koliko ovih predložaka u potpunosti stane u okvir:

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

Zatim formiramo vektor koji se sastoji od naših predložaka:

% 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

I definiramo mali vektor koji sadrži samo dio predloška - "rep", koji ne stane u potpunosti u okvir:

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

Dobivamo pilot likove:

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

Prijeđimo na informacijske simbole, naime, formirat ćemo poruku i modulirati je:

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 

Sve je spremno! Sastavljanje okvira:

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

Trebali biste dobiti nešto poput ovoga:

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

"Blaženstvo!" — pomislio sam zadovoljno i zatvorio laptop. Trebalo mi je nekoliko sati za sve: uključujući pisanje koda, učenje nekih Matlab funkcija i razmišljanje kroz matematičke trikove.

Kakve sam zaključke tada izvukao?

Subjektivna:

  • Pisanje koda je ugodno i slično poeziji!
  • Skriptiranje je najprikladnija istraživačka metoda za područje komunikacije i obrade signala.

Cilj:

  • Nema potrebe gađati vrapce iz topa (osim ako se takav edukativni cilj, naravno, isplati): pomoću Simulinka smo se sofisticiranim alatom prihvatili rješavanja jednostavnog problema.
  • GUI je dobar, ali razumijevanje onoga što je sadržano "ispod haube" je bolje.

I sada, daleko od toga da sam student, želim poručiti studentskom bratstvu sljedeće:

  • Biti dobrog raspoloženja!

Pokušajte pisati kod, čak i ako je u početku loš. Kod programiranja, kao i kod svake druge aktivnosti, najteži je početak. I bolje je početi ranije: ako ste znanstvenik ili čak samo tehničar, prije ili kasnije trebat će vam ova vještina.

  • Zahtijevajte!

Zahtijevajte progresivne pristupe i alate od nastavnika i supervizora. Ako je to moguće, naravno...

  • Stvoriti!

Gdje je drugdje bolje preboljeti sve čireve početnika, ako ne u okviru obrazovnog programa? Stvorite i usavršite svoje vještine - opet, što prije počnete, to bolje.

Nadobudni programeri iz svih zemalja, ujedinite se!

PS

Kako bih zabilježio svoj neposredni odnos sa studentima, prilažem nezaboravnu fotografiju iz 2017. godine s dvojicom rektora: Peterom Scharffom (desno) i Albertom Kharisovichem Gilmutdinovim (lijevo).

“Manifest za programere početnike srodnih specijalnosti” ili kako sam došao do ove točke u životu

Vrijedilo je završiti program barem za ove kostime! (šalim se)

Izvor: www.habr.com

Dodajte komentar