"Manifesti aloitteleville ohjelmoijille lähialalta" eli miten pääsin tähän pisteeseen elämässä

Tämän päivän artikkelini on ajatuksia ääneen henkilöltä, joka valitsi ohjelmoinnin polun melkein vahingossa (tosin luonnollisesti).

Kyllä, ymmärrän, että kokemukseni on vain minun kokemukseni, mutta mielestäni se sopii hyvin yleiseen trendiin. Lisäksi alla kuvattu kokemus liittyy enemmän tieteellisen toiminnan alaan, mutta mitä helvettiä ei ole leikkiä - siitä voi olla hyötyä ulkopuolella.

"Manifesti aloitteleville ohjelmoijille lähialalta" eli miten pääsin tähän pisteeseen elämässä
Lähde: https://xkcd.com/664/

Yleensä omistettu kaikille entisen opiskelijan nykyisille opiskelijoille!

odotukset

Kun suoritin kandidaatin tutkinnon Infokommunikaatioteknologiasta ja viestintäjärjestelmistä vuonna 2014, en tiennyt ohjelmoinnin maailmasta juuri mitään. Kyllä, kuten monet muutkin, otin "tietotekniikan" -aineen ensimmäisenä vuonna - mutta Herra, se oli ensimmäinen vuosi! Siitä on ikuisuus!

Yleisesti ottaen en odottanut mitään erityisen poikkeavaa kandidaatin tutkinnosta ja maisteriohjelmaan tullessani "Viestintä ja signaalinkäsittely" Saksalais-venäläinen uusien teknologioiden instituutti.

Mutta turhaan...

Olimme vasta kakkosena, ja ensimmäisen jätkät pakkasivat vielä laukkujaan kaukaiseen Saksaan (harjoittelu kestää kuusi kuukautta maisterin tutkinnon toisena vuonna). Toisin sanoen kukaan lähipiiristä ei ollut vielä vakavasti törmännyt eurooppalaisen koulutuksen menetelmiin, eikä kukaan voinut kysyä yksityiskohtia.

Ensimmäisenä vuonna meillä oli tietysti monenlaisia ​​käytäntöjä, joissa meille yleensä tarjottiin demokraattisesti valita komentosarjojen kirjoittamisen (pääasiassa MATLAB-kielellä) ja erilaisten pitkälle erikoistuneiden graafisten käyttöliittymien välillä (sillä mielessä, että ilman komentosarjojen kirjoittamista - simulaatio). mallinnusympäristöt).

"Manifesti aloitteleville ohjelmoijille lähialalta" eli miten pääsin tähän pisteeseen elämässä

Sanomattakin on selvää, että me, tulevat maisterit, välttelimme nuoruuden tyhmyydestämme koodin kirjoittamista kuin tulta. Tässä on esimerkiksi Simulink MathWorksista: tässä on lohkot, tässä on liitännät, tässä on kaikenlaisia ​​asetuksia ja kytkimiä.

Näkymä, joka on syntyperäinen ja ymmärrettävä henkilölle, joka on aiemmin työskennellyt piirisuunnittelussa ja järjestelmäsuunnittelussa!

"Manifesti aloitteleville ohjelmoijille lähialalta" eli miten pääsin tähän pisteeseen elämässä
Lähde: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Joten meistä näytti...

Todellisuus

Yksi ensimmäisen lukukauden käytännön töistä oli OFDM-signaalilähetin-vastaanottimen kehittäminen osana "Methods for Modeling and Optimization" -oppiainetta. Idea on erittäin onnistunut: tekniikka on edelleen ajankohtainen ja melko suosittu johtuen sen käytöstä esimerkiksi Wi-Fi- ja LTE/LTE-A-verkoissa (OFDMA:n muodossa). Tämä on parasta mestareille harjoitella taitojaan tietoliikennejärjestelmien mallintamisessa.

"Manifesti aloitteleville ohjelmoijille lähialalta" eli miten pääsin tähän pisteeseen elämässä

