"Manifest for begyndende programmører fra relaterede specialer" eller hvordan jeg kom til dette punkt i livet

Min artikel i dag er tanker højt fra en person, der tog programmeringsvejen nærmest ved et uheld (omend naturligt).

Ja, jeg forstår, at min erfaring bare er min erfaring, men det forekommer mig, at det passer godt ind i den generelle tendens. Desuden relaterer oplevelsen, der er beskrevet nedenfor, mere til området for videnskabelig aktivitet, men hvad fanden er det ikke for sjov - det kan være nyttigt udenfor.

"Manifest for begyndende programmører fra relaterede specialer" eller hvordan jeg kom til dette punkt i livet
Kilde: https://xkcd.com/664/

Generelt dedikeret til alle nuværende studerende fra en tidligere studerende!

forventninger

Da jeg i 2014 afsluttede min bachelor i Infokommunikationsteknologier og kommunikationssystemer, vidste jeg næsten intet om programmeringsverdenen. Ja, som mange andre tog jeg faget "Computer Science" på mit første år - men Herre, det var på mit første år! Det har været en evighed!

Generelt havde jeg ikke forventet noget særligt anderledes end en bachelor, og da jeg kom ind på kandidatuddannelsen "Kommunikation og signalbehandling" Tysk-Russisk Institut for Ny Teknologi.

Men forgæves...

Vi var kun den anden optagelse, og fyrene fra den første pakkede stadig deres kufferter til det fjerne Tyskland (praktikken tager seks måneder på det andet år af en kandidatuddannelse). Med andre ord, ingen fra den nærmeste kreds havde endnu for alvor stødt på metoderne til europæisk uddannelse, og der var ingen til at spørge om detaljerne.

I vores første år havde vi selvfølgelig forskellige former for praksis, hvor vi normalt demokratisk blev tilbudt et valg mellem at skrive scripts (hovedsageligt på MATLAB-sproget) og at bruge forskellige højt specialiserede GUI'er (i den forstand, at uden at skrive scripts - simulering modelleringsmiljøer).

"Manifest for begyndende programmører fra relaterede specialer" eller hvordan jeg kom til dette punkt i livet

Det er overflødigt at sige, at vi, de fremtidige Masters of Science, på grund af vores ungdommelige dumhed undgik at skrive kode som ild. Her er for eksempel Simulink fra MathWorks: her er blokkene, her er forbindelserne, her er alle slags indstillinger og switches.

Et synspunkt, der er naturligt og forståeligt for en person, der tidligere har arbejdet med kredsløbsdesign og systemteknik!

"Manifest for begyndende programmører fra relaterede specialer" eller hvordan jeg kom til dette punkt i livet
Kilde: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Så det forekom os...

Reality

Et af de praktiske arbejder på første semester var udviklingen af ​​en OFDM signal transceiver som en del af faget "Metoder til modellering og optimering". Idéen er meget vellykket: teknologien er stadig relevant og ret populær på grund af dens brug, for eksempel i Wi-Fi og LTE/LTE-A-netværk (i form af OFDMA). Dette er den bedste ting for mestre at øve deres færdigheder i at modellere telekommunikationssystemer.

"Manifest for begyndende programmører fra relaterede specialer" eller hvordan jeg kom til dette punkt i livet

Og nu får vi flere muligheder for tekniske specifikationer med åbenlyst upraktiske rammeparametre (for ikke at lede efter en løsning på internettet), og vi kaster os over den allerede nævnte Simulink... Og vi bliver ramt i hovedet med en tekande af virkeligheden:

  • Hver blok er fyldt med en masse ukendte parametre, som er skræmmende at ændre med en enkelt hat.
  • Manipuleringerne med tal skal gøres, ser det ud til, at de er enkle, men du skal stadig bøvle, Gud forbyde det.
  • Katedralmaskiner sænker mærkbart farten fra den hektiske brug af GUI, selv på stadiet med at surfe gennem biblioteker med tilgængelige blokke.
  • For at afslutte noget derhjemme, skal du have den samme Simulink. Og faktisk ingen alternativer.

Ja, til sidst gennemførte vi selvfølgelig projektet, men vi gennemførte det med en højlydt udånding af lettelse.

Der gik noget tid, og vi nåede til slutningen af ​​det første år på kandidatuddannelsen. Mængden af ​​lektier ved hjælp af GUI'er begyndte at falde proportionalt med stigningen i andelen af ​​tyskfag, selvom det endnu ikke var nået til et paradigmeskifte. Mange af os, inklusive mig, der overvandt vores betydelige amplitude til at bygge op, brugte mere og mere Matlab i vores videnskabelige projekter (omend i form af Toolboxes), og ikke den tilsyneladende velkendte Simulink.

Pointen i vores tvivl var sætningen fra en af ​​de studerende på andet år (de var lige vendt tilbage til Rusland på det tidspunkt):

  • Glem, i det mindste i løbet af praktikperioden, om Similink, MathCad og andre LabView - over bakken er alt skrevet i MATLAB, ved hjælp af selve MatLab eller dens gratis "version" Octave.

Udsagnet viste sig at være delvist sandt: I Ilmenau var striden om valget af værktøjer heller ikke fuldstændig løst. Sandt nok stod valget for det meste mellem MATLAB, Python og C.

