"Manifestu per i programatori principianti da specialità rilativi" o cumu aghju ghjuntu à questu puntu in a vita

U mo articulu d'oghje hè pinsamenti à voce alta da una persona chì hà pigliatu a strada di prugrammazione guasi per accidenti (ancu se naturalmente).

Iè, aghju capitu chì a mo sperienza hè solu a mo sperienza, ma mi pari chì si mette bè in a tendenza generale. Inoltre, l'esperienze descritte quì sottu sò più in u campu di l'attività scientifica, ma ciò chì l'infernu ùn hè micca scherzu - pò esse utile fora.

"Manifestu per i programatori principianti da specialità rilativi" o cumu aghju ghjuntu à questu puntu in a vita
Source: https://xkcd.com/664/

In generale, dedicatu à tutti i studienti attuali da un ex studiente!

Aspettative

Quandu aghju finitu u mo bachelor in Tecnulugie di l'Infocomunicazione è Sistemi di Comunicazione in 2014, ùn sapia quasi nunda di u mondu di a prugrammazione. Iè, cum'è parechji altri, aghju pigliatu u sughjettu "Computer Science" in u mo primu annu - ma, Signore, era in u mo primu annu! Hè stata una eternità !

In generale, ùn m'aspittava nunda di particulari sfarente da un diploma di bachelor, è quandu aghju intrutu in u prugramma di maestru "Communication and Signal Processing" Istitutu Germanu-Russu di Nuvelle Tecnulugie.

Ma in vain...

Eramu solu a seconda ingesta, è i picciotti di u primu eranu sempre impacchendu i so sacchetti per a Germania distanti (u stage dura sei mesi in u secondu annu di u prugramma di u maestru). In altri palori, nimu di u circondu immediata ùn avia ancu scontru seriamente i metudi di l'educazione europea, è ùn ci era nimu per dumandà i dettagli.

In u nostru primu annu, di sicuru, avemu avutu varii tipi di pratiche, in quale ci sò stati generalmente pruposti demucraticamente una scelta trà scrittura scripts (principalmente in a lingua MATLAB) è utilizendu diverse GUI altamente specializate (in u sensu chì senza scrive scripts - simulazione). ambienti di mudellu).

"Manifestu per i programatori principianti da specialità rilativi" o cumu aghju ghjuntu à questu puntu in a vita

Inutili, noi, i futuri Maestri di Scienze, da a nostra stupidità di ghjuventù, evitemu di scrive codice cum'è u focu. Eccu, per esempiu, Simulink da MathWorks: quì sò i blocchi, quì sò e cunnessione, quì sò tutti i tipi di paràmetri è switches.

Una vista chì hè nativa è comprensibile per una persona chì hà travagliatu prima in u disignu di circuiti è ingegneria di sistemi!

"Manifestu per i programatori principianti da specialità rilativi" o cumu aghju ghjuntu à questu puntu in a vita
Source: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Allora ci hè parsu...

Reality

Unu di i travaglii pratichi di u primu semestru hè statu u sviluppu di un transceiver di signale OFDM cum'è parte di u sughjettu "Metodi per Mudelle è Optimization". L'idea hè assai successu: a tecnulugia hè sempre pertinenti è abbastanza populari per via di u so usu, per esempiu, in e rete Wi-Fi è LTE / LTE-A (in a forma di OFDMA). Questu hè u megliu per i maestri per praticà e so cumpetenze in mudelli di sistemi di telecomunicazione.

"Manifestu per i programatori principianti da specialità rilativi" o cumu aghju ghjuntu à questu puntu in a vita

È avà ci sò datu parechje opzioni di specificazioni tecniche cù paràmetri di quadru ovviamente impraticabili (per ùn circà una suluzione in Internet), è si sbattemu nantu à u Simulink digià citatu ... È avemu culpitu nantu à a testa cù una teiera. di a realità:

  • Ogni bloccu hè chjappu cù assai paràmetri scunnisciuti, chì sò spaventosi per cambià à a goccia di un cappellu.
  • I manipulazioni cù i numeri deve esse fattu, pare, simplicità, ma avete sempre à fussi, Diu ùn ci vole.
  • Macchine cattedrale rallenta notevolmente da l'usu freneticu di a GUI, ancu in a tappa di navigazione à traversu biblioteche di blocchi dispunibili.
  • Per finisce qualcosa in casa, avete bisognu à avè u listessu Simulink. È, in fatti, ùn ci hè micca alternative.

Iè, à a fine avemu, sicuru, cumpletu u prughjettu, ma l'avemu cumpletu cù una exhalation forte di sollievu.

Qualchì tempu passava, è avemu ghjuntu à a fine di u primu annu di u maestru. A quantità di i travaglii chì utilizanu GUI hà cuminciatu à falà proporzionalmente cù l'aumentu di a proporzione di sughjetti tedeschi, ancu s'ellu ùn avia ancu ghjuntu à u puntu di un cambiamentu di paradigma. Parechje di noi, cumpresu mè, superendu a nostra amplitude considerable per custruisce, più è più utilizatu Matlab in i nostri prughjetti scientifichi (anche in forma di Toolboxes), è micca u Simulink apparentemente familiar.

U puntu in i nostri dubbii era a frasa di unu di i studienti di u sicondu annu (eranu tornatu in Russia à quellu tempu):

  • Scurdate, almenu per a durata di u stage, circa Similink, MathCad è altri LabView - sopra a muntagna tuttu hè scrittu in MATLAB, utilizendu MatLab stessu o a so "versione" libera Octave.