Ja nyt meille annetaan useita vaihtoehtoja teknisistä eritelmistä ilmeisen epäkäytännöllisillä runkoparametreilla (jotta emme etsi ratkaisua Internetistä), ja törmätään jo mainittuun Simulinkiin... Ja saamme lyönnin päähän teekannulla todellisuudesta:

  • Jokainen lohko on täynnä monia tuntemattomia parametreja, joita on pelottavaa muuttaa heti hatun päästä.
  • Manipulaatiot numeroiden kanssa on tehtävä, näyttää yksinkertaiselta, mutta sinun täytyy silti hämmentää, Jumala varjelkoon.
  • Katedraalikoneet hidastavat huomattavasti graafisen käyttöliittymän kiihkeän käytön vuoksi, jopa käytettävissä olevien lohkojen kirjastojen läpi surffailuvaiheessa.
  • Jotta voit viimeistellä jotain kotona, sinulla on oltava sama Simulink. Eikä itse asiassa ole vaihtoehtoja.

Kyllä, lopulta saimme tietysti projektin päätökseen, mutta saimme sen valmiiksi äänekkäästi helpotuksesta.

Aikaa kului, ja tulimme maisterin tutkinnon ensimmäisen vuoden päätökseen. GUI-kotitehtävien määrä alkoi laskea suhteessa saksalaisten oppiaineiden osuuden kasvuun, vaikka se ei ollut vielä saavuttanut paradigman muutosta. Monet meistä, mukaan lukien minä, ylittäessään huomattavan rakentamisamplitudimme, käyttivät yhä enemmän Matlabia tieteellisissä projekteissamme (tosin Toolboxien muodossa), ei näennäisesti tuttua Simulinkiä.

Epäilyksemme kohta oli erään toisen vuoden opiskelijan lause (he olivat juuri palanneet Venäjälle siihen aikaan):

  • Unohda ainakin harjoittelun ajaksi Similink, MathCad ja muut LabView't - mäen yli kaikki on kirjoitettu MATLABilla käyttäen itse MatLabia tai sen ilmaista ”versiota” Octavea.

Väite osoittautui osittain todeksi: Ilmenaussa ei myöskään kiista työkalujen valinnasta täysin ratkennut. Totta, valinta oli enimmäkseen MATLABin, Pythonin ja C:n välillä.

Samana päivänä minut valtasi luonnollinen jännitys: eikö minun pitäisi siirtää osani OFDM-lähetinmallista käsikirjoitettuun muotoon? Huvin vuoksi.

Ja pääsin töihin.

Askel askeleelta

Teoreettisten laskelmien sijasta annan vain linkin tähän loistava artikkeli 2011 alkaen tgx ja dioissa LTE fyysinen kerros professori Michel-Tila (TU Ilmenau). Luulen, että tämä riittää.

"Joten", ajattelin, "toistetaan, mitä aiomme mallintaa?"
Me mallinnetaan OFDM-kehysgeneraattori (OFDM-kehysgeneraattori).

Mitä se sisältää:

  • tietosymbolit
  • pilottisignaalit
  • nollat ​​(DC)

Mistä (yksinkertaisuuden vuoksi) vedämme pois:

  • syklisen etuliitteen mallintamisesta (jos tiedät perusasiat, sen lisääminen ei ole vaikeaa)

"Manifesti aloitteleville ohjelmoijille lähialalta" eli miten pääsin tähän pisteeseen elämässä

Harkittavan mallin lohkokaavio. Pysähdymme käänteiseen FFT (IFFT) -lohkoon. Kuvan täydentämiseksi jokainen voi jatkaa loput itse - lupasin laitoksen opettajille jättää jotain opiskelijoille.

Määrittelemme ne itsellemme. Harjoittele:

  • kiinteä määrä alikantoaaltoja;
  • kiinteä rungon pituus;
  • meidän on lisättävä yksi nolla keskelle ja pari nollaa kehyksen alkuun ja loppuun (yhteensä 5 kpl);
  • informaatiosymbolit moduloidaan M-PSK:lla tai M-QAM:lla, missä M on modulaatiojärjestys.

Aloitetaan koodista.

