«Байланысты мамандықтардан бастаушы бағдарламашыларға арналған манифест» немесе мен өмірдің осы нүктесіне қалай жеттім

Менің бүгінгі мақалам бағдарламалау жолын кездейсоқ (табиғи болса да) қабылдаған адамның дауыстап айтқан ойлары.

Иә, менің тәжірибем тек менің тәжірибем екенін түсінемін, бірақ ол жалпы трендке жақсы сәйкес келетін сияқты. Сонымен қатар, төменде сипатталған тәжірибе ғылыми қызмет саласына көбірек қатысты, бірақ бұл әзіл емес - бұл сыртта пайдалы болуы мүмкін.

«Байланысты мамандықтардан бастаушы бағдарламашыларға арналған манифест» немесе мен өмірдің осы нүктесіне қалай жеттім
Ақпарат көзі: https://xkcd.com/664/

Жалпы, бұрынғы студенттен қазіргі барлық студенттерге арналған!

Күтілетін нәтижелер

Мен 2014 жылы «Инфокоммуникациялық технологиялар және коммуникациялық жүйелер» мамандығы бойынша бакалавр дәрежесін бітірген кезде мен бағдарламалау әлемі туралы ештеңе білмедім. Иә, басқалар сияқты мен де бірінші курста «Информатика» пәнін алдым, бірақ, Мырза, бұл менің бірінші курсымда болды! Бұл мәңгілік болды!

Жалпы, мен бакалавр дәрежесінен ерекше ештеңе күтпедім және магистратураға түскен кезде «Байланыс және сигналдарды өңдеу» Неміс-Ресей жаңа технологиялар институты.

Бекер…

Біз тек екінші қабылдаушы болдық, ал біріншісінің жігіттері әлі де алыстағы Германияға сөмкелерін жинап жатты (магистратураның екінші курсында тағылымдамадан өту алты айға созылады). Яғни, еуропалық білім беру әдістеріне жақын ортадан ешкім әлі шындап тап болған жоқ, егжей-тегжейлерін сұрайтын ешкім болмады.

Біздің бірінші жылымызда, әрине, бізде демократиялық түрде сценарийлерді жазу (негізінен MATLAB тілінде) және әртүрлі жоғары мамандандырылған графикалық интерфейстерді (скрипттерді жазбай - модельдеу деген мағынада) пайдалану арасында таңдау ұсынылатын әртүрлі тәжірибелер болды. модельдеу ортасы).

«Байланысты мамандықтардан бастаушы бағдарламашыларға арналған манифест» немесе мен өмірдің осы нүктесіне қалай жеттім

Біз, болашақ ғылым магистрлері, жастық ақымақтығымыздан оттай код жазудан аулақ болдық. Міне, мысалы, MathWorks-тен Simulink: міне блоктар, міне қосылымдар, мұнда параметрлер мен қосқыштардың барлық түрлері бар.

Бұрын схемалар мен жүйелер инженериясында жұмыс істеген адамға жергілікті және түсінікті көзқарас!

«Байланысты мамандықтардан бастаушы бағдарламашыларға арналған манифест» немесе мен өмірдің осы нүктесіне қалай жеттім
Ақпарат көзі: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Бізге солай көрінді...

Шындық

Бірінші семестрдегі практикалық жұмыстардың бірі «Модельдеу және оңтайландыру әдістері» пәнінің бөлігі ретінде OFDM сигнал қабылдағышын жасау болды. Идея өте сәтті: технология, мысалы, Wi-Fi және LTE/LTE-A желілерінде (OFDMA түрінде) қолданылуына байланысты әлі де өзекті және жеткілікті танымал. Бұл магистрлер үшін телекоммуникациялық жүйелерді модельдеу дағдыларын үйрену үшін ең жақсы нәрсе.

«Байланысты мамандықтардан бастаушы бағдарламашыларға арналған манифест» немесе мен өмірдің осы нүктесіне қалай жеттім

Енді бізге рамалық параметрлері анық практикалық емес техникалық сипаттамалардың бірнеше нұсқасы берілген (Интернеттен шешім іздемеу үшін) және біз жоғарыда айтылған Simulink-ке ұрынамыз... Ал басымызға шәйнекпен ұрамыз. шындық:

  • Әрбір блок көптеген белгісіз параметрлерге толы, оларды бір сәтте өзгерту қорқынышты.
  • Сандармен манипуляцияларды жасау керек, қарапайым сияқты, бірақ сіз әлі де әбігерге түсуіңіз керек, Құдай сақтасын.
  • Собор машиналары, тіпті қол жетімді блоктардың кітапханалары арқылы серфинг сатысында да, GUI-ны ашулы пайдаланудан айтарлықтай баяулайды.
  • Үйде бір нәрсені аяқтау үшін сізде бірдей Simulink болуы керек. Және, шын мәнінде, балама жоқ.

Иә, соңында біз, әрине, жобаны аяқтадық, бірақ біз оны рельефтің қатты дем шығаруымен аяқтадық.

