"Маніфест пачаткоўцаў праграмістаў з сумежных спецыяльнасцяў" ці як я дайшоў да жыцця такі

Сённяшні мой артыкул - гэта думкі ўслых ад чалавека, які стаў на шлях праграмавання амаль выпадкова (хоць і заканамерна).

Так, я разумею, што мой досвед — гэта толькі мой досвед, аднак ён, мне здаецца, добра трапляе ў агульную тэндэнцыю. Больш за тое, вопыт, апісаны ніжэй, больш адносіцца да сферы навуковай дзейнасці, аднак чым чорт не жартуе - можа спатрэбіцца і па-за.

"Маніфест пачаткоўцаў праграмістаў з сумежных спецыяльнасцяў" ці як я дайшоў да жыцця такі
Крыніца: https://xkcd.com/664/

Увогуле, усім сапраўдным студэнтам ад былога студэнта прысвячаецца!

чакання

Калі ў 2014 годзе я заканчваў бакалаўрыят па спецыяльнасці «Інфакамунікацыйныя тэхналогіі і сістэмы сувязі» я амаль нічога не ведаў пра свет праграмавання. Так, у мяне, як і ў многіх, быў на першым курсе прадмет "Інфарматыка" - але, божа, гэта ж было на першым курсе! Прайшла цэлая вечнасць!

Увогуле і цэлым, нічога асабліва выдатнага ад бакалаўрыяту я не чакаў, і паступаючы на ​​магістарскую праграму "Communication and Signal Processing" Германа-Расійскага Інстытута Новых Тэхналогій.

А дарма…

Мы былі ўсяго другім наборам, і хлопцы з першага яшчэ толькі збіралі валізкі ў далёкую Нямеччыну (стажыроўка займае паўгода на другім курсе магістратуры). Інакш кажучы, ніхто з бліжэйшага кола яшчэ не сутыкаўся сур'ёзна з метадамі еўрапейскай адукацыі, і пытацца аб дэталях было асабліва няма ў каго.

Былі ў нас на першым курсе, вядома, рознага роду практыкі, на якіх звычайна нам дэмакратычна прапаноўваўся выбар паміж напісаннем скрыптоў (пераважна на мове MATLAB) і выкарыстаннем розных вузкаспецыялізаваных GUI (у тым сэнсе, што без напісання скрыптоў - асяроддзяў імітацыйнага мадэлявання).

"Маніфест пачаткоўцаў праграмістаў з сумежных спецыяльнасцяў" ці як я дайшоў да жыцця такі

Ці варта казаць, што мы, будучыя Masters of Science, па сваёй юнацкай дурасці, як агню, цураліся напісанні кода. Вось, ён, дапусцім, Simulink ад кампаніі MathWorks: вось яны блокі, вось яны сувязі, вось яны ўсякага роду налады і перамыкачы.

Родны і зразумелы для чалавека, які займаўся перш схематэхнікай і сістэматэхнікай, выгляд!

"Маніфест пачаткоўцаў праграмістаў з сумежных спецыяльнасцяў" ці як я дайшоў да жыцця такі
Крыніца: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Так нам здавалася...

Рэальнасць

Адной з практычных работ першага семестра была распрацоўка прыёмаперадатчыка OFDM сігналу ў рамках прадмета "Methods for Modeling and Optimization". Ідэя вельмі ўдалая: тэхналогія і дагэтуль актуальная і даволі папулярная ў сілу выкарыстання, напрыклад, у сетках Wi-Fi і LTE/LTE-A (у выглядзе OFDMA). Самае тое для магістраў, каб патрэніраваць навыкі мадэлявання целікам сістэм.

"Маніфест пачаткоўцаў праграмістаў з сумежных спецыяльнасцяў" ці як я дайшоў да жыцця такі

