"Текшелүү адистиктерден программисттердин башталышы үчүн манифест" же мен жашоонун ушул учуруна кантип жеттим

Менин бүгүнкү макалам программалоо жолуна дээрлик кокустан (табигый болсо да) түшкөн адамдын ой-пикирлери.

Ооба, менин тажрыйбам жөн гана менин тажрыйбам экенин түшүнөм, бирок мага ал жалпы тенденцияга дал келгендей сезилет. Андан тышкары, төмөндө сүрөттөлгөн тажрыйба илимий ишмердүүлүк чөйрөсүнө көбүрөөк тиешелүү, бирок тамаша эмес, бул сыртта пайдалуу болушу мүмкүн.

"Текшелүү адистиктерден программисттердин башталышы үчүн манифест" же мен жашоонун ушул учуруна кантип жеттим
Source: https://xkcd.com/664/

Жалпысынан мурунку студенттен азыркы студенттердин баарына арналган!

Күтүүлөр

Мен 2014-жылы Инфокоммуникациялык технологиялар жана коммуникация системалары боюнча бакалавр даражамды аяктаганда программалоо дүйнөсү жөнүндө дээрлик эч нерсе билчү эмесмин. Ооба, башкалар сыяктуу эле, мен биринчи курста "Информатика" сабагын тапшырдым, бирок, Мырзам, бул менин биринчи жылым эле! Бул түбөлүктүүлүк болду!

Жалпысынан, мен бакалавр даражасынан өзгөчө эч нерсе күткөн эмесмин жана магистратурага киргенде "Байланыш жана сигналдарды иштетүү" Германия-Орус жаңы технологиялар институту.

Бирок бекер...

Биз болгону экинчи кабыл алуучу болдук, а биринчисинин балдары дагы эле алыскы Германияга сумкаларын жыйнап жатышты (магистратуранын экинчи курсунда стажировка алты айга созулат). Башкача айтканда, жакынкы чөйрөдөн эч ким европалык билим берүүнүн ыкмаларына олуттуу жолуккан эмес, майда-чүйдөсүнө чейин сурай турган эч ким болгон эмес.

Биринчи курсубузда, албетте, бизде ар кандай практикалар бар болчу, аларда демократиялык жол менен бизге скрипт жазуу (негизинен MATLAB тилинде) менен ар кандай жогорку адистештирилген GUIлерди (скрипт жазуусуз – симуляция деген мааниде) тандоону сунуш кылышкан. моделдөө чөйрөлөрү).

"Текшелүү адистиктерден программисттердин башталышы үчүн манифест" же мен жашоонун ушул учуруна кантип жеттим

Айтып кереги жок, биз, болочок илимдин устаттары, жаштык келесоолугубуздан оттой болуп код жазуудан качканбыз. Бул жерде, мисалы, MathWorks'тен Simulink: бул жерде блоктор, бул жерде байланыштар, бул жерде бардык орнотуулар жана өчүргүчтөр.

Мурда схемаларды долбоорлоо жана системалык инженерия тармагында иштеген адам үчүн жергиликтүү жана түшүнүктүү көз караш!

"Текшелүү адистиктерден программисттердин башталышы үчүн манифест" же мен жашоонун ушул учуруна кантип жеттим
Source: 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'ты илимий долбоорлорубузда (Курал кутучалары түрүндө болсо да) уламдан-улам көбүрөөк колдондук, бирок тааныш көрүнгөн Simulink эмес.

Биздин күмөн санаган жагдай XNUMX-курстун студенттеринин биринин (ошол кезде алар Орусияга жаңы эле кайтып келишкен) сөзү болду:

  • Жок дегенде практика учурунда Similink, MathCad жана башка LabView жөнүндө унутуп коюңуз - дөбөнүн үстүндө бардыгы MatLabдын өзүн же анын Октаванын эркин "версиясын" колдонуп, MATLABда жазылган.

Билдирүүдө жарым-жартылай чындык болуп чыкты: Ильменауда куралдарды тандоо боюнча талаш-тартыш да толук чечилген эмес. Ырас, тандоо көбүнчө MATLAB, Python жана C ортосунда болгон.

Ошол эле күнү мени табигый толкундануу каптады: OFDM өткөргүч моделинин бөлүгүн скрипт түрүнө өткөрүп беришим керек эмеспи? Жөн гана көңүл ачуу үчүн.

А мен ишке кириштим.

Кадам артынан кадам

Теориялык эсептөөлөрдүн ордуна мен буга жөн гана шилтеме берем сонун макала 2011-жылдан tgx жана слайддарда LTE физикалык катмары профессорлор Мишель-Тила (ТУ Ильменау). Бул жетиштүү болот деп ойлойм.

"Ошентип," деп ойлодум мен, "кайталайлы, биз эмнени моделдейбиз?"
Модел кылабыз OFDM кадр генератору (OFDM кадр генератору).

Ал эмнени камтыйт:

  • маалымат символдору
  • пилоттук сигналдар
  • нөлдөр (DC)

Биз эмнеден (жөнөкөйлүк үчүн) абстракциялайбыз:

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

"Текшелүү адистиктерден программисттердин башталышы үчүн манифест" же мен жашоонун ушул учуруна кантип жеттим

Каралып жаткан моделдин блок-схемасы. Биз тескери 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); 

Эми пилоттук сигналдарды түшүнөлү.

Бизде шаблон бар (variable учкучтар) жана бул шаблондогу учкучтар биздин кадрга ырааттуу түрдө киргизилсин дейли. Албетте, муну бир циклде жасоого болот. Же сиз матрицалар менен бир аз татаал ойной аласыз - бактыга жараша 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-жылдын эки ректору: Питер Шарф (оң жакта) жана Альберт Харисович Гилмутдинов (солдо) менен болгон эсте каларлык сүрөтүн тиркеп жатам.

"Текшелүү адистиктерден программисттердин башталышы үчүн манифест" же мен жашоонун ушул учуруна кантип жеттим

Жок дегенде ушул костюмдар үчүн программаны бүтүрүүгө арзырлык болчу! (тамаша)

Source: www.habr.com

Комментарий кошуу