ProHoster > Блог > Новини інтернету > «Маніфест програмістів-початківців із суміжних спеціальностей» або як я дійшов до життя такий
«Маніфест програмістів-початківців із суміжних спеціальностей» або як я дійшов до життя такий
Сьогоднішня моя стаття — це думки вголос від людини, яка стала на шлях програмування майже випадково (хоч і закономірно).
Так, я розумію, що мій досвід — це лише мій досвід, проте він, на мою думку, добре потрапляє в загальну тенденцію. Більше того, досвід, описаний нижче, більше відноситься до сфери наукової діяльності, проте чим чорт не жартує — може стати в нагоді і поза.
Загалом усім справжнім студентам від колишнього студента присвячується!
очікування
Коли 2014 року я закінчував бакалаврат за спеціальністю «Інфокомунікаційні технології та системи зв'язку», я майже нічого не знав про світ програмування. Так, у мене, як і у багатьох, був на першому курсі предмет «Інформатика» — але, господи, це було на першому курсі! Минула ціла вічність!
Загалом, нічого особливого від бакалаврату я не чекав, і вступаючи на магістерську програму "Communication and Signal Processing" Німецько-Російського Інституту Нових Технологій.
А даремно…
Ми були лише другим набором, і хлопці з першого ще тільки збирали валізи до далекої Німеччини (стажування займає півроку на другому курсі магістратури). Інакше кажучи, ніхто з найближчого кола ще не стикався всерйоз з методами європейської освіти, і питати про деталі особливо не було в кого.
Були у нас на першому курсі, звичайно, різноманітних практик, на яких зазвичай нам демократично пропонувався вибір між написанням скриптів (переважно мовою MATLAB) і використанням різних вузькоспеціалізованих GUI (у тому сенсі, що без написання скриптів — серед імітаційного моделювання).
Чи варто говорити, що ми, майбутні Masters of Science, за своєю юнацькою дурістю, як вогню, цуралися написання коду. Ось, він, припустимо, Simulink від компанії MathWorks: ось вони блоки, ось вони зв'язки, ось вони різного роду налаштування та перемикачі.
Рідний і зрозумілий для людини, що займалася насамперед схемотехнікою та системотехнікою, вигляд!
Однією з практичних робіт першого семестру була розробка приймача 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
Тепер визначимо індекси інформаційних символів, прийнявши передумову, що пілотні сигнали повинні обов'язково йти до та/або після нулів:
%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));
Далі формуємо вектор, який складається з наших шаблонів:
І визначаємо невеликий вектор, який містить лише шматок шаблону — «хвіст», що не помістився повністю у кадр:
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
"Кайф!" - подумав я досить і закрив ноутбук. Пішло у мене на все про все кілька годин: включаючи написання коду, вивчення деяких матлабовських функцій і продумування математичних трюків.
Які висновки я тоді зробив
суб'єктивні:
Писати код приємно і схоже на поезії!
Написання скриптів - найбільш зручний метод досліджень для Communication and Signal Processing.
об'єктивні:
Не треба палити з гармати по горобцях (якщо така навчальна мета, звичайно, не варто): використавши Simulink, ми взялися за вирішення простого завдання накрученим інструментом.
GUI - це добре, але розуміти що міститься "під капотом" - краще.
І тепер, будучи вже далеко не студентом, я хочу сказати студентській братії таке:
Дерзайте!
Спробуйте писати код, хай навіть спочатку він буде поганим. З програмуванням, як і з будь-якою іншою діяльністю, лиха біда — початок. А почати краще раніше: якщо ви вчений чи навіть просто технар – рано чи пізно ця навичка вам знадобиться.
Вимагайте!
Вимагайте від викладачів та наукових керівників прогресивних підходів та інструментів. Якщо це, звичайно, скільки можливо…
Творіть!
Де ж ще найкраще перехворіти на всі болячки новачка, як не в рамках освітньої програми? Творіть і відточуйте свою майстерність - знову ж таки чим раніше почати, тим краще.
Початківці програмісти всіх країн, об'єднуйтесь!
PS
Щоб запротоколювати своє пряме ставлення до студентства, прикладаю пам'ятне фото 2017 року з двома ректорами: Петером Шарффом (праворуч) та Альбертом Харісовичем Гільмутдіновим (ліворуч).
Варто закінчити програму як мінімум заради таких костюмів! (Жартую)