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

Moj današnji članak je glasna razmišljanja osobe koja je skoro slučajno (iako prirodno) krenula putem programiranja.

Da, razumijem da je moje iskustvo samo moje iskustvo, ali mi se čini da se dobro uklapa u opći trend. Štaviše, iskustvo opisano u nastavku više se odnosi na polje naučne aktivnosti, ali ono što se, dovraga, ne šali - može biti korisno i napolju.

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

Generalno, posvećeno svim sadašnjim studentima od bivšeg učenika!

Očekivanja

Kada sam 2014. godine završio diplomu iz Infokomunikacionih tehnologija i komunikacionih sistema, nisam znao skoro ništa o svetu programiranja. Da, kao i mnogi drugi, pohađao sam predmet „Informatika“ na prvoj godini - ali, Gospode, to je bilo na mojoj prvoj godini! Prošla je cijela vječnost!

Generalno, nisam očekivao ništa posebno drugačije od diplome, a kada sam ušao na master "Komunikacija i obrada signala" Njemačko-ruski institut za nove tehnologije.

Ali uzalud...

Bili smo tek drugi prijemni, a momci iz prvog su još pakovali kofere za daleku Nemačku (stažiranje traje šest meseci na drugoj godini master studija). Drugim riječima, niko se iz najbližeg kruga još nije ozbiljnije susreo sa metodama evropskog obrazovanja, a nije se imao ko pitati za detalje.

U prvoj godini, naravno, imali smo razne vrste praksi, u kojima nam je obično demokratski nuđen izbor između pisanja skripti (uglavnom na MATLAB jeziku) i upotrebe raznih visoko specijalizovanih GUI (u smislu da bez pisanja skripti - simulacija okruženja za modeliranje).

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

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

Pogled koji je izvoran i razumljiv osobi koja je prethodno radila u dizajnu kola i sistemskom inženjeringu!

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

Tako nam se činilo...

Reality

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

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

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

  • Svaki blok je prepun mnogo nepoznatih parametara, koje je strašno promijeniti na najmanju moguću mjeru.
  • Manipulacije sa brojevima treba da se rade, čini se, jednostavne, ali se ipak morate mučiti, ne daj Bože.
  • Cathedral mašine primetno usporavaju od mahnitog korišćenja GUI, čak i u fazi surfanja kroz biblioteke dostupnih blokova.
  • Da biste završili nešto kod kuće, morate imati isti Simulink. I, u stvari, nema alternative.

Da, na kraju smo, naravno, završili projekat, ali smo ga završili uz glasno izdahnuće olakšanja.

Prošlo je neko vrijeme i došli smo do kraja prve godine master studija. Količina domaće zadaće koja koristi GUI počela je proporcionalno opadati sa povećanjem udjela njemačkih predmeta, iako još nije dostigla tačku promjene paradigme. Mnogi od nas, uključujući i mene, prevazilazeći našu znatnu amplitudu za izgradnju, sve više koriste Matlab u našim naučnim projektima (iako u obliku kutija sa alatima), a ne naizgled poznati Simulink.

Poenta u našim sumnjama bila je fraza jednog od studenata druge godine (oni su se tada tek vratili u Rusiju):

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

Ispostavilo se da je izjava djelomično istinita: u Ilmenauu, spor oko izbora alata također nije u potpunosti riješen. Istina, izbor je uglavnom bio između MATLAB-a, Pythona i C-a.

Istog dana obuzelo me je prirodno uzbuđenje: zar ne bih trebao svoj dio OFDM modela predajnika prenijeti u skriptiranu formu? Samo za zabavu.

I krenuo sam na posao.

Korak po korak

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

“Pa,” pomislio sam, “da ponovimo, šta ćemo modelirati?”
Mi ćemo modelirati Generator OFDM okvira (generator OFDM okvira).

Šta će uključivati:

  • informacioni simboli
  • pilot signale
  • nule (DC)

Od čega (radi jednostavnosti) apstrahujemo:

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

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

Blok dijagram modela koji se razmatra. Zaustavićemo se na inverznom FFT (IFFT) bloku. Da slika bude upotpunjena, ostalo svako može da nastavi sam - obećao sam nastavnicima sa katedre da ću ostaviti nešto za učenike.

Hajde da ih sami definišemo. vježba:

  • fiksni broj podnosača;
  • fiksna dužina okvira;
  • moramo dodati jednu nulu u sredini i par nula na početku i kraju okvira (ukupno, 5 komada);
  • Informacijski simboli se moduliraju korištenjem M-PSK ili M-QAM, gdje je M redoslijed modulacije.

Počnimo s kodom.

Cijeli skript se može preuzeti sa 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, prihvatajući premisu da pilot signali moraju nužno ići prije i/ili poslije 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;

Tada se pozicije mogu odrediti pomoću funkcije linspace, smanjujuć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 indekse nula ovome 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); 

Hajde sada da razumemo pilot signale.

Imamo šablon (varijabilnu piloti), i recimo da želimo da piloti iz ovog šablona budu umetnuti u naš okvir sekvencijalno. Naravno, ovo se može uraditi u petlji. Ili se možete malo poigrati sa matricama - na sreću MATLAB vam omogućava da to uradite sa dovoljno komfora.

Prvo, odredimo koliko se ovih predložaka u potpunosti uklapa 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 se ne uklapa 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

Dobijamo pilotske 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

Trebalo bi da dobijete nešto ovako:

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 da uradim sve: uključujući pisanje koda, učenje nekih Matlab funkcija i razmišljanje kroz matematičke trikove.

Kakve sam zaključke tada izveo?

Subjektivno:

  • Pisanje koda je prijatno i slično poeziji!
  • Skriptiranje je najpogodniji metod istraživanja za oblast komunikacija i obrade signala.

Cilj:

  • Nema potrebe gađati vrapce iz topa (osim ako se takav obrazovni cilj, naravno, isplati): koristeći Simulink, preuzeli smo rješavanje jednostavnog problema sofisticiranim alatom.
  • GUI je dobar, ali bolje je razumjeti šta se nalazi „ispod haube“.

A sada, pošto sam daleko od toga da sam student, hoću da kažem sledećem studentskom bratstvu:

  • Dare!

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

  • Potražnja!

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

  • Stvoriti!

Gdje je drugdje bolje preboljeti sve početničke rane, ako ne u okviru edukativnog programa? Kreirajte i usavršavajte svoje vještine - opet, što prije počnete, to bolje.

Ambiciozni programeri iz svih zemalja, ujedinite se!

PS

Kako bih zabilježio svoj direktan odnos sa studentima, prilažem nezaboravnu fotografiju 2017. sa dva rektora: Peterom Scharffom (desno) i Albertom Kharisovičem Gilmutdinovim (lijevo).

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

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

izvor: www.habr.com

Dodajte komentar