"Manifes vir beginprogrammeerders van verwante spesialiteite" of hoe ek tot hierdie punt in die lewe gekom het

My artikel vandag is hardop gedagtes van 'n persoon wat amper per ongeluk die pad van programmering geneem het (al is dit natuurlik).

Ja, ek verstaan ​​dat my ervaring net my ervaring is, maar dit lyk vir my of dit goed inpas by die algemene tendens. Boonop hou die ervaring wat hieronder beskryf word meer verband met die veld van wetenskaplike aktiwiteit, maar wat de hel nie 'n grap maak nie - dit kan buite nuttig wees.

"Manifes vir beginprogrammeerders van verwante spesialiteite" of hoe ek tot hierdie punt in die lewe gekom het
Bron: https://xkcd.com/664/

Oor die algemeen, opgedra aan alle huidige studente van 'n voormalige student!

verwagtinge

Toe ek in 2014 my baccalaureusgraad in Infokommunikasietegnologieë en Kommunikasiestelsels voltooi het, het ek omtrent niks van die wêreld van programmering geweet nie. Ja, soos baie ander, het ek die “Rekenaarwetenskap”-vak in my eerste jaar geneem - maar, Here, dit was in my eerste jaar! Dit is 'n ewigheid!

Oor die algemeen het ek niks besonders anders van 'n baccalaureusgraad verwag nie, en toe ek die meestersgraadprogram betree het "Kommunikasie en seinverwerking" Duits-Russiese Instituut vir Nuwe Tegnologie.

Maar tevergeefs...