Арада біраз уақыт өтіп, магистратураның бірінші курсын аяқтадық. GUI қолданатын үй тапсырмаларының көлемі неміс субъектілерінің үлес салмағының ұлғаюымен пропорционалды төмендей бастады, бірақ ол әлі парадигманың ауысу нүктесіне жетпеген. Біздің көпшілігіміз, соның ішінде мен де, өзіміздің үлкен амплитудамызды еңсере отырып, ғылыми жобаларымызда (құралдар қораптары түрінде болса да) Matlab-ті көбірек қолданып жатырмыз.

Біздің күмәніміз екінші курс студенттерінің бірінің сөзі болды (ол кезде олар Ресейге енді ғана оралған):

  • Кем дегенде тағылымдама кезінде Similink, MathCad және басқа LabView туралы ұмытыңыз - төбеде барлығы MatLab-тың өзін немесе оның Октаваның тегін «нұсқасын» пайдалану арқылы MATLAB-та жазылған.

Мәлімдеме ішінара шындық болып шықты: Ильменауда құралдарды таңдауға қатысты дау да толығымен шешілген жоқ. Рас, таңдау негізінен MATLAB, Python және C арасында болды.

Сол күні мені табиғи толқу қабылдады: мен OFDM таратқыш моделінің бөлігін сценарийлік пішінге көшіруім керек емес пе? Тек көңіл көтеру үшін.

Ал мен жұмысқа кірістім.

Бірте-бірте

Теориялық есептеулердің орнына мен бұған сілтеме беремін тамаша мақала 2011 жылдан бастап tgx және слайдтарда LTE физикалық деңгейі профессорлар Мишель-Тила (Ту Ильменау). Менің ойымша, бұл жеткілікті болады.

«Сонымен,» деп ойладым мен, «қайталап көрейік, біз нені үлгі етеміз?»
Біз үлгі боламыз OFDM жақтау генераторы (OFDM жақтау генераторы).

Оған не кіреді:

  • ақпараттық белгілер
  • пилоттық сигналдар
  • нөлдер (тұрақты ток)

Біз неден (қарапайымдылық үшін) деректеме аламыз:

  • циклдік префиксті модельдеуден (егер сіз негіздерді білсеңіз, оны қосу қиын болмайды)

«Байланысты мамандықтардан бастаушы бағдарламашыларға арналған манифест» немесе мен өмірдің осы нүктесіне қалай жеттім

Қарастырылып отырған модельдің құрылымдық сұлбасы. Біз кері FFT (IFFT) блогында тоқтаймыз. Суретті аяқтау үшін, қалғанын әркім өзі жалғастыра алады - мен кафедра оқытушыларына студенттерге бір нәрсе қалдыруға уәде бердім.

Соларды өзіміз анықтайық. жаттығу:

  • қосалқы тасымалдаушылардың тіркелген саны;
  • бекітілген жақтау ұзындығы;
  • біз ортасына бір нөлді және кадрдың басы мен соңына бір жұп нөл қосуымыз керек (барлығы, 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

«Бақыт!» — Мен разы ойланып, ноутбукты жаптым. Маған барлығын істеу үшін бірнеше сағат қажет болды: код жазу, кейбір Matlab функцияларын үйрену және математикалық трюктар арқылы ойлау.

Сонда мен қандай қорытынды жасадым?

Субъективті:

  • Код жазу жағымды және поэзияға жақын!
  • Сценарий – байланыс және сигналдарды өңдеу саласы үшін ең қолайлы зерттеу әдісі.

Мақсат:

  • Торғайларды зеңбіректен атудың қажеті жоқ (егер мұндай білім беру мақсаты, әрине, оған тұрарлық болмаса): Simulink көмегімен біз күрделі құралмен қарапайым мәселені шешуге кірістік.
  • GUI жақсы, бірақ «қақпақтың астында» не бар екенін түсіну жақсы.

Ал енді студент болудан алыс болғандықтан, студенттік бауырластарға мынаны айтқым келеді:

  • Қарсы бол!

Бастапқыда жаман болса да, код жазып көріңіз. Бағдарламалауда, кез келген басқа әрекет сияқты, ең қиын бөлігі - бұл бастама. Ал ертерек бастаған дұрыс: егер сіз ғалым болсаңыз немесе жай ғана техник болсаңыз, ерте ме, кеш пе сізге бұл дағды қажет болады.

  • Сұраныс!

Мұғалімдер мен жетекшілерден прогрессивті тәсілдер мен құралдарды талап етіңіз. Бұл мүмкін болса, әрине...

  • Жасау!

Білім беру бағдарламасы аясында болмаса, жаңадан бастаған адамның барлық жараларын қай жерде жеңу жақсы? Өз дағдыларыңызды жасаңыз және жетілдіріңіз - қайтадан, неғұрлым тезірек бастасаңыз, соғұрлым жақсы.

Барлық елдерден ұмтылған бағдарламашылар, бірігіңіз!

PS

Студенттермен тікелей қарым-қатынасымды жазу үшін мен екі ректормен: Питер Шарфпен (оң жақта) және Альберт Харисович Гилмутдиновпен (сол жақта) 2017 жылғы естелік суретті қосамын.

«Байланысты мамандықтардан бастаушы бағдарламашыларға арналған манифест» немесе мен өмірдің осы нүктесіне қалай жеттім

Ең болмағанда осы костюмдер үшін бағдарламаны аяқтау керек еді! (әзіл)

Ақпарат көзі: www.habr.com

пікір қалдыру