"Manifesto para sa pagsisimula ng mga programmer mula sa mga kaugnay na specialty" o kung paano ako nakarating sa puntong ito ng buhay

Ang aking artikulo ngayon ay mga saloobin nang malakas mula sa isang tao na kinuha ang landas ng programming halos hindi sinasadya (kahit na natural).

Oo, naiintindihan ko na ang aking karanasan ay ang aking karanasan lamang, ngunit tila sa akin ay angkop ito sa pangkalahatang kalakaran. Bukod dito, ang karanasang inilarawan sa ibaba ay higit na nauugnay sa larangan ng aktibidad na pang-agham, ngunit kung ano ang hindi biro - maaari itong maging kapaki-pakinabang sa labas.

"Manifesto para sa pagsisimula ng mga programmer mula sa mga kaugnay na specialty" o kung paano ako nakarating sa puntong ito ng buhay
Pinagmulan: https://xkcd.com/664/

Sa pangkalahatan, nakatuon sa lahat ng kasalukuyang estudyante mula sa isang dating estudyante!

Inaasahan

Nang makumpleto ko ang aking bachelor's degree sa Infocommunication Technologies at Communication Systems noong 2014, halos wala akong alam tungkol sa mundo ng programming. Oo, tulad ng marami pang iba, kinuha ko ang asignaturang "Computer Science" sa aking unang taon - ngunit, Panginoon, ito ay sa aking unang taon! Ito ay isang kawalang-hanggan!

Sa pangkalahatan, hindi ko inaasahan ang anumang partikular na naiiba mula sa isang bachelor's degree, at nang pumasok ako sa programa ng master "Komunikasyon at Pagproseso ng Signal" German-Russian Institute of New Technologies.

Ngunit walang kabuluhan...

