"Manifest foar begjinnende programmeurs fan besibbe spesjaliteiten" of hoe't ik op dit punt yn it libben kaam

Myn artikel hjoed is tinzen lûdop fan in persoan dy't it paad fan programmearring hast per ûngelok naam (hoewol fansels).

Ja, ik begryp dat myn ûnderfining gewoan myn ûnderfining is, mar it liket my ta dat it goed past yn 'e algemiene trend. Boppedat, de ûnderfining beskreaun hjirûnder is mear relatearre oan it fjild fan wittenskiplike aktiviteit, mar wat de hel is net in grapke - it kin wêze brûkber bûten.

"Manifest foar begjinnende programmeurs fan besibbe spesjaliteiten" of hoe't ik op dit punt yn it libben kaam
Boarne: https://xkcd.com/664/

Yn it algemien, wijd oan alle hjoeddeistige studinten fan in eardere studint!

Ferwachtingen

Doe't ik yn 2014 myn bachelorstitel yn Infocommunication Technologies and Communication Systems foltôge, wist ik hast neat oer de wrâld fan programmearring. Ja, lykas in protte oaren, naam ik it fak "Computer Science" yn myn earste jier - mar, Hear, it wie yn myn earste jier! It is in ivichheid west!

Yn 't algemien ferwachte ik neat spesjaal oars fan in bachelorstitel, en doe't ik yn' e masteroplieding kaam "Kommunikaasje en sinjaalferwurking" Dútsk-Russysk Ynstitút foar Nije Technologies.

Mar om 'e nocht...

Wy wiene noch mar de twadde yntak, en de jonges fan de earste wiene noch oan it pakken fan harren koffers foar it fiere Dútslân (de staazje duorret seis moanne yn it twadde jier fan in masterstitel). Mei oare wurden, gjinien út 'e direkte rûnte wie noch serieus tsjinkommen mei de metoaden fan Europeesk ûnderwiis, en der wie gjinien om te freegjen nei de details.

Yn ús earste jier hienen wy fansels ferskate soarten praktiken, wêrby't ús meastentiids demokratysk in kar oanbean waard tusken it skriuwen fan skripts (benammen yn 'e MATLAB-taal) en it brûken fan ferskate tige spesjalisearre GUI's (yn 'e sin dat sûnder skripts te skriuwen - simulaasje modeling omjouwings).

"Manifest foar begjinnende programmeurs fan besibbe spesjaliteiten" of hoe't ik op dit punt yn it libben kaam

It is net nedich om te sizzen dat wy, de takomstige Masters of Science, út ús jeugdige dommens, mijden om koade te skriuwen as fjoer. Hjir is bygelyks Simulink fan MathWorks: hjir binne de blokken, hjir binne de ferbinings, hjir binne allerhanne ynstellings en skeakels.

In werjefte dy't lânseigen en begryplik is foar in persoan dy't earder wurke hat yn circuitûntwerp en systeemtechnyk!

"Manifest foar begjinnende programmeurs fan besibbe spesjaliteiten" of hoe't ik op dit punt yn it libben kaam
Boarne: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Sa like it ús...

Reality

Ien fan 'e praktyske wurken fan it earste semester wie de ûntwikkeling fan in OFDM-sinjaal-transceiver as ûnderdiel fan it ûnderwerp "Metoaden foar modellering en optimisaasje". It idee is tige suksesfol: de technology is noch altyd relevant en frij populêr troch syn gebrûk, bygelyks yn Wi-Fi en LTE / LTE-A netwurken (yn 'e foarm fan OFDMA). Dit is it bêste ding foar masters om har feardigens te oefenjen yn it modelleren fan telekomsystemen.

"Manifest foar begjinnende programmeurs fan besibbe spesjaliteiten" of hoe't ik op dit punt yn it libben kaam

