"Manifest per a programadors principiants d'especialitats relacionades" o com vaig arribar fins a aquest punt de la vida

El meu article d'avui és pensaments en veu alta d'una persona que va agafar el camí de la programació gairebé per accident (encara que de manera natural).

Sí, entenc que la meva experiència és només la meva experiència, però em sembla que encaixa bé en la tendència general. A més, l'experiència que es descriu a continuació es relaciona més amb l'àmbit de l'activitat científica, però qui sap, pot ser útil fora.

"Manifest per a programadors principiants d'especialitats relacionades" o com vaig arribar fins a aquest punt de la vida
Font: https://xkcd.com/664/

En general, dedicat a tots els alumnes actuals d'un antic alumne!

Expectatives

Quan vaig acabar el meu grau en Tecnologies de la Infocomunicació i Sistemes de Comunicació l'any 2014, gairebé no sabia res del món de la programació. Sí, com molts altres, vaig cursar l'assignatura "Informàtica" al primer any, però, Senyor, era al primer any! Ha estat una eternitat!

En general, no esperava res especialment diferent d'un grau, i quan vaig entrar al programa de màster "Comunicació i processament del senyal" Institut Alemany-Rus de Noves Tecnologies.

Però en va...

Només érem la segona admissió, i els nois de la primera encara estaven fent les maletes per a la llunyana Alemanya (les pràctiques duran sis mesos al segon any de màster). En altres paraules, ningú del cercle immediat s'havia trobat encara seriosament amb els mètodes de l'educació europea i no hi havia ningú a qui preguntar-ne els detalls.

Durant el nostre primer any, per descomptat, vam tenir diferents tipus de pràctiques, en les quals normalment se'ns oferia democràticament la possibilitat d'escollir entre escriure scripts (principalment en llenguatge MATLAB) i utilitzar diverses GUI altament especialitzades (en el sentit que sense escriure scripts - simulació). entorns de modelització).

"Manifest per a programadors principiants d'especialitats relacionades" o com vaig arribar fins a aquest punt de la vida

No cal dir que nosaltres, els futurs mestres en ciències, per la nostra estupidesa juvenil, vam evitar escriure codi com el foc. Aquí, per exemple, hi ha Simulink de MathWorks: aquí teniu els blocs, aquí teniu les connexions, aquí hi ha tot tipus de configuracions i interruptors.

Una visió nativa i comprensible per a una persona que hagi treballat prèviament en disseny de circuits i enginyeria de sistemes!

"Manifest per a programadors principiants d'especialitats relacionades" o com vaig arribar fins a aquest punt de la vida
Font: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Així ens va semblar...

Realitat

Un dels treballs pràctics del primer semestre va ser el desenvolupament d'un transceptor de senyal OFDM dins de l'assignatura “Mètodes de modelització i optimització”. La idea té molt d'èxit: la tecnologia segueix sent rellevant i força popular pel seu ús, per exemple, en xarxes Wi-Fi i LTE/LTE-A (en forma d'OFDMA). Això és el millor perquè els mestres practiquin les seves habilitats en el modelatge de sistemes de telecomunicacions.

"Manifest per a programadors principiants d'especialitats relacionades" o com vaig arribar fins a aquest punt de la vida

I ara ens donen diverses opcions d'especificacions tècniques amb paràmetres de marc òbviament poc pràctics (per no buscar una solució a Internet), i ens aboquem al ja esmentat Simulink... I ens colpejam al cap amb una tetera. de la realitat:

  • Cada bloc està ple de molts paràmetres desconeguts, que fan por de canviar-los de cop.
  • Les manipulacions amb números s'han de fer, sembla senzill, però encara us heu d'enrenou, Déu n'hi do.
  • Les màquines de la catedral disminueixen notablement a causa de l'ús frenètic de la GUI, fins i tot en l'etapa de navegar per les biblioteques de blocs disponibles.
  • Per acabar alguna cosa a casa, cal tenir el mateix Simulink. I, de fet, no hi ha alternatives.

Sí, al final, és clar, vam acabar el projecte, però el vam completar amb una forta exhalació d'alleujament.

Va passar un temps, i vam arribar al final del primer curs del màster. La quantitat de deures utilitzant GUI va començar a disminuir proporcionalment amb l'augment de la proporció d'assignatures alemanyes, tot i que encara no havia arribat al punt d'un canvi de paradigma. Molts de nosaltres, inclòs jo, superant la nostra considerable amplitud per construir, vam utilitzar cada cop més Matlab en els nostres projectes científics (encara que en forma de caixes d'eines), i no l'aparentment familiar Simulink.

El punt dels nostres dubtes era la frase d'un dels alumnes de segon (en aquell moment acabaven de tornar a Rússia):

  • Oblideu-vos, almenys durant la durada de les pràctiques, de Similink, MathCad i altres LabView: per sobre del turó, tot està escrit a MATLAB, utilitzant el mateix MatLab o la seva "versió" gratuïta Octave.

