“Manifest voor beginnende programmeurs met aanverwante specialismen” of hoe ik op dit punt in mijn leven terechtkwam

Mijn artikel van vandaag zijn hardop gedachten van een persoon die bijna per ongeluk (zij het natuurlijk) het pad van programmeren heeft ingeslagen.

Ja, ik begrijp dat mijn ervaring slechts mijn ervaring is, maar het lijkt mij dat deze goed in de algemene trend past. Bovendien heeft de hieronder beschreven ervaring meer betrekking op het gebied van wetenschappelijke activiteit, maar wat is in vredesnaam geen grapje: het kan buiten nuttig zijn.

“Manifest voor beginnende programmeurs met aanverwante specialismen” of hoe ik op dit punt in mijn leven terechtkwam
Bron: https://xkcd.com/664/

Over het algemeen opgedragen aan alle huidige studenten van een oud-student!

Verwachtingen

Toen ik in 2014 mijn bachelor Infocommunicatietechnologieën en Communicatiesystemen afrondde, wist ik vrijwel niets van de wereld van programmeren. Ja, net als vele anderen heb ik het vak 'Informatica' in mijn eerste jaar gevolgd - maar, Heer, het was in mijn eerste jaar! Het is een eeuwigheid geleden!

Over het algemeen had ik niets bijzonders anders verwacht van een bachelordiploma en toen ik aan de masteropleiding begon "Communicatie en signaalverwerking" Duits-Russisch Instituut voor Nieuwe Technologieën.

Maar tevergeefs...

We waren pas de tweede lichting, en de jongens van de eerste waren nog steeds hun koffers aan het pakken voor het verre Duitsland (de stage duurt zes maanden in het tweede jaar van een masteropleiding). Met andere woorden: niemand uit de directe omgeving was nog serieus in aanraking gekomen met de methoden van het Europese onderwijs, en er was niemand die naar de details vroeg.

In ons eerste jaar hadden we natuurlijk verschillende soorten praktijken, waarin we meestal op democratische wijze de keuze kregen tussen het schrijven van scripts (voornamelijk in de MATLAB-taal) en het gebruik van verschillende zeer gespecialiseerde GUI’s (in de zin dat zonder het schrijven van scripts - simulatie modelleringsomgevingen).

“Manifest voor beginnende programmeurs met aanverwante specialismen” of hoe ik op dit punt in mijn leven terechtkwam

Het is onnodig om te zeggen dat wij, de toekomstige Masters of Science, uit onze jeugdige domheid het schrijven van code als vuur vermeden. Hier staat bijvoorbeeld Simulink van MathWorks: hier staan ​​de blokken, hier staan ​​de aansluitingen, hier staan ​​allerlei instellingen en schakelaars.

Een visie die eigen en begrijpelijk is voor iemand die eerder in circuitontwerp en systeemtechniek heeft gewerkt!

“Manifest voor beginnende programmeurs met aanverwante specialismen” of hoe ik op dit punt in mijn leven terechtkwam
Bron: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Dus het leek ons...

realiteit

Eén van de praktische werkzaamheden van het eerste semester was de ontwikkeling van een OFDM-signaaltransceiver als onderdeel van het vak “Methoden voor modellering en optimalisatie”. Het idee is zeer succesvol: de technologie is nog steeds relevant en behoorlijk populair vanwege het gebruik ervan in bijvoorbeeld Wi-Fi en LTE/LTE-A-netwerken (in de vorm van OFDMA). Dit is het beste voor meesters om hun vaardigheden in het modelleren van telecomsystemen te oefenen.

“Manifest voor beginnende programmeurs met aanverwante specialismen” of hoe ik op dit punt in mijn leven terechtkwam

En nu krijgen we verschillende opties voor technische specificaties met duidelijk onpraktische frameparameters (om niet op internet naar een oplossing te zoeken), en we springen op de reeds genoemde Simulink... En we worden met een theepot op ons hoofd geslagen van de werkelijkheid:

  • Elk blok is beladen met veel onbekende parameters, die eng zijn om in een mum van tijd te veranderen.
  • De manipulaties met cijfers moeten worden gedaan, zo lijkt het, eenvoudig, maar je moet je nog steeds druk maken, God verhoede het.
  • Kathedraalmachines vertragen merkbaar door het hectische gebruik van de GUI, zelfs tijdens het surfen door bibliotheken met beschikbare blokken.
  • Om thuis iets af te maken, heb je dezelfde Simulink nodig. En eigenlijk zijn er geen alternatieven.

Ja, uiteindelijk hebben we het project natuurlijk voltooid, maar we hebben het met een luide uitademing van opluchting voltooid.

Er ging enige tijd voorbij en we kwamen aan het einde van het eerste jaar van de masteropleiding. De hoeveelheid huiswerk met behulp van GUI's begon evenredig te dalen met de toename van het aandeel Duitse vakken, hoewel het punt van een paradigmaverschuiving nog niet was bereikt. Velen van ons, waaronder ikzelf, die onze aanzienlijke omvang om op te bouwen overwonnen, gebruikten steeds meer Matlab in onze wetenschappelijke projecten (zij het in de vorm van Toolboxes), en niet het ogenschijnlijk bekende Simulink.

Het punt van onze twijfel was de zin van een van de tweedejaarsstudenten (ze waren toen net teruggekeerd naar Rusland):

  • Vergeet, tenminste voor de duur van de stage, Similink, MathCad en andere LabView - alles is in MATLAB geschreven, met behulp van MatLab zelf of de gratis "versie" Octave.