En no krije wy ferskate opsjes fan technyske spesifikaasjes mei fansels ûnpraktyske frameparameters (om net te sykjen nei in oplossing op it ynternet), en wy slaan op 'e al neamde Simulink ... En wy krije op 'e kop mei in teepot fan realiteit:

  • Elk blok is fol mei in protte ûnbekende parameters, dy't skriklik binne om te feroarjen op 'e drip fan in hoed.
  • De manipulaasjes mei sifers moatte dien wurde, sa liket it, ienfâldich, mar jo moatte noch rommelje, God ferbiede.
  • Katedraalmasines fertrage merkber fan it heulende gebrûk fan 'e GUI, sels op it poadium fan surfen troch biblioteken fan beskikbere blokken.
  • Om wat thús ôf te meitsjen, moatte jo deselde Simulink hawwe. En, yn feite, gjin alternativen.

Ja, op it lêst hawwe wy it projekt fansels foltôge, mar wy hawwe it foltôge mei in lûde útademing fan reliëf.

Wat tiid ferrûn, en wy kamen oan 'e ein fan it earste jier fan' e masterstitel. De hoemannichte húswurk mei GUI's begon evenredich te fallen mei it tanimmen fan it oanpart fan Dútske fakken, hoewol it noch net it punt fan in paradigmaferskowing hie berikt. In protte fan ús, ynklusyf my, oerwinne ús grutte amplitude om op te bouwen, mear en mear Matlab brûkten yn ús wittenskiplike projekten (hoewol yn 'e foarm fan Toolboxes), en net de skynber fertroude Simulink.

It punt yn ús twifels wie de sin fan ien fan 'e twaddejiersstudinten (se wiene doe krekt werom nei Ruslân):

  • Ferjit, op syn minst foar de doer fan 'e staazje, oer Similink, MathCad en oare LabView - oer de heuvel is alles skreaun yn MATLAB, mei MatLab sels as syn fergese "ferzje" Octave.

De stelling blykte foar in part wier te wêzen: yn Ilmenau wie it skeel oer de kar fan ark ek net hielendal oplost. Wier, de kar wie meast tusken MATLAB, Python en C.

Op deselde dei waard ik nommen troch in natuerlike opwining: soe ik myn diel fan it OFDM-stjoerdermodel net moatte oermeitsje yn in skriptfoarm? Gewoan foar de aardichheid.

En ik moast oan it wurk.

Stap foar stap

Ynstee fan teoretyske berekkeningen sil ik hjir gewoan in keppeling nei jaan poerbêst artikel 2011 fan tgx en op de dia's LTE fysike laach heechleararen Michel-Tila (TU Ilmenau). Ik tink dat dit genôch sil wêze.

"Dus," tocht ik, "litte wy werhelje, wat sille wy modelearje?"
Wy sille model OFDM frame generator (OFDM frame generator).

Wat it sil befetsje:

  • ynformaasje symboalen
  • pilot sinjalen
  • nullen (DC)

Wat (foar de ienfâld) wy abstrahere út:

  • fan it modellearjen fan in syklysk foarheaksel (as jo de basis kenne, it tafoegjen sil net dreech wêze)

"Manifest foar begjinnende programmeurs fan besibbe spesjaliteiten" of hoe't ik op dit punt yn it libben kaam

Blokdiagram fan it model ûnder behanneling. Wy sille stopje by it omkearde FFT (IFFT) blok. Om it byld te foltôgjen, kin elkenien de rest sels trochgean - ik ha de dosinten fan 'e ôfdieling tasein wat foar de learlingen oer te litten.

Litte wy dy foar ússels definiearje. oefenje:

  • fêst oantal sub-carriers;
  • fêste frame lingte;
  • wy moatte tafoegje ien nul yn 'e midden en in pear nullen oan it begjin en ein fan it frame (totaal, 5 stikken);
  • ynformaasje symboalen wurde modulearre mei M-PSK of M-QAM, dêr't M is de modulaasje folchoarder.

