„Kiáltvány a kapcsolódó szakterületeken kezdő programozóknak” vagy hogyan jutottam el idáig az életemben

Mai cikkem egy olyan ember hangos gondolatai, aki szinte véletlenül (bár természetesen) a programozás útjára lépett.

Igen, megértem, hogy a tapasztalataim csak az én tapasztalataim, de számomra úgy tűnik, hogy ez jól illeszkedik az általános trendbe. Sőt, az alább leírt tapasztalatok inkább a tudományos tevékenység területére vonatkoznak, de mi a fene nem viccel - kívül is hasznos lehet.

„Kiáltvány a kapcsolódó szakterületeken kezdő programozóknak” vagy hogyan jutottam el idáig az életemben
Forrás: https://xkcd.com/664/

Általában minden jelenlegi diáknak szenteltem egy volt diáktól!

Elvárások

Amikor 2014-ben elvégeztem az Infokommunikációs Technológiák és Kommunikációs Rendszerek alapképzését, szinte semmit sem tudtam a programozás világáról. Igen, mint sokan mások, én is a „Számítástechnika” tárgyat vettem fel az első évben – de Uram, ez az első évben volt! Egy örökkévalóság telt el!

Általában nem számítottam semmi különösebbre egy alapképzéstől, és amikor beléptem a mesterképzésbe "Kommunikáció és jelfeldolgozás" Német-Orosz Új Technológiák Intézete.

De hiába...

Mi csak a második fogadó voltunk, és az első srácok még mindig a távoli Németországba pakoltak (a gyakorlat hat hónapig tart a mesterképzés második évében). Vagyis a közvetlen körből még senki sem találkozott komolyan az európai oktatás módszereivel, és nem volt kit kérdezni a részletekről.

Az első évfolyamunkban természetesen voltak különféle gyakorlataink, amelyek során általában demokratikusan választhattunk a szkriptek írása (főleg MATLAB nyelven) és a különféle speciális GUI-k használata (abban az értelemben, hogy szkriptek írása nélkül - szimuláció) között. modellező környezetek).

„Kiáltvány a kapcsolódó szakterületeken kezdő programozóknak” vagy hogyan jutottam el idáig az életemben

Mondanunk sem kell, hogy mi, a tudomány leendő mesterei fiatalkori butaságunkból elkerültük a kódírást, mint a tüzet. Itt van például a Simulink a MathWorksből: itt vannak a blokkok, itt a kapcsolatok, itt mindenféle beállítás és kapcsoló.

Olyan nézet, amely honos és érthető egy korábban áramkör-tervezésben és rendszermérnöki területen dolgozó ember számára!

„Kiáltvány a kapcsolódó szakterületeken kezdő programozóknak” vagy hogyan jutottam el idáig az életemben
Forrás: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Szóval nekünk úgy tűnt...

valóság

Az első félév egyik gyakorlati munkája egy OFDM jeladó-vevő kifejlesztése volt a „Modellezési és optimalizálási módszerek” tantárgy keretében. Az ötlet nagyon sikeres: a technológia még mindig aktuális és meglehetősen népszerű, mivel például Wi-Fi és LTE/LTE-A hálózatokban (OFDMA formájában) használják. Ez a legjobb, ha a mesterek gyakorolhatják tudásukat a távközlési rendszerek modellezésében.

„Kiáltvány a kapcsolódó szakterületeken kezdő programozóknak” vagy hogyan jutottam el idáig az életemben

Most pedig több lehetőséget is kapunk a műszaki specifikációkból, nyilvánvalóan kivitelezhetetlen vázparaméterekkel (hogy ne a neten keressünk megoldást), és nekicsapunk a már említett Simulinknek... És fejbe kapunk egy teáskannával a valóságról:

  • Minden blokk tele van sok ismeretlen paraméterrel, amelyeket ijesztő egy cseppnyire megváltoztatni.
  • A számokkal végzett manipulációkat egyszerűnek tűnik, de még mindig muszáj dumálni, ne adj Isten.
  • A katedrális gépei észrevehetően lelassulnak a grafikus felhasználói felület eszeveszett használatától, még az elérhető blokkok könyvtáraiban való böngészés szakaszában is.
  • Ahhoz, hogy otthon befejezzen valamit, ugyanaz a Simulink kell. És valójában nincs alternatíva.

Igen, a végén természetesen befejeztük a projektet, de hangos megkönnyebbüléssel fejeztük be.

Eltelt egy kis idő, és elérkeztünk a mesterképzés első évének végéhez. A GUI-t használó házi feladatok mennyisége a német tantárgyak arányának növekedésével arányosan csökkenni kezdett, bár paradigmaváltásig még nem ért el. Sokan közülünk, köztük én is, túllépve a nagy felépítési amplitúdónkat, egyre gyakrabban használtuk a Matlabot tudományos projektjeinkben (bár eszköztárak formájában), és nem a látszólag ismerős Simulinket.

Kétségeinkben a lényeg az egyik másodéves hallgató mondata volt (akkor éppen visszatértek Oroszországba):

  • Felejtsd el, legalább a gyakorlat idejére, a Similinket, a MathCad-et és a többi LabView-t - a domb túloldalán minden MATLAB-ban van megírva, magát a MatLabot vagy annak ingyenes „verzióját” az Octave-t.

Az állítás részben igaznak bizonyult: Ilmenauban az eszközválasztás körüli vita sem oldódott meg teljesen. Igaz, leginkább a MATLAB, a Python és a C között lehetett választani.