A dichjarazione hè stata in parte vera: in Ilmenau, a disputa nantu à l'scelta di l'arnesi ùn hè micca stata cumpletamente risolta. Hè veru, a scelta era principalmente trà MATLAB, Python è C.

In u stessu ghjornu, aghju statu pigliatu da una eccitazione naturali: ùn deve micca trasfiriri a mo parte di u mudellu di trasmettitore OFDM in una forma scripted? Solu per piacè.

È aghju avutu à travaglià.

Passu dopu

Invece di calculi teorichi, daraghju solu un ligame à questu eccellente articulu 2011 da tgx è nantu à i slides Stratu fisicu LTE prufessori Michel-Tila (TU Ilmenau). Pensu chì questu serà abbastanza.

"Allora", aghju pensatu, "ripetemu, chì andemu à modellu?"
Avemu modellu Generatore di frame OFDM (generatore di frame OFDM).

Ciò chì includerà:

  • simboli d'infurmazione
  • signali di pilotu
  • zeros (DC)

Chì (per a simplicità) avemu astrattu da:

  • da u modellu di un prefissu ciclicu (se cunnosci i principii, aghjunghjendu ùn serà micca difficiule)

"Manifestu per i programatori principianti da specialità rilativi" o cumu aghju ghjuntu à questu puntu in a vita

Schema di bloccu di u mudellu in cunsiderà. Ci fermemu à u bloccu FFT inversu (IFFT). Per compie a stampa, ognunu pò cuntinuà u restu stessu - aghju prumessu à i prufessori di u dipartimentu di lascià qualcosa per i studienti.

Definimu quelli per noi stessi. eserciziu:

  • numeru fissu di sub-trasportatori;
  • lunghezza di quadru fissu;
  • duvemu aghjunghje un cero in u mità è un paru di cero à u principiu è a fine di u quadru (totale, 5 pezzi);
  • I simboli di l'infurmazioni sò modulati cù M-PSK o M-QAM, induve M hè l'ordine di modulazione.

Accuminciamu cù u codice.

U script sanu pò esse scaricatu da a lea.

Definimu i paràmetri di input:

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

Avà determinà l'indici di i simboli d'infurmazioni, accettendu a premessa chì i signali di pilotu devenu necessariamente andà prima è / o dopu zeri:

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

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

Allora e pusizioni ponu esse determinate cù a funzione linspace, riducendu i valori à u più chjucu di l'interi più vicinu:

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

Aghjunghjite indici di zeri à questu è sorte:

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

Per quessa, l'indici di signale pilotu sò tuttu u restu:

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

Avà capimu i signali di pilotu.

Avemu un mudellu (variable piloti), è dicemu chì vulemu chì i piloti da stu mudellu sò inseriti in u nostru quadru sequentially. Di sicuru, questu pò esse fattu in un ciclu. O pudete ghjucà un pocu complicatu cù matrici - per furtuna MATLAB vi permette di fà questu cun abbastanza cunfortu.

Prima, determinemu quanti di sti mudelli sò cumpletamente in u quadru:

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

In seguitu, formemu un vettore chì hè custituitu da i nostri mudelli:

% 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

E avemu definitu un picculu vettore chì cuntene solu un pezzu di u mudellu - a "coda", chì ùn si mette micca cumpletamente in u quadru:

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

Avemu i caratteri piloti:

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

Passemu à i simboli di l'infurmazioni, vale à dì, formeremu un missaghju è u moduleremu:

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 

Tuttu hè prontu ! Assemblage u quadru:

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

Duvete ottene qualcosa cum'è questu:

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

"Beatitudine!" - Pensu cuntentu è chjusu u laptop. Mi pigliò un paru d'ore per fà tuttu: cumpresu scrive codice, amparà alcune funzioni di Matlab è pensendu à i trucchi matematichi.

Chì cunclusioni aghju fattu allora ?

Sughjettivu:

  • U codice di scrittura hè piacevule è simile à a puesia !
  • U scripting hè u metudu di ricerca più convenientu per u campu di a cumunicazione è l'elaborazione di u signale.

Ughjettivu:

  • Ùn ci hè bisognu di sparà sparrows da un cannone (salvo chì un tali scopu educativu hè, sicuru, vale a pena): utilizendu Simulink, avemu pigliatu à risolve un prublema simplice cù un strumentu sofisticatu.
  • GUI hè bonu, ma capisce ciò chì hè cuntenutu "sottu u cappucciu" hè megliu.

È avà, essendu luntanu da esse un studiente, vogliu dì ciò chì segue à a fraternità studiente :

  • Dare!

Pruvate di scrive codice, ancu s'ellu hè male in prima. Cù prugrammazione, cum'è cù qualsiasi altra attività, a parte più dura hè u principiu. È hè megliu principià prima: sè vo site un scientist o ancu solu un tecnicu, prima o dopu avete bisognu di sta abilità.

  • A dumanda !

Esige approcci progressivi è strumenti da i prufessori è i supervisori. Sì questu hè pussibule, sicuru ...

  • Crea!

Induve altru hè megliu per superà tutte e ferite di un principiante, se micca in u quadru di un prugramma educativu? Crea è affinà e vostre cumpetenze - di novu, più prestu cuminciate, megliu.

Aspiranti programatori di tutti i paesi, unite!

PS

Per registrà a mo relazione diretta cù i studienti, aghju attaccatu una foto memorable di 2017 cù dui rettori: Peter Scharff (à a diritta) è Albert Kharisovich Gilmutdinov (à a manca).

"Manifestu per i programatori principianti da specialità rilativi" o cumu aghju ghjuntu à questu puntu in a vita

Valeva a pena di finisce u prugramma almenu per issi costumi ! (scherza)

Source: www.habr.com

Add a comment