Litte wy begjinne mei de koade.

It hiele skript kin ynladen wurde fan link.

Litte wy de ynfierparameters definiearje:

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

No bepale wy de yndeksen fan ynformaasjesymboalen, akseptearje it útgongspunt dat pilotsinjalen needsaaklik foar en/of nei nullen gean moatte:

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 kinne de posysjes bepaald wurde mei de funksje linspace, it ferminderjen fan de wearden nei de lytste fan 'e tichtstbyste heule getallen:

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

Litte wy hjir yndeksen fan nullen tafoegje en sortearje:

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

Dêrnjonken binne de yndeksen fan pilotsinjaal al it oare:

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

Litte wy no pilotsinjalen begripe.

Wy hawwe in sjabloan (fariabele piloaten), en lit ús sizze dat wy wolle dat pilots fan dit sjabloan opfolgjend yn ús frame wurde ynfoege. Fansels kin dit yn in loop dien wurde. Of do kinst spylje in bytsje lestich mei matrices - gelokkich MATLAB kinne jo dwaan dit mei genôch treast.

Litte wy earst bepale hoefolle fan dizze sjabloanen folslein yn it frame passe:

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

Dêrnei foarmje wy in fektor dy't bestiet út ús sjabloanen:

% 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 wy definiearje in lytse fektor dy't allinich in stik fan 'e sjabloan befettet - de "sturt", dy't net folslein yn it frame past:

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

Wy krije pilotkarakters:

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

Litte wy trochgean nei ynformaasjesymboalen, nammentlik sille wy in berjocht foarmje en it moduleare:

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 klear! It gearstallen fan it frame:

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

Jo moatte sa'n ding krije:

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

"Bliss!" - tocht ik tefreden en die de laptop ticht. It duorre my in pear oeren om alles te dwaan: ynklusyf it skriuwen fan koade, it learen fan guon Matlab-funksjes en tinken troch wiskundige trúkjes.

Hokker konklúzjes haw ik doe lutsen?

Subjektyf:

  • Koade skriuwe is noflik en besibbe oan poëzij!
  • Skript is de meast handige ûndersyksmetoade foar it mêd fan kommunikaasje en sinjaalferwurking.

Objektyf:

  • D'r is gjin ferlet om sparrows út in kanon te sjitten (útsein as sa'n edukatyf doel it fansels wurdich is): mei Simulink namen wy it oplossen fan in ienfâldich probleem mei in ferfine ark.
  • GUI is goed, mar begripe wat is befette "ûnder de motorkap" is better.

En no, ik bin fier fan in studint, wol ik it folgjende sizze tsjin 'e studintebroederskip:

  • Gean derfoar!

Besykje koade te skriuwen, sels as it earst min is. Mei programmearring, lykas by elke oare aktiviteit, is it dreechste it begjin. En it is better om earder te begjinnen: as jo in wittenskipper binne of sels gewoan in technyk, ier of letter sille jo dizze feardigens nedich hawwe.

  • Eask!

Easket progressive oanpakken en ark fan leararen en tafersjochhâlders. As dit mooglik is, fansels...

  • Meitsje!

Wêr oars is it better om te kommen oer alle wûnen fan in begjinner, as net yn it ramt fan in edukatyf programma? Meitsje en slypje jo feardigens - nochris, hoe earder jo begjinne, hoe better.

Aspirant programmeurs út alle lannen, ferienigje!

PS

Om myn direkte relaasje mei de studinten op te nimmen, hechtsje ik in memorabele foto fan 2017 mei twa rektors: Peter Scharff (rjochts) en Albert Kharisovich Gilmutdinov (links).

"Manifest foar begjinnende programmeurs fan besibbe spesjaliteiten" of hoe't ik op dit punt yn it libben kaam

It wie de muoite wurdich om it programma op syn minst foar dizze kostúms ôf te meitsjen! (grapje)

Boarne: www.habr.com

Add a comment