І вось на рукі нам выдаюць некалькі варыянтаў ТЗ з загадзя непрактычнымі параметрамі кадра (каб не шукаць рашэнне ў Інтэрнэце), і мы накідваемся на ўжо згаданы Simulink… І атрымліваем імбрычкам рэчаіснасці па галаве:

  • Кожны блок тоіць у сабе процьму невядомых параметраў, змяняць якія з кондачка - страшнавата.
  • Маніпуляцыі з лікамі зрабіць трэба, накшталт, простыя, аднак гарадзіць даводзіцца ўсё роўна дай божа.
  • Кафедральныя машыны прыкметна падтармажваюць ад ліхаманкавага выкарыстанне GUI, нават на этапе серфінгу па бібліятэках даступных блокаў.
  • Каб дарабіць нешта дома, трэба мець такі ж Simulink. І ніякіх, уласна, альтэрнатыў.

Так, праект у выніку мы, вядома, дарабілі, але дарабілі з гучным выдыхам палягчэння.

Прайшоў некаторы час, і мы падышлі да заканчэння першага курса магістратуры. Колькасць хатніх прац з выкарыстаннем GUI стала прапарцыйна спадаць з павелічэннем дзелі нямецкіх прадметаў, хоць яшчэ і не дасягала кропкі змены парадыгмы. Шмат хто з нас, уключаючы мяне, пераадольваючы сваю немалую амплітуду на разварушванне, усё больш і больш выкарыстоўвалі ў сваіх навуковых праектах менавіта Matlab (хай і ў выглядзе Toolbox'ов), а не знаёмы, здавалася б, Simulink.

Пунктам у нашых сумневах стала фраза аднаго са студэнтаў другога курсу (яны як раз да таго часу вярнуліся ў Расею):

  • Забудзьцеся, прынамсі на час стажыроўкі, пра Similink, MathCad і іншы LabView – за грудом усё пішуць на мове MATLAB, выкарыстоўваючы ўласна сам MatLab або яго бясплатную «версію» Octave.

Заява аказалася дакладнай збольшага: у Ільменау спрэчка аб выбары інструментарыя таксама не была вырашана да канца. Праўда, выбар стаяў збольшага паміж мовамі MATLAB, Python і C.

У той жа дзень мяне ўзяў заканамерны азарт: а не ці перанесці сваю частку мадэлі OFDM перадатчыка ў скрыптовую форму? Just for fun.

І я прыступіў да працы.

Крок за крокам

Замест тэарэтычных выкладак я проста дам спасылку на гэтую цудоўны артыкул 2011 года ад tgx і на слайды па фізічнаму ўзроўню LTE прафесара Мішэль-Ціля (ТУ Ільмэнаў). Я думаю, гэтага будзе дастаткова.

"Такім чынам, - падумаў я, - паўторым, што ж мы будзем мадэляваць?"
Мадэляваць будзем генератар OFDM кадра (OFDM frame generator).

Што ён будзе ўключаць:

  • інфармацыйныя сімвалы
  • пілотныя сігналы
  • нулі (DC)

Ад чаго (прастаты дзеля) мы абстрагуемся:

  • ад мадэлявання цыклічнага прэфікса (пры веданні асноў, дадаць ён ужо не складзе працы)

"Маніфест пачаткоўцаў праграмістаў з сумежных спецыяльнасцяў" ці як я дайшоў да жыцця такі

Блок-схема разгляданай мадэлі. Спынімся мы да блока зваротнага БПФ (IFFT). Астатняе для паўнаты карціны кожны можа працягнуць сам - я абяцаў выкладчыкам з кафедры пакінуць нешта і для студэнтаў.

Вызначым для сябе тых. заданне:

  • фіксаваная колькасць паднясучых (sub-carriers);
  • фіксаваная даўжыня кадра;
  • мы павінны дадаць адзін нуль у сярэдзіну і па пары нулёў да пачатку і канцу кадра (разам, 5 штук);
  • інфармацыйныя знакі мадулююцца з дапамогай M-PSK або M-QAM, дзе M - гэта парадак мадуляцыі.

Прыступаем да кода.

Скрыпт цалкам можна спампаваць па спасылцы.

Вызначым уваходныя параметры:

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

Цяпер вызначым індэксы інфармацыйных сімвалаў, прыняўшы перадумову, што пілотныя сігналы павінны абавязкова ісці да і/або пасля нулёў:

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

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

Тады пазіцыі можна вызначыць з дапамогай функцыі linspace, прывёўшы значэння да найменшага з бліжэйшых цэлых:

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

Дадамо да гэтага індэксы нулёў і адсартуем:

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

Адпаведна, індэксы пілотных сігналаў – гэта ўсё астатняе:

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

Цяпер давайце разбірацца з пілотнымі сігналамі.

У нас ёсць шаблон (пераменная Пілоты), і, дапусцім, мы жадаем, каб у наш кадр пілоты ўстаўляліся з гэтага шаблону паслядоўна. Зрабіць гэта, канешне, можна ў цыкле. А можна трохі памудрыць з матрыцамі - балазе MATLAB дазваляе рабіць гэта з дастатковым камфортам.

Па-першае, вызначым, колькі такіх шаблонаў змяшчаецца ў кадр поўнасцю:

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

Далей фармуем вектар, які складаецца з нашых шаблонаў:

% 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

І вызначаем невялікі вектар, які ўтрымоўвае толькі кавалак шаблону - "хвост", не які змясціўся цалкам у кадр:

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

Атрымліваем пілотныя знакі:

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

Пераходзім да інфармацыйных сімвалаў, а менавіта сфармуем паведамленне і прамадулюем яго:

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 

Усё гатова! Збіраны кадр:

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

Атрымаецца павінна нешта такое:

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

"Кайф!" - падумаў я задаволена і зачыніў ноўтбук. Пайшло ў мяне на ўсё пра ўсё пару гадзін: уключаючы напісанне кода, вывучэнне некаторых матлабаўскіх функцый і прадумванне матэматычных трукаў.

Якія высновы я тады зрабіў

суб'ектыўныя:

  • Пісаць код прыемна і падобна паэзіі!
  • Напісанне скрыптоў - найболей зручны метад даследаванняў для вобласці Communication and Signal Processing.

аб'ектыўныя:

  • Не трэба паліць з гарматы па вераб'ях (калі такая навучальная мэта, вядома, не варта): выкарыстаўшы Simulink, мы ўзяліся за рашэнне простай задачы наварочанай прыладай.
  • GUI гэта добра, але разумець што ўтрымоўваецца пад капотам лепш.

І зараз, будучы ўжо далёка не студэнтам, я хачу сказаць студэнцкай браціі наступнае:

  • Адважвайцеся!

Спрабуйце пісаць код, няхай нават спачатку ён будзе дрэнным. З праграмаваннем як і з любой іншай дзейнасцю, ліха бяда - пачатак. А пачаць лепш раней: калі вы навуковец ці нават проста тэхнар - рана ці позна гэты навык вам спатрэбіцца.

  • Патрабуйце!

Патрабуйце ад выкладчыкаў і навуковых кіраўнікоў прагрэсіўных падыходаў і інструментаў. Калі гэта, вядома, колькі магчыма…

  • Тварыце!

Дзе ж яшчэ лепш за ўсё перахварэць усімі болькамі пачаткоўца, як не ў рамках адукацыйнай праграмы? Дзейце і навострывайце сваё майстэрства - ізноў жа чым раней пачаць, тым лепш.

Пачаткоўцы праграмісты ўсіх краін, аб'ядноўвайцеся!

PS

Каб запратакаляваць сваё прамое стаўленне да студэнцтва, прыкладаю памятнае фота 2017 года з двума рэктарамі: Петэрам Шарфам (справа) і Альбертам Харысовічам Гільмудзінавым (злева).

"Маніфест пачаткоўцаў праграмістаў з сумежных спецыяльнасцяў" ці як я дайшоў да жыцця такі

Каштавала скончыць праграму як мінімум дзеля такіх гарнітураў! (жартую)

Крыніца: habr.com

Дадаць каментар