„Manifest pentru programatori începători din specialități conexe” sau cum am ajuns în acest punct în viață

Articolul meu de astăzi este gânduri cu voce tare de la o persoană care a luat calea programării aproape din întâmplare (deși în mod natural).

Da, înțeleg că experiența mea este doar experiența mea, dar mi se pare că se încadrează bine în tendința generală. Mai mult, experiența descrisă mai jos se leagă mai mult de domeniul activității științifice, dar ce naiba nu glumește - poate fi utilă afară.

„Manifest pentru programatori începători din specialități conexe” sau cum am ajuns în acest punct în viață
Sursa: https://xkcd.com/664/

In general, dedicat tuturor studentilor actuali de la un fost student!

Așteptări

Când mi-am terminat diploma de licență în Tehnologii Infocomunicații și Sisteme de Comunicații în 2014, nu știam aproape nimic despre lumea programării. Da, la fel ca mulți alții, am luat materia „Informatică” în primul meu an - dar, Doamne, era în primul meu an! A trecut o eternitate!

În general, nu mă așteptam la ceva deosebit de diferit de la o diplomă de licență, iar când am intrat în programul de master „Comunicare și procesare a semnalului” Institutul germano-rus de noi tehnologii.

Dar în zadar...

Eram doar a doua cursă, iar băieții de la primul încă își făceau bagajele pentru îndepărtata Germania (stagiul durează șase luni în al doilea an al programului de master). Cu alte cuvinte, nimeni din cercul imediat nu a întâlnit încă în mod serios metodele educației europene și nu era nimeni să întrebe despre detalii.

În primul nostru an, desigur, am avut diverse tipuri de practici, în care de obicei ni s-a oferit în mod democratic să alegem între scrierea de scripturi (în principal în limbajul MATLAB) și utilizarea diferitelor GUI-uri foarte specializate (în sensul că, fără a scrie scripturi - simulare). medii de modelare).

„Manifest pentru programatori începători din specialități conexe” sau cum am ajuns în acest punct în viață

Inutil să spun că noi, viitorii maeștri în știință, din prostia noastră din tinerețe, am evitat să scriem cod ca focul. Iată, de exemplu, Simulink de la MathWorks: aici sunt blocurile, aici sunt conexiunile, aici sunt tot felul de setări și comutatoare.

O viziune nativă și de înțeles pentru o persoană care a lucrat anterior în proiectarea circuitelor și ingineria sistemelor!

„Manifest pentru programatori începători din specialități conexe” sau cum am ajuns în acest punct în viață
Sursa: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Asa ni s-a parut...

Realitate

Una dintre lucrările practice ale primului semestru a fost dezvoltarea unui transceiver de semnal OFDM ca parte a disciplinei „Metode de modelare și optimizare”. Ideea este foarte reușită: tehnologia este încă relevantă și destul de populară datorită utilizării sale, de exemplu, în rețelele Wi-Fi și LTE/LTE-A (sub formă de OFDMA). Acesta este cel mai bun lucru pentru ca maeștri să-și exerseze abilitățile în modelarea sistemelor de telecomunicații.

„Manifest pentru programatori începători din specialități conexe” sau cum am ajuns în acest punct în viață

Și acum ni se oferă mai multe opțiuni de specificații tehnice cu parametri de cadru evident nepractici (pentru a nu căuta o soluție pe Internet), și ne aruncăm pe deja menționatul Simulink... Și ne lovim în cap cu un ceainic a realitatii:

  • Fiecare bloc este plin de o mulțime de parametri necunoscuți, care sunt înfricoșător de schimbat la o picătură.
  • Manipulările cu numerele trebuie făcute, se pare, simple, dar tot trebuie să te tamâi, Doamne ferește.
  • Mașinile catedralei încetinesc considerabil din cauza utilizării frenetice a GUI, chiar și în stadiul de navigare prin bibliotecile de blocuri disponibile.
  • Pentru a termina ceva acasă, trebuie să aveți același Simulink. Și, de fapt, nu există alternative.

Da, până la urmă noi, desigur, am finalizat proiectul, dar l-am finalizat cu o expirație puternică de ușurare.

A trecut ceva timp, și am ajuns la finalul primului an de master. Cantitatea de teme pentru acasă folosind GUI a început să scadă proporțional cu creșterea ponderii subiecților germani, deși nu ajunsese încă la punctul unei schimbări de paradigmă. Mulți dintre noi, inclusiv eu, depășind amplitudinea noastră considerabilă de a construi, am folosit tot mai mult Matlab în proiectele noastre științifice (deși sub formă de Toolbox-uri), și nu aparentul familiar Simulink.

Momentul îndoielilor noastre a fost fraza unuia dintre studenții din anul II (abia se întorseseră în Rusia până atunci):

  • Uitați, cel puțin pe durata stagiului, de Similink, MathCad și alte LabView - peste deal totul este scris în MATLAB, folosind MatLab în sine sau „versiunea” sa gratuită Octave.

Afirmația s-a dovedit a fi parțial adevărată: la Ilmenau, disputa privind alegerea instrumentelor nu a fost nici ea complet rezolvată. Adevărat, alegerea a fost în mare parte între MATLAB, Python și C.