Samme dag blev jeg taget af en naturlig begejstring: skulle jeg ikke overføre min del af OFDM-sendermodellen til en scriptet form? Bare for sjov.

Og jeg kom på arbejde.

Trin for trin

I stedet for teoretiske udregninger vil jeg blot give et link til dette fremragende artikel 2011 fra tgx og på dias LTE fysisk lag professorer Michel-Tila (TU Ilmenau). Jeg tror, ​​det vil være nok.

"Så," tænkte jeg, "lad os gentage, hvad skal vi modellere?"
Vi vil modellere OFDM rammegenerator (OFDM frame generator).

Hvad det vil omfatte:

  • informationssymboler
  • pilotsignaler
  • nuller (DC)

Hvad vi (for nemheds skyld) abstraherer fra:

  • fra modellering af et cyklisk præfiks (hvis du kender det grundlæggende, vil det ikke være svært at tilføje det)

"Manifest for begyndende programmører fra relaterede specialer" eller hvordan jeg kom til dette punkt i livet

Blokdiagram over modellen under overvejelse. Vi stopper ved den omvendte FFT (IFFT) blok. For at fuldende billedet kan alle selv fortsætte resten – jeg lovede lærerne fra afdelingen at efterlade noget til eleverne.

Lad os definere dem for os selv. dyrke motion:

  • fast antal underoperatører;
  • fast rammelængde;
  • vi skal tilføje et nul i midten og et par nuller i begyndelsen og slutningen af ​​rammen (i alt 5 stykker);
  • informationssymboler moduleres ved hjælp af M-PSK eller M-QAM, hvor M er moduleringsrækkefølgen.

Lad os starte med koden.

Hele scriptet kan downloades fra link.

Lad os definere inputparametrene:

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 bestemmer vi indeksene for informationssymboler og accepterer den forudsætning, at pilotsignaler nødvendigvis skal gå før og/eller efter nuller:

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

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

Herefter kan positionerne bestemmes ved hjælp af funktionen linspace, reducere værdierne til det mindste af de nærmeste heltal:

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

Lad os tilføje indekser af nuller til dette og sortere:

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

Følgelig er pilotsignalindekserne alt andet:

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

Lad os nu forstå pilotsignaler.

Vi har en skabelon (variabel piloter), og lad os sige, at vi ønsker, at piloter fra denne skabelon skal indsættes i vores ramme sekventielt. Dette kan selvfølgelig gøres i en løkke. Eller du kan lege lidt tricky med matricer - heldigvis giver MATLAB dig mulighed for at gøre dette med tilstrækkelig komfort.

Lad os først bestemme, hvor mange af disse skabeloner, der passer helt ind i rammen:

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

Dernæst danner vi en vektor, der består af vores skabeloner:

% 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 lille vektor, der kun indeholder et stykke af skabelonen - "halen", som ikke passer helt ind 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 pilotfigurer:

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

Lad os gå videre til informationssymboler, nemlig at vi danner en besked og modulerer 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 klar! Samling af rammen:

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

Du burde få noget 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

"Glæde!" — Jeg tænkte tilfreds og lukkede den bærbare computer. Det tog mig et par timer at gøre alt: inklusive at skrive kode, lære nogle Matlab-funktioner og gennemtænke matematiske tricks.

Hvilke konklusioner trak jeg så?

Subjektiv:

  • At skrive kode er behageligt og beslægtet med poesi!
  • Scripting er den mest bekvemme forskningsmetode inden for kommunikation og signalbehandling.

Objektiv:

  • Der er ingen grund til at skyde spurve fra en kanon (medmindre et sådant uddannelsesmål selvfølgelig er det værd): ved at bruge Simulink påtog vi os at løse et simpelt problem med et sofistikeret værktøj.
  • GUI er god, men det er bedre at forstå, hvad der er indeholdt "under motorhjelmen".

Og nu, da jeg er langt fra at være studerende, vil jeg sige følgende til studenterbroderskabet:

  • Vær ved godt mod!

Prøv at skrive kode, selvom det er dårligt i starten. Med programmering, som med enhver anden aktivitet, er den sværeste del begyndelsen. Og det er bedre at starte tidligere: Hvis du er en videnskabsmand eller endda bare en tekniker, vil du før eller siden få brug for denne færdighed.

  • Efterspørgsel!

Kræv progressive tilgange og værktøjer fra lærere og vejledere. Hvis dette er muligt, selvfølgelig...

  • Skab!

Hvor ellers er det bedre at komme over alle de sår hos en begynder, hvis ikke inden for rammerne af et uddannelsesprogram? Skab og finpuds dine færdigheder – igen, jo før du starter, jo bedre.

Aspirerende programmører fra alle lande, foren dig!

PS

For at registrere mit direkte forhold til eleverne vedhæfter jeg et mindeværdigt foto fra 2017 med to rektorer: Peter Scharff (til højre) og Albert Kharisovich Gilmutdinov (til venstre).

"Manifest for begyndende programmører fra relaterede specialer" eller hvordan jeg kom til dette punkt i livet

Det var i det mindste værd at afslutte programmet for disse kostumer! (kigger)

Kilde: www.habr.com

Tilføj en kommentar