"Manifest för nybörjare från relaterade specialiteter" eller hur jag kom till denna punkt i livet

Min artikel idag är tankar högt från en person som tog programmeringsvägen nästan av en slump (om än naturligt).

Ja, jag förstår att min erfarenhet bara är min erfarenhet, men det verkar för mig att det passar bra in i den allmänna trenden. Dessutom är erfarenheten som beskrivs nedan mer relaterad till området för vetenskaplig verksamhet, men vad fan inte skojar - det kan vara användbart utanför.

"Manifest för nybörjare från relaterade specialiteter" eller hur jag kom till denna punkt i livet
Källa: https://xkcd.com/664/

I allmänhet tillägnad alla nuvarande studenter från en tidigare student!

Förväntningar

När jag avslutade min kandidatexamen i infokommunikationsteknik och kommunikationssystem 2014 visste jag nästan ingenting om programmeringsvärlden. Ja, som många andra tog jag ämnet "Datavetenskap" under mitt första år - men herre, det var under mitt första år! Det har varit en evighet!

I allmänhet förväntade jag mig inte något särskilt annorlunda från en kandidatexamen, och när jag gick in på masterprogrammet "Kommunikation och signalbehandling" tysk-ryska institutet för ny teknik.

Men förgäves...

Vi var bara det andra intaget, och killarna från det första packade fortfarande sina väskor till det avlägsna Tyskland (praktiken tar sex månader under andra året av en magisterexamen). Med andra ord, ingen från den närmaste kretsen hade ännu på allvar stött på metoderna för europeisk utbildning, och det fanns ingen att fråga om detaljerna.

Under vårt första år hade vi naturligtvis olika typer av praktiker, där vi vanligtvis demokratiskt erbjöds att välja mellan att skriva manus (främst på MATLAB-språket) och att använda olika högspecialiserade GUI:er (i den meningen att utan att skriva manus - simulering modelleringsmiljöer).

"Manifest för nybörjare från relaterade specialiteter" eller hur jag kom till denna punkt i livet

Det behöver inte sägas att vi, de framtida magisterna, av vår ungdomliga dumhet undvek att skriva kod som eld. Här är till exempel Simulink från MathWorks: här är blocken, här är anslutningarna, här är alla typer av inställningar och switchar.

En syn som är infödd och förståelig för en person som tidigare har arbetat med kretsdesign och systemteknik!

"Manifest för nybörjare från relaterade specialiteter" eller hur jag kom till denna punkt i livet
Källa: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Så det verkade för oss...

Verkligheten

Ett av de praktiska arbetena under den första terminen var utvecklingen av en OFDM-signalsändare som en del av ämnet "Metoder för modellering och optimering". Idén är mycket framgångsrik: tekniken är fortfarande relevant och ganska populär på grund av dess användning, till exempel i Wi-Fi och LTE/LTE-A-nätverk (i form av OFDMA). Detta är det bästa för mästare att öva sina färdigheter i att modellera telekomsystem.

"Manifest för nybörjare från relaterade specialiteter" eller hur jag kom till denna punkt i livet

Och nu får vi flera alternativ för tekniska specifikationer med uppenbarligen opraktiska ramparametrar (för att inte leta efter en lösning på Internet), och vi kastar oss på den redan nämnda Simulink... Och vi blir träffade i huvudet med en tekanna av verkligheten:

  • Varje block är fyllt med många okända parametrar, som är läskiga att ändra på en enda gång.
  • Manipuleringarna med siffror måste göras, det verkar enkelt, men man måste ändå bråka, gud förbjude.
  • Katedralmaskiner saktar märkbart ner från den frenetiska användningen av det grafiska användargränssnittet, även när de surfar genom bibliotek med tillgängliga block.
  • För att avsluta något hemma måste du ha samma Simulink. Och faktiskt inga alternativ.

Ja, till slut slutförde vi förstås projektet, men vi avslutade det med en högljudd utandning av lättnad.

Det gick en tid och vi kom till slutet av det första året på magisterexamen. Mängden läxor med GUI började minska proportionellt med ökningen av andelen tyska ämnen, även om det ännu inte hade nått punkten för ett paradigmskifte. Många av oss, inklusive jag, övervinner vår avsevärda amplitud att bygga upp, mer och mer använde Matlab i våra vetenskapliga projekt (om än i form av verktygslådor), och inte den till synes välbekanta Simulink.

Poängen i våra tvivel var frasen från en av andraårsstudenterna (de hade just återvänt till Ryssland vid den tiden):

  • Glöm, åtminstone under praktikperioden, Similink, MathCad och andra LabView - över backen skrivs allt i MATLAB, med MatLab själv eller dess gratis "version" Octave.

Påståendet visade sig vara delvis sant: i Ilmenau var tvisten om valet av verktyg inte heller helt löst. Det är sant att valet mest stod mellan MATLAB, Python och C.