Pangalawang intake lang kami, at ang mga lalaki mula sa una ay nag-iimpake pa rin ng kanilang mga bag para sa malayong Germany (ang internship ay tumatagal ng anim na buwan sa ikalawang taon ng master's degree). Sa madaling salita, walang sinuman mula sa agarang bilog ang seryosong nakatagpo ng mga pamamaraan ng edukasyon sa Europa, at walang sinuman ang magtanong tungkol sa mga detalye.

Sa aming unang taon, siyempre, mayroon kaming iba't ibang uri ng mga kasanayan, kung saan kami ay karaniwang demokratikong inaalok ng isang pagpipilian sa pagitan ng pagsulat ng mga script (pangunahin sa wikang MATLAB) at paggamit ng iba't ibang mga highly specialized na GUI (sa diwa na walang pagsulat ng mga script - simulation mga kapaligiran sa pagmomodelo).

"Manifesto para sa pagsisimula ng mga programmer mula sa mga kaugnay na specialty" o kung paano ako nakarating sa puntong ito ng buhay

Hindi na kailangang sabihin, kami, ang hinaharap na Masters of Science, sa aming kabataang katangahan, ay umiwas sa pagsulat ng code na parang apoy. Narito, halimbawa, ang Simulink mula sa MathWorks: narito ang mga bloke, narito ang mga koneksyon, narito ang lahat ng uri ng mga setting at switch.

Isang pananaw na katutubo at naiintindihan ng isang taong dati nang nagtrabaho sa disenyo ng circuit at engineering ng mga sistema!

"Manifesto para sa pagsisimula ng mga programmer mula sa mga kaugnay na specialty" o kung paano ako nakarating sa puntong ito ng buhay
Pinagmulan: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Kaya parang sa amin...

Katotohanan

Isa sa mga praktikal na gawain ng unang semestre ay ang pagbuo ng isang OFDM signal transceiver bilang bahagi ng paksang "Mga Paraan para sa Pagmomodelo at Pag-optimize". Ang ideya ay napaka-matagumpay: ang teknolohiya ay may kaugnayan pa rin at medyo popular dahil sa paggamit nito, halimbawa, sa Wi-Fi at LTE/LTE-A network (sa anyo ng OFDMA). Ito ang pinakamagandang bagay para sa mga master na magsanay ng kanilang mga kasanayan sa pagmomodelo ng mga sistema ng telecom.

"Manifesto para sa pagsisimula ng mga programmer mula sa mga kaugnay na specialty" o kung paano ako nakarating sa puntong ito ng buhay

At ngayon ay binibigyan kami ng ilang mga opsyon ng teknikal na mga pagtutukoy na may malinaw na hindi praktikal na mga parameter ng frame (upang hindi maghanap ng solusyon sa Internet), at kami ay sumunggab sa nabanggit na Simulink... At kami ay natamaan sa ulo ng isang tsarera. ng katotohanan:

  • Ang bawat bloke ay puno ng maraming hindi kilalang mga parameter, na nakakatakot na baguhin sa drop ng isang sumbrero.
  • Ang mga manipulasyon na may mga numero ay kailangang gawin, tila, simple, ngunit kailangan mo pa ring magpakaabala, huwag sana.
  • Ang mga makina ng Cathedral ay kapansin-pansing bumagal mula sa galit na galit na paggamit ng GUI, kahit na sa yugto ng pag-surf sa mga aklatan ng magagamit na mga bloke.
  • Upang tapusin ang isang bagay sa bahay, kailangan mong magkaroon ng parehong Simulink. At, sa katunayan, walang mga alternatibo.

Oo, sa huli, siyempre, natapos namin ang proyekto, ngunit natapos namin ito sa isang malakas na pagbuga ng kaluwagan.

Lumipas ang ilang oras, at dumating kami sa pagtatapos ng unang taon ng master's degree. Ang dami ng araling-bahay gamit ang mga GUI ay nagsimulang bumaba nang proporsyonal sa pagtaas ng proporsyon ng mga paksang Aleman, bagama't hindi pa ito umabot sa punto ng pagbabago ng paradigm. Marami sa atin, kasama ako, ang nagtagumpay sa ating malaking amplitude upang mabuo, parami nang parami ang gumagamit ng Matlab sa ating mga siyentipikong proyekto (kahit na sa anyo ng mga Toolbox), at hindi ang tila pamilyar na Simulink.

Ang punto sa aming mga pagdududa ay ang parirala ng isa sa mga mag-aaral sa ikalawang taon (kababalik lang nila sa Russia noong panahong iyon):

  • Kalimutan, hindi bababa sa tagal ng internship, tungkol sa Similink, MathCad at iba pang LabView - sa ibabaw ng burol lahat ay nakasulat sa MATLAB, gamit ang MatLab mismo o ang libreng "bersyon" nitong Octave.

Ang pahayag ay naging bahagyang totoo: sa Ilmenau, ang hindi pagkakaunawaan sa pagpili ng mga tool ay hindi rin ganap na nalutas. Totoo, ang pagpipilian ay karamihan sa pagitan ng MATLAB, Python at C.

Sa parehong araw, ako ay kinuha ng isang natural na kaguluhan: hindi ko ba dapat ilipat ang aking bahagi ng OFDM transmitter model sa isang scripted form? Katuwaan lang.

At kailangan kong magtrabaho.

Hakbang-hakbang

Sa halip na mga teoretikal na pagkalkula, magbibigay lang ako ng isang link dito mahusay na artikulo 2011 mula sa tgx at sa mga slide LTE pisikal na layer mga propesor Michel-Tila (TU Ilmenau). Sa tingin ko ito ay magiging sapat na.

"Kaya," naisip ko, "ulitin natin, ano ang gagawin nating modelo?"
Magmomodel tayo OFDM frame generator (OFDM frame generator).

Ano ang isasama nito:

  • mga simbolo ng impormasyon
  • mga signal ng piloto
  • mga zero (DC)

Ano (para sa kapakanan ng pagiging simple) ang nakuha namin mula sa:

  • mula sa pagmomodelo ng cyclic prefix (kung alam mo ang mga pangunahing kaalaman, hindi ito magiging mahirap idagdag)

"Manifesto para sa pagsisimula ng mga programmer mula sa mga kaugnay na specialty" o kung paano ako nakarating sa puntong ito ng buhay

Block diagram ng modelong isinasaalang-alang. Titigil tayo sa inverse FFT (IFFT) block. Upang makumpleto ang larawan, lahat ay maaaring ipagpatuloy ang natitira sa kanilang sarili - Nangako ako sa mga guro mula sa departamento na mag-iwan ng isang bagay para sa mga mag-aaral.

Tukuyin natin ang mga iyon para sa ating sarili. ehersisyo:

  • nakapirming bilang ng mga sub-carrier;
  • nakapirming haba ng frame;
  • dapat tayong magdagdag ng isang zero sa gitna at isang pares ng mga zero sa simula at dulo ng frame (kabuuan, 5 piraso);
  • ang mga simbolo ng impormasyon ay modulated gamit ang M-PSK o M-QAM, kung saan ang M ay ang modulation order.

Magsimula tayo sa code.

Maaaring ma-download ang buong script mula sa link.

Tukuyin natin ang mga parameter ng 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

Ngayon ay tinutukoy namin ang mga indeks ng mga simbolo ng impormasyon, tinatanggap ang premise na ang mga pilot signal ay dapat mauna bago at/o pagkatapos ng mga zero:

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

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

Pagkatapos ay matukoy ang mga posisyon gamit ang function linspace, binabawasan ang mga halaga sa pinakamaliit sa pinakamalapit na integer:

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

Magdagdag tayo ng mga index ng mga zero dito at pag-uri-uriin:

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

Alinsunod dito, ang mga indeks ng pilot signal ay lahat ng iba pa:

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

Ngayon unawain natin ang mga pilot signal.

Mayroon kaming isang template (variable piloto), at sabihin nating gusto namin ang mga piloto mula sa template na ito na maipasok sa aming frame nang sunud-sunod. Siyempre, ito ay maaaring gawin sa isang loop. O maaari kang maglaro ng medyo nakakalito sa mga matrice - sa kabutihang palad, pinapayagan ka ng MATLAB na gawin ito nang may sapat na kaginhawahan.

Una, tukuyin natin kung ilan sa mga template na ito ang ganap na akma sa frame:

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

Susunod, bumubuo kami ng isang vector na binubuo ng aming mga template:

% 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

At tinukoy namin ang isang maliit na vector na naglalaman lamang ng isang piraso ng template - ang "buntot", na hindi ganap na magkasya sa frame:

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

Kumuha kami ng mga pilot character:

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

Lumipat tayo sa mga simbolo ng impormasyon, ibig sabihin, bubuo tayo ng isang mensahe at i-modulate ito:

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 

Handa na ang lahat! Pagtitipon ng frame:

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

Dapat kang makakuha ng isang bagay tulad nito:

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

"Bliss!" β€” Kuntento kong naisip at isinara ang laptop. Inabot ako ng ilang oras upang gawin ang lahat: kabilang ang pagsusulat ng code, pag-aaral ng ilang mga function ng Matlab at pag-iisip sa pamamagitan ng mga mathematical trick.

Anong mga konklusyon ang ginawa ko noon?

Paksa:

  • Ang pagsulat ng code ay kaaya-aya at katulad ng tula!
  • Ang Scripting ay ang pinaka maginhawang paraan ng pananaliksik para sa larangan ng Komunikasyon at Pagproseso ng Signal.

Layunin:

  • Hindi na kailangang mag-shoot ng mga maya mula sa isang kanyon (maliban kung ang layuning pang-edukasyon ay, siyempre, sulit): gamit ang Simulink, kinuha namin ang paglutas ng isang simpleng problema gamit ang isang sopistikadong tool.
  • Ang GUI ay mabuti, ngunit ang pag-unawa sa kung ano ang nilalaman "sa ilalim ng hood" ay mas mahusay.

At ngayon, dahil malayo sa pagiging isang estudyante, gusto kong sabihin ang sumusunod sa kapatiran ng mag-aaral:

  • Maging ng magandang Cheer!

Subukang magsulat ng code, kahit na ito ay masama sa una. Sa programming, tulad ng anumang iba pang aktibidad, ang pinakamahirap na bahagi ay ang simula. At mas mahusay na magsimula nang mas maaga: kung ikaw ay isang siyentipiko o kahit na isang techie lamang, maaga o huli kakailanganin mo ang kasanayang ito.

  • Demand!

Humingi ng mga progresibong diskarte at tool mula sa mga guro at superbisor. Kung ito ay posible, siyempre ...

  • Lumikha!

Saan pa ba mas mahusay na malampasan ang lahat ng mga sugat ng isang baguhan, kung hindi sa loob ng balangkas ng isang programang pang-edukasyon? Lumikha at mahasa ang iyong mga kasanayan - muli, mas maaga kang magsimula, mas mabuti.

Mga naghahangad na programmer mula sa lahat ng bansa, magkaisa!

PS

Upang maitala ang aking direktang relasyon sa mga mag-aaral, inilakip ko ang isang di-malilimutang larawan ng 2017 kasama ang dalawang rektor: Peter Scharff (sa kanan) at Albert Kharisovich Gilmutdinov (sa kaliwa).

"Manifesto para sa pagsisimula ng mga programmer mula sa mga kaugnay na specialty" o kung paano ako nakarating sa puntong ito ng buhay

Ito ay nagkakahalaga ng pagtatapos ng programa ng hindi bababa sa para sa mga costume na ito! (nagbibiro)

Pinagmulan: www.habr.com

Magdagdag ng komento