Ugyanezen a napon természetes izgalom fogott el: nem kellene átraknom az OFDM adómodell részemet forgatókönyves formába? A hecc kedvéért.

És dolgoznom kellett.

Lépésről lépésre

Elméleti számítások helyett egyszerűen linket adok ehhez kiváló cikk 2011-től tgx és a diákon LTE fizikai réteg professzorok Michel-Tila (TU Ilmenau). Szerintem ez elég lesz.

"Szóval" - gondoltam - "ismételjük meg, mit fogunk modellezni?"
Modellezni fogunk OFDM keretgenerátor (OFDM keretgenerátor).

Amit tartalmazni fog:

  • információs szimbólumok
  • pilótajelek
  • nullák (DC)

Amitől (az egyszerűség kedvéért) elvonatkoztatunk:

  • ciklikus előtag modellezéséből (ha ismeri az alapokat, a hozzáadása nem lesz nehéz)

„Kiáltvány a kapcsolódó szakterületeken kezdő programozóknak” vagy hogyan jutottam el idáig az életemben

A vizsgált modell blokkvázlata. Megállunk az inverz FFT (IFFT) blokknál. Hogy teljes legyen a kép, a többit mindenki maga folytathatja – megígértem a tanszéki tanároknak, hogy hagynak valamit a diákoknak.

Határozzuk meg ezeket magunknak. gyakorlat:

  • rögzített számú alvivő;
  • rögzített kerethossz;
  • a keret közepére egy nullát, elejére és végére egy nullapárt kell hozzáadnunk (összesen 5 db);
  • az információs szimbólumokat M-PSK vagy M-QAM segítségével modulálják, ahol M a modulációs sorrend.

Kezdjük a kóddal.

A teljes szkript letölthető innen link.

Határozzuk meg a bemeneti paramétereket:

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

Most meghatározzuk az információs szimbólumok indexeit, elfogadva azt a feltevést, hogy a pilotjeleknek szükségszerűen nullák előtt és/vagy után kell menniük:

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

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

Ezután a funkció segítségével meghatározhatók a pozíciók linspace, csökkentve az értékeket a legközelebbi egész számok közül a legkisebbre:

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

Adjunk ehhez nullák indexeit, és rendezzük:

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

Ennek megfelelően a pilotjel indexei minden más:

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

Most értsük meg a pilótajeleket.

Van egy sablonunk (változó pilóták), és tegyük fel, hogy az ebből a sablonból származó pilotokat szekvenciálisan szeretnénk beilleszteni a keretünkbe. Ez természetesen ciklusban is megtehető. Vagy játszhatsz egy kicsit trükkösen a mátrixokkal – szerencsére a MATLAB ezt megfelelő kényelemmel teszi lehetővé.

Először is határozzuk meg, hány ilyen sablon illeszkedik teljesen a keretbe:

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

Ezután létrehozunk egy vektort, amely a sablonjainkból áll:

% 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

És meghatározunk egy kis vektort, amely csak a sablon egy darabját tartalmazza - a „farkot”, amely nem illeszkedik teljesen a keretbe:

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

Pilóta karaktereket kapunk:

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

Térjünk át az információs szimbólumokra, vagyis egy üzenetet formálunk és moduláljuk:

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 

Minden készen áll! A keret összeszerelése:

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

Valami ilyesmit kellene kapnod:

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

"Boldogság!" — gondoltam elégedetten és becsuktam a laptopot. Néhány órába telt, mire mindent megcsináltam: kódot írni, Matlab függvényeket megtanulni és matematikai trükköket végiggondolni.

Milyen következtetéseket vontam le akkor?

Szubjektív:

  • A kódírás kellemes és a költészethez hasonló!
  • A szkriptelés a legkényelmesebb kutatási módszer a kommunikáció és a jelfeldolgozás területén.

Célkitűzés:

  • Nem kell ágyúból verebeket lőni (kivéve persze, ha egy ilyen nevelési cél megéri): a Simulink segítségével egy egyszerű feladat megoldását vállaltuk egy kifinomult eszközzel.
  • A grafikus felhasználói felület jó, de jobb megérteni, hogy mi található a „burkolat alatt”.

És most, mivel messze nem vagyok diák, a következőket szeretném mondani a diáktestvériségnek:

  • Bízzatok!

Próbálj meg kódot írni, még ha elsőre rossz is. A programozásnál, mint minden más tevékenységnél, a legnehezebb a kezdet. És jobb korábban kezdeni: ha tudós vagy akár csak technikus, előbb-utóbb szükséged lesz erre a készségre.

  • Igény!

Igényeljen progresszív megközelítéseket és eszközöket a tanároktól és a felügyelőktől. Ha ez lehetséges, persze...

  • Teremt!

Hol máshol jobb túllépni egy kezdő minden sebet, ha nem egy oktatási program keretében? Alkossd meg és fejleszd készségeidet – ismét, minél hamarabb kezded, annál jobb.

Törekvő programozók minden országból, egyesüljetek!

PS

A hallgatókkal való közvetlen kapcsolatom megörökítésére mellékelek egy emlékezetes fotót 2017-ről két rektorral: Peter Scharff (jobb oldalon) és Albert Kharisovich Gilmutdinov (bal oldalon).

„Kiáltvány a kapcsolódó szakterületeken kezdő programozóknak” vagy hogyan jutottam el idáig az életemben

Érdemes volt legalább ezekért a jelmezekért befejezni a programot! (viccel)

Forrás: will.com

Hozzászólás