De stelling bleek gedeeltelijk waar: in Ilmenau was het geschil over de keuze van de gereedschappen ook niet volledig opgelost. Toegegeven, de keuze ging vooral tussen MATLAB, Python en C.

Op dezelfde dag werd ik overvallen door een natuurlijke opwinding: zou ik mijn deel van het OFDM-zendermodel niet in een scriptvorm moeten omzetten? Voor de lol.

En ik ging aan het werk.

Stap voor stap

In plaats van theoretische berekeningen zal ik hier eenvoudigweg een link naar geven uitstekend artikel 2011 vanaf tgx en op de glijbanen LTE fysieke laag professoren Michel-Tila (TU Ilmenau). Ik denk dat dit genoeg zal zijn.

“Dus,” dacht ik, “laten we herhalen, wat gaan we modelleren?”
Wij zullen modelleren OFDM-framegenerator (OFDM-framegenerator).

Wat het zal omvatten:

  • informatie symbolen
  • piloot signalen
  • nullen (DC)

Waar we (voor de eenvoud) van abstraheren:

  • van het modelleren van een cyclisch voorvoegsel (als je de basis kent, zal het toevoegen ervan niet moeilijk zijn)

“Manifest voor beginnende programmeurs met aanverwante specialismen” of hoe ik op dit punt in mijn leven terechtkwam

Blokdiagram van het beschouwde model. We stoppen bij het inverse FFT (IFFT) blok. Om het plaatje compleet te maken kan iedereen zelf verder met de rest - ik heb de docenten van de afdeling beloofd iets achter te laten voor de leerlingen.

Laten we die voor onszelf definiëren. oefening:

  • vast aantal subdragers;
  • vaste framelengte;
  • we moeten één nul in het midden en een paar nullen aan het begin en einde van het frame toevoegen (totaal, 5 stuks);
  • informatiesymbolen worden gemoduleerd met behulp van M-PSK of M-QAM, waarbij M de modulatievolgorde is.

Laten we beginnen met de code.

Het volledige script kan worden gedownload van link.

Laten we de invoerparameters definiëren:

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

Nu bepalen we de indices van informatiesymbolen, waarbij we het uitgangspunt aanvaarden dat pilootsignalen noodzakelijkerwijs vóór en/of na nullen moeten 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;

Vervolgens kunnen de posities worden bepaald met behulp van de functie linspatie, waarbij de waarden worden teruggebracht tot de kleinste van de dichtstbijzijnde gehele 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

Laten we hier indexen van nullen aan toevoegen en sorteren:

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

Dienovereenkomstig zijn de pilootsignaalindices al het andere:

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

Laten we nu de signalen van de piloten begrijpen.

We hebben een sjabloon (variabel piloten), en laten we zeggen dat we willen dat piloten uit deze sjabloon opeenvolgend in ons frame worden ingevoegd. Uiteraard kan dit in een lus worden gedaan. Of je kunt een beetje lastig spelen met matrices - gelukkig kun je dit met MATLAB met voldoende comfort doen.

Laten we eerst bepalen hoeveel van deze sjablonen volledig in het frame passen:

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

Vervolgens vormen we een vector die bestaat uit onze sjablonen:

% 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 we definiëren een kleine vector die slechts een deel van de sjabloon bevat - de "staart", die niet volledig in het 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

We krijgen pilootkarakters:

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

Laten we verder gaan met de informatiesymbolen, namelijk: we zullen een boodschap vormen en deze moduleren:

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 klaar! Monteren van het frame:

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

Je zou zoiets als dit moeten krijgen:

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

"Gelukzaligheid!" — dacht ik tevreden en sloot de laptop. Het kostte me een paar uur om alles te doen: inclusief het schrijven van code, het leren van enkele Matlab-functies en het bedenken van wiskundige trucjes.

Welke conclusies heb ik toen getrokken?

Subjectief:

  • Code schrijven is prettig en lijkt op poëzie!
  • Scripting is de handigste onderzoeksmethode op het gebied van Communicatie en Signaalverwerking.

Objectief:

  • Het is niet nodig om mussen met een kanon af te schieten (tenzij een dergelijk educatief doel natuurlijk de moeite waard is): met behulp van Simulink hebben we een eenvoudig probleem opgelost met een geavanceerd hulpmiddel.
  • GUI is goed, maar begrijpen wat er “onder de motorkap” zit, is beter.

En nu ik nog lang geen student ben, wil ik het volgende tegen de studentenvereniging zeggen:

  • Goede moed!

Probeer code te schrijven, ook al is het in eerste instantie slecht. Bij programmeren is, net als bij elke andere activiteit, het begin het moeilijkste deel. En het is beter om eerder te beginnen: als je een wetenschapper bent of zelfs maar een techneut, zul je deze vaardigheid vroeg of laat nodig hebben.

  • Vraag naar!

Vraag progressieve benaderingen en hulpmiddelen van leraren en supervisors. Als dit mogelijk is natuurlijk...

  • Creëren!

Waar anders is het beter om alle zweren van een beginner te overwinnen, zo niet in het kader van een educatief programma? Creëer en verbeter uw vaardigheden - nogmaals, hoe eerder u begint, hoe beter.

Aspirant-programmeurs uit alle landen, verenigt u!

PS

Om mijn directe relatie met studenten vast te leggen, voeg ik een gedenkwaardige foto van 2017 toe met twee rectoren: Peter Scharff (rechts) en Albert Kharisovich Gilmutdinov (links).

“Manifest voor beginnende programmeurs met aanverwante specialismen” of hoe ik op dit punt in mijn leven terechtkwam

Het was de moeite waard om het programma in ieder geval voor deze kostuums af te maken! (grapje)

Bron: www.habr.com

Voeg een reactie