"Manifest av begynnende programmerere fra relaterte spesialiteter" eller hvordan jeg kom til dette punktet i livet

Artikkelen min i dag er tanker høyt fra en person som tok programmeringsveien nærmest ved et uhell (riktignok naturlig).

Ja, jeg forstår at min erfaring bare er min erfaring, men det ser ut til at det passer godt inn i den generelle trenden. Dessuten er erfaringen beskrevet nedenfor mer knyttet til vitenskapelig aktivitet, men hva i helvete er ikke en spøk - det kan være nyttig utenfor.

"Manifest av begynnende programmerere fra relaterte spesialiteter" eller hvordan jeg kom til dette punktet i livet
Kilde: https://xkcd.com/664/

Generelt dedikert til alle nåværende studenter fra en tidligere student!

forventninger

Da jeg fullførte min bachelorgrad i infokommunikasjonsteknologi og kommunikasjonssystemer i 2014, visste jeg nesten ingenting om programmeringsverdenen. Ja, som mange andre tok jeg "Datavitenskap"-faget i mitt første år - men, Herre, det var i mitt første år! Det har vært en evighet!

Generelt forventet jeg ikke noe spesielt forskjellig fra en bachelorgrad, og da jeg begynte på masterstudiet "Kommunikasjon og signalbehandling" Tysk-russisk institutt for ny teknologi.

Men til ingen nytte...

Vi var bare det andre inntaket, og gutta fra det første holdt fortsatt på å pakke sekken for det fjerne Tyskland (praksisperioden tar seks måneder i det andre året av en mastergrad). Med andre ord, ingen fra den nærmeste kretsen hadde ennå for alvor møtt metodene for europeisk utdanning, og det var ingen til å spørre om detaljene.

Det første året vårt hadde vi selvfølgelig forskjellige typer praksis, der vi vanligvis demokratisk ble tilbudt et valg mellom å skrive skript (hovedsakelig på MATLAB-språket) og å bruke forskjellige høyt spesialiserte GUI-er (i den forstand at uten å skrive skript - simulering modelleringsmiljøer).

"Manifest av begynnende programmerere fra relaterte spesialiteter" eller hvordan jeg kom til dette punktet i livet

Unødvendig å si, unngikk vi, fremtidige Masters of Science, på grunn av vår ungdommelige dumhet å skrive kode som ild. Her er for eksempel Simulink fra MathWorks: her er blokkene, her er tilkoblingene, her er alle slags innstillinger og brytere.

Et syn som er naturlig og forståelig for en person som tidligere har jobbet med kretsdesign og systemteknikk!

"Manifest av begynnende programmerere fra relaterte spesialiteter" eller hvordan jeg kom til dette punktet i livet
Kilde: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Så det virket for oss...

Reality

Et av de praktiske arbeidene i det første semesteret var utviklingen av en OFDM-signaltransceiver som en del av faget "Metoder for modellering og optimalisering". Ideen er svært vellykket: teknologien er fortsatt relevant og ganske populær på grunn av bruken, for eksempel i Wi-Fi og LTE/LTE-A-nettverk (i form av OFDMA). Dette er det beste for mestere å øve ferdighetene sine i å modellere telekomsystemer.

"Manifest av begynnende programmerere fra relaterte spesialiteter" eller hvordan jeg kom til dette punktet i livet

Og nå får vi flere alternativer med tekniske spesifikasjoner med åpenbart upraktiske rammeparametere (for ikke å lete etter en løsning på Internett), og vi kaster oss over den allerede nevnte Simulink... Og vi blir slått på hodet med en tekanne av virkeligheten:

  • Hver blokk er full av mange ukjente parametere, som er skummelt å endre med en gang.
  • Manipulasjonene med tall må gjøres, virker det enkle, men du må fortsatt mase, Gud forby.
  • Katedralmaskiner bremser merkbart ned fra den frenetiske bruken av GUI, selv når de surfer gjennom biblioteker med tilgjengelige blokker.
  • For å fullføre noe hjemme, må du ha samme Simulink. Og faktisk ingen alternativer.

Ja, til slutt fullførte vi selvfølgelig prosjektet, men vi fullførte det med en høylytt utånding av lettelse.

Det gikk litt tid, og vi kom til slutten av første året på mastergraden. Mengden lekser ved bruk av GUI-er begynte å falle proporsjonalt med økningen i andelen tyske fag, selv om den ennå ikke hadde nådd et paradigmeskifte. Mange av oss, inkludert meg, overvant vår betydelige amplitude å bygge opp, mer og mer brukte Matlab i våre vitenskapelige prosjekter (riktignok i form av Toolboxes), og ikke den tilsynelatende kjente Simulink.

Poenget i tvilen vår var frasen til en av andreårsstudentene (de hadde nettopp returnert til Russland på den tiden):

  • Glem, i det minste i løpet av praksisperioden, om Similink, MathCad og andre LabView - over bakken er alt skrevet i MATLAB, ved å bruke MatLab selv eller dens gratis "versjon" Octave.

Utsagnet viste seg å være delvis sant: I Ilmenau var heller ikke striden om valg av verktøy fullstendig løst. Riktignok sto valget stort sett mellom MATLAB, Python og C.