Koko skripti voidaan ladata osoitteesta linkki.

Määritetään syöttöparametrit:

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

Nyt määritetään informaatiosymbolien indeksit hyväksyen olettamus, että pilottisignaalien täytyy välttämättä mennä nollien eteen ja/tai jälkeen:

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

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

Sitten paikat voidaan määrittää funktiolla linspace, vähentämällä arvot pienimpiin lähimmistä kokonaisluvuista:

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

Lisätään tähän nollien indeksit ja lajitellaan:

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

Näin ollen pilottisignaalin indeksit ovat kaikki muu:

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

Ymmärretään nyt pilottisignaalit.

Meillä on malli (muuttuja lentäjät), ja oletetaan, että haluamme, että tämän mallin pilotit lisätään kehykseemme peräkkäin. Tietysti tämä voidaan tehdä silmukassa. Tai voit leikkiä hieman hankalasti matriiseilla - onneksi MATLAB antaa sinun tehdä tämän riittävän mukavasti.

Määritetään ensin, kuinka monta näistä malleista sopii täydellisesti kehykseen:

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

Seuraavaksi muodostamme vektorin, joka koostuu malleistamme:

% 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

Ja määrittelemme pienen vektorin, joka sisältää vain osan mallista - "häntä", joka ei mahdu kokonaan kehykseen:

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

Saamme pilottihahmot:

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

Siirrytään tietosymboleihin, nimittäin muodostamme viestin ja moduloimme sitä:

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 

Kaikki on valmista! Rungon kokoaminen:

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

Sinun pitäisi saada jotain tällaista:

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

"Autuus!" — ajattelin tyytyväisenä ja suljin kannettavan tietokoneen. Minulla meni pari tuntia kaiken tekemiseen: mukaan lukien koodin kirjoittaminen, Matlabin funktioiden oppiminen ja matemaattisten temppujen miettiminen.

Mitä johtopäätöksiä sitten tein?

Subjektiivinen:

  • Koodin kirjoittaminen on miellyttävää ja runoutta muistuttavaa!
  • Skriptaus on kätevin tutkimusmenetelmä viestinnän ja signaalinkäsittelyn alalla.

Tavoite:

  • Ei tarvitse ampua varpusia tykistä (ellei tällainen opetustavoite tietysti ole sen arvoinen): Simulinkin avulla otimme yksinkertaisen ongelman ratkaisun hienostuneella työkalulla.
  • GUI on hyvä, mutta on parempi ymmärtää, mitä "konepellin alla" on.

Ja nyt, koska olen kaukana opiskelijasta, haluan sanoa seuraavaa opiskelijaveljeskunnalle:

  • Olkaa turvallisella mielellä!

Yritä kirjoittaa koodia, vaikka se olisi aluksi huono. Ohjelmoinnissa, kuten missä tahansa muussakin toiminnassa, vaikein osa on alku. Ja on parempi aloittaa aikaisemmin: jos olet tiedemies tai jopa vain teknikko, ennemmin tai myöhemmin tarvitset tätä taitoa.

  • Kysyntä!

Vaadi edistyksellisiä lähestymistapoja ja työkaluja opettajilta ja ohjaajilta. Jos tämä on mahdollista, tietysti...

  • Luoda!

Missä muualla on parempi päästä yli kaikista aloittelijan haavoista, ellei koulutusohjelman puitteissa? Luo ja hio taitojasi – jälleen kerran, mitä nopeammin aloitat, sitä parempi.

Pyrkivät ohjelmoijat kaikista maista, liittykää yhteen!

PS.

Tallentaakseni suoraa suhteeni opiskelijoihin liitän liitteenä ikimuistoisen kuvan vuodelta 2017 kahden rehtorin kanssa: Peter Scharff (oikealla) ja Albert Kharisovich Gilmutdinov (vasemmalla).

"Manifesti aloitteleville ohjelmoijille lähialalta" eli miten pääsin tähän pisteeseen elämässä

Ohjelma kannatti viimeistellä ainakin näiden pukujen takia! (vitsi)

Lähde: will.com

Lisää kommentti