L'afirmació va resultar ser en part certa: a Ilmenau, la disputa sobre l'elecció de les eines tampoc no es va resoldre del tot. És cert que l'elecció va ser principalment entre MATLAB, Python i C.

El mateix dia, em va agafar una emoció natural: no hauria de transferir la meva part del model de transmissor OFDM a una forma de guió? Només per diversió.

I em vaig posar mans a la feina.

Pas a pas

En lloc de càlculs teòrics, simplement donaré un enllaç a això excel·lent article 2011 des de tgx i a les diapositives Capa física LTE professors Michel-Tila (TU Ilmenau). Crec que això serà suficient.

"Així", vaig pensar, "repetim, què modelarem?"
Modelarem Generador de trames OFDM (Generador de trames OFDM).

Què inclourà:

  • símbols d'informació
  • senyals pilot
  • zeros (DC)

De què (per simplificar) abstrem:

  • de modelar un prefix cíclic (si coneixeu els conceptes bàsics, afegir-lo no serà difícil)

"Manifest per a programadors principiants d'especialitats relacionades" o com vaig arribar fins a aquest punt de la vida

Diagrama de blocs del model considerat. Ens aturarem al bloc FFT invers (IFFT). Per completar la imatge, tothom pot continuar amb la resta - vaig prometre als professors del departament que deixarien alguna cosa per als alumnes.

Definim-los per nosaltres mateixos. exercici:

  • nombre fix de subportadors;
  • longitud fixa del marc;
  • hem d'afegir un zero al mig i un parell de zeros al principi i al final del quadre (total, 5 peces);
  • els símbols d'informació es modulen mitjançant M-PSK o M-QAM, on M és l'ordre de modulació.

Comencem pel codi.

Tot el guió es pot descarregar des de enllaç.

Definim els paràmetres d'entrada:

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

Ara determinem els índexs dels símbols d'informació, acceptant la premissa que els senyals pilot han d'anar necessàriament abans i/o després dels zeros:

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

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

A continuació, es poden determinar les posicions mitjançant la funció linspace, reduint els valors al més petit dels enters més propers:

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

Afegim índexs de zeros a això i ordenem:

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

En conseqüència, els índexs de senyal pilot són tota la resta:

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

Ara entenem els senyals pilot.

Tenim una plantilla (variable pilots), i diguem que volem que els pilots d'aquesta plantilla s'insereixin al nostre marc seqüencialment. Per descomptat, això es pot fer en bucle. O podeu jugar una mica complicat amb les matrius; afortunadament, MATLAB us permet fer-ho amb la comoditat suficient.

Primer, determinem quantes d'aquestes plantilles encaixen completament al marc:

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

A continuació, formem un vector que consta de les nostres plantilles:

% 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

I definim un petit vector que només conté una part de la plantilla: la "cua", que no encaixa completament en el marc:

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

Obtenim personatges pilot:

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

Passem als símbols d'informació, és a dir, formarem un missatge i el modularem:

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 

Tot a punt! Muntatge del marc:

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

Hauríeu d'obtenir alguna cosa com això:

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

"Felicitat!" — Vaig pensar satisfet i vaig tancar l'ordinador portàtil. Em va costar un parell d'hores fer-ho tot: incloent escriure codi, aprendre algunes funcions de Matlab i pensar en trucs matemàtics.

Quines conclusions vaig treure aleshores?

Subjetiva:

  • Escriure codi és agradable i semblant a la poesia!
  • Els scripts són el mètode de recerca més convenient per al camp de la comunicació i el processament del senyal.

Objectiu:

  • No cal disparar pardals des d'un canó (tret que aquest objectiu educatiu valgui la pena, és clar): amb Simulink, vam assumir la resolució d'un problema senzill amb una eina sofisticada.
  • La GUI és bona, però entendre el que hi ha "sota el capó" és millor.

I ara, lluny de ser estudiant, vull dir el següent a la fraternitat estudiantil:

  • Atreveu-vos!

Intenta escriure codi, encara que al principi sigui dolent. Amb la programació, com amb qualsevol altra activitat, el més difícil és el començament. I és millor començar abans: si sou un científic o fins i tot només un tècnic, tard o d'hora necessitareu aquesta habilitat.

  • Demanda!

Exigir enfocaments i eines progressistes als professors i supervisors. Si això és possible, és clar...

  • Crear!

On més és millor superar totes les nafres d'un principiant, si no en el marc d'un programa educatiu? Crea i perfecciona les teves habilitats; de nou, com més aviat comencis, millor.

Aspirants a programadors de tots els països, uniu-vos!

PS

Per tal de deixar constància de la meva relació directa amb els estudiants, adjunto una foto memorable del 2017 amb dos rectors: Peter Scharff (dreta) i Albert Kharisovich Gilmutdinov (esquerra).

"Manifest per a programadors principiants d'especialitats relacionades" o com vaig arribar fins a aquest punt de la vida

Valia la pena acabar el programa almenys per aquestes disfresses! (broma)

Font: www.habr.com

Afegeix comentari