Samme dag ble jeg tatt av en naturlig begeistring: burde jeg ikke overføre min del av OFDM-sendermodellen til en skriptet form? Bare for moro skyld.

Og jeg kom på jobb.

Steg for steg

I stedet for teoretiske beregninger vil jeg rett og slett gi en lenke til dette utmerket artikkel 2011 fra tgx og på lysbildene LTE fysisk lag professorer Michel-Tila (TU Ilmenau). Jeg tror dette blir nok.

"Så," tenkte jeg, "la oss gjenta, hva skal vi modellere?"
Vi skal modellere OFDM rammegenerator (OFDM-rammegenerator).

Hva den vil inneholde:

  • informasjonssymboler
  • pilotsignaler
  • nuller (DC)

Hva (for enkelhets skyld) abstraherer vi fra:

  • fra å modellere et syklisk prefiks (hvis du kan det grunnleggende, vil det ikke være vanskelig å legge til det)

"Manifest av begynnende programmerere fra relaterte spesialiteter" eller hvordan jeg kom til dette punktet i livet

Blokkdiagram av modellen under vurdering. Vi stopper ved den omvendte FFT-blokken (IFFT). For å fullføre bildet kan alle fortsette resten selv – jeg lovet lærerne fra instituttet å legge igjen noe til elevene.

La oss definere dem for oss selv. trening:

  • fast antall underoperatører;
  • fast rammelengde;
  • vi må legge til en null i midten og et par nuller i begynnelsen og slutten av rammen (totalt 5 stykker);
  • informasjonssymboler moduleres ved hjelp av M-PSK eller M-QAM, hvor M er modulasjonsrekkefølgen.

La oss starte med koden.

Hele skriptet kan lastes ned fra link.

La oss definere inngangsparametrene:

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

Nå bestemmer vi indeksene til informasjonssymboler, og aksepterer forutsetningen om at pilotsignaler nødvendigvis må gå før og/eller etter null:

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

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

Deretter kan posisjonene bestemmes ved hjelp av funksjonen linspace, redusere verdiene til det minste av de nærmeste heltallene:

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

La oss legge til indekser av nuller til dette og sortere:

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

Følgelig er pilotsignalindeksene alt annet:

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

La oss nå forstå pilotsignaler.

Vi har en mal (variabel piloter), og la oss si at vi vil at piloter fra denne malen skal settes inn i rammen vår sekvensielt. Dette kan selvfølgelig gjøres i en løkke. Eller du kan leke litt vanskelig med matriser - heldigvis lar MATLAB deg gjøre dette med tilstrekkelig komfort.

La oss først finne ut hvor mange av disse malene som passer helt inn i rammen:

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

Deretter danner vi en vektor som består av malene våre:

% 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

Og vi definerer en liten vektor som bare inneholder en del av malen - "halen", som ikke passer helt inn i rammen:

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

Vi får pilotkarakterer:

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

La oss gå videre til informasjonssymboler, nemlig vi vil danne en melding og modulere den:

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 

Alt er klart! Montering av rammen:

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

Du bør få noe sånt som dette:

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

"Lykksalighet!" — Jeg tenkte fornøyd og lukket den bærbare datamaskinen. Det tok meg et par timer å gjøre alt: inkludert å skrive kode, lære noen Matlab-funksjoner og tenke gjennom matematiske triks.

Hvilke konklusjoner trakk jeg da?

Subjektiv:

  • Å skrive kode er hyggelig og beslektet med poesi!
  • Skripting er den mest praktiske forskningsmetoden for feltet kommunikasjon og signalbehandling.

Objektiv:

  • Det er ikke nødvendig å skyte spurver fra en kanon (med mindre et slikt pedagogisk mål selvfølgelig er verdt det): ved å bruke Simulink tok vi på oss å løse et enkelt problem med et sofistikert verktøy.
  • GUI er bra, men det er bedre å forstå hva som finnes "under panseret".

Og nå, som er langt fra å være student, vil jeg si følgende til studentbrorskapet:

  • Vær ved godt mot!

Prøv å skrive kode, selv om det er dårlig i begynnelsen. Med programmering, som med all annen aktivitet, er den vanskeligste delen begynnelsen. Og det er bedre å begynne tidligere: hvis du er en vitenskapsmann eller til og med bare en tekniker, vil du før eller siden trenge denne ferdigheten.

  • Kreve!

Krev progressive tilnærminger og verktøy fra lærere og veiledere. Hvis dette er mulig, selvfølgelig...

  • Skape!

Hvor ellers er det bedre å komme over alle sårene til en nybegynner, hvis ikke innenfor rammen av et utdanningsprogram? Skap og finpusse ferdighetene dine – igjen, jo før du starter, jo bedre.

Aspirerende programmerere fra alle land, foren deg!

PS

For å registrere mitt direkte forhold til studentene, legger jeg ved et minneverdig bilde fra 2017 med to rektorer: Peter Scharff (til høyre) og Albert Kharisovich Gilmutdinov (til venstre).

"Manifest av begynnende programmerere fra relaterte spesialiteter" eller hvordan jeg kom til dette punktet i livet

Det var verdt å fullføre programmet i det minste for disse kostymene! (tuller)

Kilde: www.habr.com

Legg til en kommentar