Ons was net die tweede inname, en die ouens van die eerste was nog besig om hul tasse vir verre Duitsland te pak (die internskap duur ses maande in die tweede jaar van 'n meestersgraad). Met ander woorde, niemand uit die onmiddellike kring het nog ernstig die metodes van Europese onderwys teëgekom nie, en daar was niemand om na die besonderhede te vra nie.

In ons eerste jaar het ons natuurlik verskeie soorte praktyke gehad, waarin ons gewoonlik demokraties 'n keuse gebied is tussen die skryf van skrifte (hoofsaaklik in die MATLAB-taal) en die gebruik van verskeie hoogs gespesialiseerde GUI's (in die sin dat sonder om skrifte te skryf - simulasie modellering omgewings).

"Manifes vir beginprogrammeerders van verwante spesialiteite" of hoe ek tot hierdie punt in die lewe gekom het

Nodeloos om te sê, ons, die toekomstige Meesters van Wetenskap, het uit ons jeugdige onnoselheid dit vermy om kode soos vuur te skryf. Hier is byvoorbeeld Simulink van MathWorks: hier is die blokke, hier is die verbindings, hier is allerhande instellings en skakelaars.

'n Beskouing wat inheems en verstaanbaar is vir 'n persoon wat voorheen in stroombaanontwerp en stelselingenieurswese gewerk het!

"Manifes vir beginprogrammeerders van verwante spesialiteite" of hoe ek tot hierdie punt in die lewe gekom het
Bron: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

So het dit vir ons gelyk...

werklikheid

Een van die praktiese werke van die eerste semester was die ontwikkeling van 'n OFDM seinontvanger as deel van die vak "Metodes vir Modellering en Optimalisering". Die idee is baie suksesvol: die tegnologie is steeds relevant en baie gewild weens die gebruik daarvan, byvoorbeeld, in Wi-Fi en LTE/LTE-A-netwerke (in die vorm van OFDMA). Dit is die beste ding vir meesters om hul vaardighede in die modellering van telekommunikasiestelsels te oefen.

"Manifes vir beginprogrammeerders van verwante spesialiteite" of hoe ek tot hierdie punt in die lewe gekom het

En nou word ons verskeie opsies van tegniese spesifikasies gegee met ooglopend onpraktiese raamparameters (om nie 'n oplossing op die internet te soek nie), en ons val op die reeds genoemde Simulink ... En ons word op die kop geslaan met 'n teepot van die werklikheid:

  • Elke blok is belaai met baie onbekende parameters, wat skrikwekkend is om met die nippertjie van 'n hoed te verander.
  • Die manipulasies met syfers moet gedoen word, so lyk dit, eenvoudig, maar jy moet tog bohaai, God verhoede.
  • Katedraalmasjiene vertraag merkbaar van die woes gebruik van die GUI, selfs in die stadium van navigeer deur biblioteke van beskikbare blokke.
  • Om iets by die huis klaar te maak, moet jy dieselfde Simulink hê. En in werklikheid geen alternatiewe nie.

Ja, op die ou end het ons natuurlik die projek voltooi, maar ons het dit met 'n harde uitasem van verligting voltooi.

'n Tyd het verbygegaan, en ons het aan die einde van die eerste jaar van die meestersgraad gekom. Die hoeveelheid huiswerk wat GUI gebruik het, het proporsioneel begin afneem met die toename in die aandeel Duitse vakke, hoewel dit nog nie die punt van 'n paradigmaskuif bereik het nie. Baie van ons, insluitend ek, wat ons aansienlike amplitude oorkom om op te bou, het meer en meer Matlab in ons wetenskaplike projekte gebruik (al is dit in die vorm van Toolboxes), en nie die oënskynlik bekende Simulink nie.

Die punt in ons twyfel was die frase van een van die tweedejaarstudente (hulle het sopas teruggekeer na Rusland toe):

  • Vergeet, ten minste vir die duur van die internskap, van Similink, MathCad en ander LabView - oor die heuwel is alles in MATLAB geskryf, met MatLab self of sy gratis "weergawe" Octave.

Die stelling blyk deels waar te wees: in Ilmenau is die dispuut oor die keuse van gereedskap ook nie heeltemal opgelos nie. Die keuse was weliswaar meestal tussen MATLAB, Python en C.

Op dieselfde dag is ek deur 'n natuurlike opgewondenheid geneem: moet ek nie my deel van die OFDM-sendermodel in 'n geskrewe vorm oordra nie? Net vir die pret.

En ek het aan die werk gekom.

Stap vir stap

In plaas van teoretiese berekeninge sal ek bloot 'n skakel hiernatoe gee uitstekende artikel 2011 vanaf tgx en op die skyfies LTE fisiese laag professore Michel-Tila (TU Ilmenau). Ek dink dit sal genoeg wees.

"So," het ek gedink, "kom ons herhaal, wat gaan ons model?"
Ons sal model OFDM raam kragopwekker (OFDM raam kragopwekker).

Wat dit sal insluit:

  • inligting simbole
  • vlieënier seine
  • nulle (DC)

Waaruit onttrek ons ​​(vir eenvoud):

  • van die modellering van 'n sikliese voorvoegsel (as jy die basiese beginsels ken, sal dit nie moeilik wees om dit by te voeg nie)

"Manifes vir beginprogrammeerders van verwante spesialiteite" of hoe ek tot hierdie punt in die lewe gekom het

Blokdiagram van die model wat oorweeg word. Ons sal stop by die omgekeerde FFT (IFFT) blok. Om die prentjie te voltooi, kan elkeen self met die res voortgaan – ek het die onderwysers van die departement belowe om iets vir die studente na te los.

Kom ons definieer dit vir onsself. oefening:

  • vaste aantal sub-draers;
  • vaste raamlengte;
  • ons moet een nul in die middel byvoeg en 'n paar nulle aan die begin en einde van die raam (totaal, 5 stukke);
  • inligtingsimbole word gemoduleer met behulp van M-PSK of M-QAM, waar M die modulasievolgorde is.

Kom ons begin met die kode.

Die hele skrif kan afgelaai word vanaf skakel.

Kom ons definieer die invoerparameters:

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

Nou bepaal ons die indekse van inligtingsimbole en aanvaar die uitgangspunt dat vlieënierseine noodwendig voor en/of na nulle moet gaan:

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

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

Dan kan die posisies met behulp van die funksie bepaal word linspace, verminder die waardes tot die kleinste van die naaste heelgetalle:

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

Kom ons voeg indekse van nulle hierby en sorteer:

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

Gevolglik is die loodsein-indekse alles anders:

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

Kom ons verstaan ​​vlieënierseine.

Ons het 'n sjabloon (veranderlike vlieëniers), en kom ons sê ons wil hê dat vlieëniers van hierdie sjabloon opeenvolgend in ons raam ingevoeg moet word. Dit kan natuurlik in 'n lus gedoen word. Of jy kan 'n bietjie moeilik met matrikse speel - gelukkig laat MATLAB jou toe om dit met genoeg gemak te doen.

Kom ons bepaal eers hoeveel van hierdie sjablone heeltemal in die raam pas:

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

Vervolgens vorm ons 'n vektor wat uit ons sjablone bestaan:

% 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

En ons definieer 'n klein vektor wat slegs 'n stukkie van die sjabloon bevat - die "stert", wat nie heeltemal in die raam pas nie:

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

Ons kry vlieënierkarakters:

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

Kom ons gaan oor na inligtingsimbole, naamlik, ons sal 'n boodskap vorm en dit moduleer:

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 

Alles is gereed! Die samestelling van die raam:

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

Jy behoort so iets te kry:

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

"Geluk!" — Ek dink tevrede en maak die skootrekenaar toe. Dit het my 'n paar uur geneem om alles te doen: insluitend die skryf van kode, die leer van 'n paar Matlab-funksies en om deur wiskundige truuks te dink.

Watter gevolgtrekkings het ek toe gemaak?

Subjektief:

  • Om kode te skryf is aangenaam en soortgelyk aan poësie!
  • Skripte is die mees gerieflike navorsingsmetode vir die veld van Kommunikasie en Seinverwerking.

Doel:

  • Dit is nie nodig om mossies uit 'n kanon te skiet nie (tensy so 'n opvoedkundige doelwit natuurlik die moeite werd is): met Simulink het ons 'n eenvoudige probleem met 'n gesofistikeerde hulpmiddel opgelos.
  • GUI is goed, maar om te verstaan ​​wat vervat is "onder die enjinkap" is beter.

En nou, omdat ek ver van 'n student is, wil ek die volgende aan die studente-broederskap sê:

  • Gaan vir dit!

Probeer kode skryf, selfs al is dit eers sleg. Met programmering, soos met enige ander aktiwiteit, is die moeilikste deel die begin. En dit is beter om vroeër te begin: as jy 'n wetenskaplike of selfs net 'n tegneerder is, sal jy vroeër of later hierdie vaardigheid nodig hê.

  • Vraag!

Eis progressiewe benaderings en gereedskap van onderwysers en toesighouers. As dit moontlik is, natuurlik...

  • Skep!

Waar anders is dit beter om oor al die sere van 'n beginner te kom, indien nie binne die raamwerk van 'n opvoedkundige program nie? Skep en slyp jou vaardighede – weereens, hoe gouer jy begin, hoe beter.

Aspirant-programmeerders van alle lande, verenig!

PS

Ten einde my direkte verhouding met studente aan te teken, heg ek 'n onvergeetlike foto van 2017 aan met twee rektore: Peter Scharff (regs) en Albert Kharisovich Gilmutdinov (links).

"Manifes vir beginprogrammeerders van verwante spesialiteite" of hoe ek tot hierdie punt in die lewe gekom het

Dit was die moeite werd om die program ten minste vir hierdie kostuums klaar te maak! (grap)

Bron: will.com

Voeg 'n opmerking