Samma dag blev jag tagen av en naturlig upphetsning: borde jag inte överföra min del av OFDM-sändarmodellen till en skriptform? För skojs skull.

Och jag fick jobba.

Steg för steg

Istället för teoretiska beräkningar ger jag helt enkelt en länk till detta utmärkt artikel 2011 från tgx och på rutschbanorna LTE fysiskt lager professorer Michel-Tila (TU Ilmenau). Jag tror att det här kommer att räcka.

"Så," tänkte jag, "låt oss upprepa, vad ska vi modellera?"
Vi kommer att modellera OFDM ramgenerator (OFDM ramgenerator).

Vad det kommer att innehålla:

  • informationssymboler
  • pilotsignaler
  • nollor (DC)

Vad vi (för enkelhetens skull) abstraherar från:

  • från att modellera ett cykliskt prefix (om du kan grunderna är det inte svårt att lägga till det)

"Manifest för nybörjare från relaterade specialiteter" eller hur jag kom till denna punkt i livet

Blockschema över den aktuella modellen. Vi stannar vid det omvända FFT-blocket (IFFT). För att fullborda bilden kan alla fortsätta resten själva – jag lovade lärarna från institutionen att lämna något till eleverna.

Låt oss definiera dem för oss själva. träning:

  • fast antal underoperatörer;
  • fast ramlängd;
  • vi måste lägga till en nolla i mitten och ett par nollor i början och slutet av ramen (totalt 5 stycken);
  • informationssymboler moduleras med användning av M-PSK eller M-QAM, där M är moduleringsordningen.

Låt oss börja med koden.

Hela skriptet kan laddas ner från länk.

Låt oss definiera ingångsparametrarna:

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 bestämmer vi indexen för informationssymboler och accepterar premissen att pilotsignaler nödvändigtvis måste gå före och/eller efter nollor:

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

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

Sedan kan positionerna bestämmas med hjälp av funktionen linspace, reducera värdena till det minsta av de närmaste 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

Låt oss lägga till index med nollor till detta och sortera:

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

Följaktligen är pilotsignalindexen allt annat:

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

Låt oss nu förstå pilotsignaler.

Vi har en mall (variabel piloter), och låt oss säga att vi vill att piloter från den här mallen ska infogas i vår ram sekventiellt. Naturligtvis kan detta göras i en slinga. Eller så kan du spela lite knepigt med matriser - lyckligtvis låter MATLAB dig göra detta med tillräcklig komfort.

Låt oss först avgöra hur många av dessa mallar som passar helt in i ramen:

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

Därefter bildar vi en vektor som består av våra mallar:

% 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

Och vi definierar en liten vektor som bara innehåller en del av mallen - "svansen", som inte passar helt in i ramen:

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 pilotkaraktärer:

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

Låt oss gå vidare till informationssymboler, nämligen, vi kommer att bilda ett meddelande och modulera det:

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 

Allt är klart! Montering av ramen:

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

Du borde få något sånt här:

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

"Salighet!" — Jag tänkte nöjt och stängde den bärbara datorn. Det tog mig ett par timmar att göra allt: inklusive att skriva kod, lära mig några Matlab-funktioner och tänka igenom matematiska knep.

Vilka slutsatser drog jag då?

Subjektiv:

  • Att skriva kod är trevligt och liknar poesi!
  • Skript är den mest bekväma forskningsmetoden för området kommunikation och signalbehandling.

Mål:

  • Det finns inget behov av att skjuta sparvar från en kanon (såvida inte ett sådant utbildningsmål naturligtvis är värt det): med Simulink tog vi på oss att lösa ett enkelt problem med ett sofistikerat verktyg.
  • GUI är bra, men att förstå vad som finns "under huven" är bättre.

Och nu, eftersom jag är långt ifrån en student, vill jag säga följande till studentbröderskapet:

  • Var vid gott mod!

Försök att skriva kod, även om det är dåligt i början. Med programmering, som med alla andra aktiviteter, är den svåraste delen början. Och det är bättre att börja tidigare: om du är en vetenskapsman eller till och med bara en tekniker, kommer du förr eller senare att behöva denna färdighet.

  • Efterfrågan!

Kräv progressiva tillvägagångssätt och verktyg från lärare och handledare. Om detta är möjligt såklart...

  • Skapa!

Var annars är det bättre att komma över alla sår hos en nybörjare, om inte inom ramen för ett utbildningsprogram? Skapa och finslipa dina färdigheter – återigen, ju tidigare du börjar, desto bättre.

Aspirerande programmerare från alla länder, förena er!

PS

För att registrera min direkta relation till studenter bifogar jag ett minnesvärt foto från 2017 med två rektorer: Peter Scharff (till höger) och Albert Kharisovich Gilmutdinov (till vänster).

"Manifest för nybörjare från relaterade specialiteter" eller hur jag kom till denna punkt i livet

Det var värt att avsluta programmet åtminstone för dessa kostymer! (skämtar)

Källa: will.com

Lägg en kommentar