«Маніфест програмістів-початківців із суміжних спеціальностей» або як я дійшов до життя такий

Сьогоднішня моя стаття — це думки вголос від людини, яка стала на шлях програмування майже випадково (хоч і закономірно).

Так, я розумію, що мій досвід — це лише мій досвід, проте він, на мою думку, добре потрапляє в загальну тенденцію. Більше того, досвід, описаний нижче, більше відноситься до сфери наукової діяльності, проте чим чорт не жартує — може стати в нагоді і поза.

«Маніфест програмістів-початківців із суміжних спеціальностей» або як я дійшов до життя такий
Джерело: 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

Додати коментар або відгук