"Manifest za programerje začetnike sorodnih specialnosti" ali kako sem prišel do te točke v življenju

Moj današnji članek so misli na glas osebe, ki se je na pot programiranja podala skoraj po naključju (čeprav naravno).

Da, razumem, da je moja izkušnja samo moja izkušnja, vendar se mi zdi, da se dobro umešča v splošni trend. Poleg tega se spodaj opisana izkušnja nanaša bolj na področje znanstvene dejavnosti, a kaj za vraga, ni šala - lahko je uporabna zunaj.

"Manifest za programerje začetnike sorodnih specialnosti" ali kako sem prišel do te točke v življenju
Vir: https://xkcd.com/664/

Sploh posvečeno vsem sedanjim študentom od nekdanjega študenta!

Pričakovanja

Ko sem leta 2014 zaključil diplomo iz Infokomunikacijskih tehnologij in komunikacijskih sistemov, o svetu programiranja nisem vedel skoraj nič. Da, kot mnogi drugi, sem v prvem letniku vzel predmet "Računalništvo" - ampak, Gospod, bilo je v prvem letniku! Minila je cela večnost!

Na splošno nisem pričakoval nič posebej drugačnega od diplome in ko sem vstopil v magistrski "Komunikacija in obdelava signalov" Nemško-ruski inštitut za nove tehnologije.

Ampak zaman ...

Bili smo šele drugi sprejem, fantje iz prvega pa so še pakirali kovčke za daljno Nemčijo (v drugem letniku magistrskega študija praksa traja šest mesecev). Povedano drugače, nihče iz ožjega kroga se še ni resno srečal z metodami evropskega izobraževanja, o podrobnostih pa ni bilo nikogar, ki bi ga povprašal.

V prvem letniku smo seveda imeli različne prakse, v katerih so nam običajno demokratično ponujali izbiro med pisanjem skript (predvsem v jeziku MATLAB) in uporabo različnih visoko specializiranih GUI (v smislu, da brez pisanja skript – simulacije). modeliranje okolij).

"Manifest za programerje začetnike sorodnih specialnosti" ali kako sem prišel do te točke v življenju

Ni treba posebej poudarjati, da smo se bodoči magistri znanosti iz svoje mladostne neumnosti izogibali pisanju kode kot ognju. Tukaj je na primer Simulink iz MathWorksa: tukaj so bloki, tukaj so povezave, tukaj so vse vrste nastavitev in stikal.

Pogled, ki je domač in razumljiv osebi, ki se je prej ukvarjala z načrtovanjem vezij in sistemskim inženiringom!

"Manifest za programerje začetnike sorodnih specialnosti" ali kako sem prišel do te točke v življenju
Vir: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Tako se nam je zdelo ...

Resničnost

Eno izmed praktičnih del prvega semestra je bil razvoj oddajnika signala OFDM v okviru predmeta “Metode za modeliranje in optimizacijo”. Ideja je zelo uspešna: tehnologija je še vedno aktualna in precej priljubljena zaradi uporabe na primer v omrežjih Wi-Fi in LTE/LTE-A (v obliki OFDMA). To je najboljša stvar za mojstre, da vadijo svoje veščine modeliranja telekomunikacijskih sistemov.

"Manifest za programerje začetnike sorodnih specialnosti" ali kako sem prišel do te točke v življenju

In zdaj nam je na voljo več možnosti tehničnih specifikacij z očitno nepraktičnimi parametri okvirja (da ne bi iskali rešitve na internetu), mi pa planemo na že omenjeni Simulink ... In dobimo s čajnikom po glavi. resničnosti:

  • Vsak blok je poln številnih neznanih parametrov, ki jih je strah spremeniti takoj.
  • Zdi se, da je manipulacija s številkami preprosta, vendar se morate še vedno truditi, ne daj bog.
  • Katedralni stroji se opazno upočasnijo zaradi nenavadne uporabe GUI, tudi na stopnji brskanja po knjižnicah razpoložljivih blokov.
  • Če želite nekaj dokončati doma, morate imeti isti Simulink. In pravzaprav ni nobene alternative.

Ja, na koncu smo seveda zaključili projekt, vendar smo ga zaključili z glasnim izdihom olajšanja.

Minilo je nekaj časa in prišli smo do konca prvega letnika magistrskega študija. Količina domačih nalog z GUI se je začela zmanjševati sorazmerno z večanjem deleža nemških predmetov, čeprav še ni dosegla točke spremembe paradigme. Mnogi od nas, vključno z mano, smo, ko smo premagali našo precejšnjo amplitudo za izgradnjo, vedno bolj uporabljali Matlab v svojih znanstvenih projektih (čeprav v obliki Toolboxes) in ne navidezno znanega Simulinka.

Bistvo naših dvomov je bil stavek enega od študentov drugega letnika (takrat so se ravno vrnili v Rusijo):

  • Pozabite, vsaj za čas pripravništva, na Similink, MathCad in ostale LabViewe – čez hrib je vse napisano v MATLAB-u, z uporabo samega MatLaba ali njegove brezplačne »različice« Octave.

Trditev se je deloma izkazala za resnično: v Ilmenauu tudi spor glede izbire orodij ni bil povsem rešen. Res je, izbira je bila predvsem med MATLAB, Python in C.