În aceeași zi, am fost cuprins de o emoție naturală: nu ar trebui să-mi transfer partea mea din modelul transmițătorului OFDM într-o formă scriptată? Doar pentru distractie.

Și m-am apucat de treabă.

Pas cu pas

În loc de calcule teoretice, voi da pur și simplu un link către aceasta excelent articol 2011 din tgx iar pe tobogane Stratul fizic LTE profesori Michel-Tila (TU Ilmenau). Cred că asta va fi suficient.

„Deci”, m-am gândit, „să repetăm, ce vom modela?”
Vom modela Generator de cadre OFDM (generator de cadre OFDM).

Ce va include:

  • simboluri informative
  • semnale pilot
  • zerouri (DC)

De ce (de dragul simplității) facem abstracție:

  • de la modelarea unui prefix ciclic (dacă cunoașteți elementele de bază, adăugarea acestuia nu va fi dificilă)

„Manifest pentru programatori începători din specialități conexe” sau cum am ajuns în acest punct în viață

Schema bloc a modelului luat în considerare. Ne vom opri la blocul invers FFT (IFFT). Pentru a completa tabloul, fiecare poate continua singur restul - le-am promis profesorilor de la catedră să lase ceva elevilor.

Să le definim pentru noi înșine. exercițiu:

  • număr fix de sub-transportatori;
  • lungime fixă ​​a cadrului;
  • trebuie să adăugăm un zero în mijloc și o pereche de zerouri la începutul și sfârșitul cadrului (total, 5 bucăți);
  • simbolurile informaționale sunt modulate folosind M-PSK sau M-QAM, unde M este ordinea de modulație.

Să începem cu codul.

Întregul script poate fi descărcat de pe legătură.

Să definim parametrii de intrare:

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

Acum determinăm indicii simbolurilor informaționale, acceptând premisa că semnalele pilot trebuie neapărat să meargă înainte și/sau după zerouri:

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

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

Apoi pozițiile pot fi determinate folosind funcția linspace, reducând valorile la cel mai mic dintre cele mai apropiate numere întregi:

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

Să adăugăm indici cu zerouri la aceasta și să sortăm:

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

În consecință, indicii semnalului pilot sunt orice altceva:

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

Acum să înțelegem semnalele pilot.

Avem un șablon (variabilă piloți), și să presupunem că vrem ca piloții din acest șablon să fie inserați secvențial în cadrul nostru. Desigur, acest lucru se poate face într-o buclă. Sau puteți juca un pic cam complicat cu matrice - din fericire MATLAB vă permite să faceți acest lucru cu suficient confort.

Mai întâi, să stabilim câte dintre aceste șabloane se potrivesc complet în cadru:

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

Apoi, formăm un vector care constă din șabloanele noastre:

% 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 definim un mic vector care conține doar o bucată din șablon - „coada”, care nu se potrivește complet în cadru:

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

Obținem personaje pilot:

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

Să trecem la simbolurile informaționale, și anume, vom forma un mesaj și îl vom modula:

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 

Totul este gata! Asamblarea cadrului:

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

Ar trebui să obțineți ceva de genul acesta:

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

"Fericire!" — M-am gândit mulțumit și am închis laptopul. Mi-a luat câteva ore să fac totul: inclusiv să scriu cod, să învăț câteva funcții Matlab și să mă gândesc la trucuri matematice.

Ce concluzii am tras atunci?

Subiectiv:

  • Scrierea codului este plăcută și asemănătoare cu poezia!
  • Scripting-ul este cea mai convenabilă metodă de cercetare pentru domeniul comunicațiilor și procesării semnalului.

Obiectiv:

  • Nu este nevoie să împușcăm vrăbii dintr-un tun (cu excepția cazului în care un astfel de obiectiv educațional merită, desigur): folosind Simulink, ne-am asumat rezolvarea unei probleme simple cu un instrument sofisticat.
  • GUI este bun, dar înțelegerea a ceea ce este conținut „sub capotă” este mai bună.

Și acum, fiind departe de a fi student, vreau să spun următoarele fraternității studențești:

  • Veselește!

Încercați să scrieți cod, chiar dacă la început este rău. La programare, ca și în orice altă activitate, partea cea mai grea este începutul. Și este mai bine să începi mai devreme: dacă ești un om de știință sau chiar doar un tehnic, mai devreme sau mai târziu vei avea nevoie de această abilitate.

  • Cerere!

Solicitați abordări și instrumente progresive de la profesori și supraveghetori. Dacă acest lucru este posibil, desigur...

  • Crea!

Unde altundeva este mai bine să treci peste toate rănile unui începător, dacă nu în cadrul unui program educațional? Creați-vă și perfecționați-vă abilitățile - din nou, cu cât începeți mai devreme, cu atât mai bine.

Programatori aspiranți din toate țările, uniți-vă!

PS

Pentru a consemna relația mea directă cu studenții, atașez o fotografie memorabilă a anului 2017 cu doi rectori: Peter Scharff (dreapta) și Albert Kharisovich Gilmutdinov (stânga).

„Manifest pentru programatori începători din specialități conexe” sau cum am ajuns în acest punct în viață

A meritat sa inchei programul macar la aceste costume! (glumesc)

Sursa: www.habr.com

Adauga un comentariu