Še isti dan me je prevzelo naravno navdušenje: ali ne bi moral svoj del modela oddajnika OFDM prenesti v skriptno obliko? Samo za zabavo.

In sem se lotil dela.

Korak za korakom

Namesto teoretičnih izračunov bom samo dal povezavo do tega odličen članek 2011 od tgx in na diapozitivih Fizična plast LTE profesorji Michel-Tila (TU Ilmenau). Mislim, da bo to dovolj.

"Torej," sem pomislil, "ponovimo, kaj bomo modelirali?"
Modelirali bomo Generator okvirjev OFDM (generator okvirja OFDM).

Kaj bo vključevalo:

  • informacijski simboli
  • pilotske signale
  • ničle (DC)

Od česa (zaradi enostavnosti) abstrahiramo:

  • iz modeliranja ciklične predpone (če poznate osnove, je dodajanje ne bo težko)

"Manifest za programerje začetnike sorodnih specialnosti" ali kako sem prišel do te točke v življenju

Blokovna shema obravnavanega modela. Ustavili se bomo pri bloku inverznega FFT (IFFT). Da je slika popolna, ostalo lahko vsak nadaljuje sam – učiteljem iz oddelka sem obljubil, da bom nekaj pustil tudi študentom.

Opredelimo jih sami. vaja:

  • fiksno število pod-nosilcev;
  • fiksna dolžina okvirja;
  • dodati moramo eno ničlo na sredini in par ničel na začetku in koncu okvirja (skupaj 5 kosov);
  • informacijski simboli so modulirani z uporabo M-PSK ali M-QAM, kjer je M vrstni red modulacije.

Začnimo s kodo.

Celoten skript lahko prenesete iz povezava.

Določimo vhodne 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

Sedaj določimo indekse informacijskih simbolov, pri čemer sprejmemo predpostavko, da morajo biti pilotni signali nujno pred in/ali za ničlami:

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

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

Nato lahko s funkcijo določimo položaje linspace, zmanjševanje vrednosti na najmanjše od najbližjih celih števil:

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

Temu dodamo indekse ničel in razvrstimo:

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

V skladu s tem so indeksi pilotnega signala vse 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); 

Zdaj pa poglejmo pilotske signale.

Imamo predlogo (spremenljivka pilotov), in recimo, da želimo, da so piloti iz te predloge zaporedno vstavljeni v naš okvir. Seveda je to mogoče storiti v zanki. Lahko pa se malo poigrate z matricami - na srečo vam MATLAB omogoča, da to storite dovolj udobno.

Najprej ugotovimo, koliko teh predlog se popolnoma prilega okvirju:

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

Nato oblikujemo vektor, ki je sestavljen iz naših predlog:

% 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

In definiramo majhen vektor, ki vsebuje le kos predloge - "rep", ki se ne prilega popolnoma okvirju:

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

Dobimo pilotske like:

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

Preidimo na informacijske simbole, in sicer bomo oblikovali sporočilo in ga modulirali:

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 

Vse je pripravljeno! Sestavljanje okvirja:

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

Moral bi dobiti nekaj takega:

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ženost!" « sem zadovoljno pomislil in zaprl prenosnik. Potreboval sem nekaj ur, da sem naredil vse: vključno s pisanjem kode, učenjem nekaterih funkcij Matlab in razmišljanjem skozi matematične trike.

Kakšne zaključke sem naredil takrat?

Subjektivno:

  • Pisanje kode je prijetno in podobno poeziji!
  • Skriptiranje je najprimernejša raziskovalna metoda za področje komunikacije in obdelave signalov.

Cilj:

  • Ni treba streljati vrabcev iz topa (razen če se tak izobraževalni cilj seveda splača): s Simulinkom smo se lotili reševanja preprostega problema s sofisticiranim orodjem.
  • Grafični uporabniški vmesnik je dober, vendar je boljše razumevanje, kaj je vsebovano »pod pokrovom«.

In zdaj, ker še zdaleč nisem študent, želim študentski bratovščini povedati naslednje:

  • Biti dobre volje!

Poskusite pisati kodo, tudi če je sprva slaba. Pri programiranju, tako kot pri vsaki drugi dejavnosti, je najtežji del začetek. In bolje je začeti prej: če ste znanstvenik ali celo samo tehnik, boste prej ali slej potrebovali to veščino.

  • Povpraševanje!

Od učiteljev in nadzornikov zahtevajte napredne pristope in orodja. Če je to seveda možno...

  • Ustvarite!

Kje drugje je bolje preboleti vse začetniške ranice, če ne v okviru izobraževalnega programa? Ustvarjajte in izpopolnjujte svoje veščine – znova, prej ko začnete, tem bolje.

Prizadevni programerji iz vseh držav, združite se!

PS

Da bi zabeležil svoj neposredni odnos s študenti, prilagam nepozabno fotografijo leta 2017 z dvema rektorjema: Petrom Scharffom (na desni) in Albertom Kharisovičem Gilmutdinovim (na levi).

"Manifest za programerje začetnike sorodnih specialnosti" ali kako sem prišel do te točke v življenju

Vsaj za te kostume je bilo vredno dokončati program! (šalim se)

Vir: www.habr.com

Dodaj komentar