"Холбогдох мэргэжлээр анхлан суралцаж буй програмистуудад зориулсан тунхаг" эсвэл би амьдралынхаа энэ цэгт хэрхэн хүрсэн бэ

Миний өнөөдрийн нийтлэл бол програмчлалын замыг санамсаргүй байдлаар (байгалиасаа ч гэсэн) авсан хүний ​​​​бодол юм.

Тийм ээ, миний туршлага бол зөвхөн миний туршлага гэдгийг би ойлгож байна, гэхдээ энэ нь ерөнхий чиг хандлагад сайн нийцэж байгаа юм шиг санагдаж байна. Түүгээр ч барахгүй доор тайлбарласан туршлага нь шинжлэх ухааны үйл ажиллагааны талбартай илүү холбоотой боловч энэ нь ямар ч тоглоом биш юм - энэ нь гадна талд ашигтай байж болно.

"Холбогдох мэргэжлээр анхлан суралцаж буй програмистуудад зориулсан тунхаг" эсвэл би амьдралынхаа энэ цэгт хэрхэн хүрсэн бэ
Эх сурвалж: https://xkcd.com/664/

Ерөнхийдөө хуучин оюутны одоогийн бүх оюутнуудад зориулав!

Хүлээлт

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

Ерөнхийдөө би бакалаврын зэргээс онц өөр зүйл хүлээж байгаагүй бөгөөд магистрын хөтөлбөрт орохдоо "Харилцаа холбоо ба дохио боловсруулах" Герман-Оросын шинэ технологийн хүрээлэн.

Гэвч дэмий ...

Бид хоёр дахь элсэгч байсан бөгөөд эхний ангийн залуус алс холын Герман руу цүнхээ багласаар байв (магистрын хоёр дахь жилдээ зургаан сар дадлага хийдэг). Өөрөөр хэлбэл, ойр тойрныхон нь Европын боловсролын арга барилтай нухацтай тулгараагүй, нарийн ширийн зүйлийг асуух хүн байсангүй.

Мэдээжийн хэрэг, бид эхний жилдээ скрипт бичих (голчлон MATLAB хэл дээр) болон төрөл бүрийн өндөр мэргэшсэн GUI (скрипт бичихгүйгээр симуляци гэдэг утгаараа) хоёрын аль нэгийг сонгохыг ардчилсан байдлаар санал болгодог янз бүрийн дадлага хийдэг байсан. загварчлалын орчин).

"Холбогдох мэргэжлээр анхлан суралцаж буй програмистуудад зориулсан тунхаг" эсвэл би амьдралынхаа энэ цэгт хэрхэн хүрсэн бэ

Ирээдүйн Шинжлэх Ухааны Мастерууд бид залуу насныхаа тэнэг зангаасаа болж гал шиг код бичихээс зайлсхийсэн гэж хэлэх нь илүүц биз. Жишээлбэл, 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 ашиглан гэрийн даалгаврын хэмжээ нь парадигмын өөрчлөлтийн цэгт хараахан хүрээгүй байсан ч Германы хичээлүүдийн эзлэх хувь нэмэгдсэнтэй пропорциональ буурч эхэлсэн. Бидний олонхи нь, тэр дундаа намайг бүтээхийн тулд асар их далайцыг даван туулж, шинжлэх ухааны төслүүддээ (хэрэгслийн хайрцаг хэлбэрээр байсан ч) Матлабыг илүү их ашигладаг, харин танил болсон Simulink биш юм.

Бидний эргэлзээ төрүүлсэн зүйл бол хоёрдугаар курсын оюутнуудын нэгний хэллэг байсан (тэр үед тэд Орост буцаж ирсэн):

  • Наад зах нь дадлага хийх хугацаанд 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); 

Одоо нисгэгч дохиог ойлгоцгооё.

Бидэнд загвар байна (хувьсагч нисгэгчид), мөн бид энэ загвараас нисгэгчдийг манай фреймд дараалан оруулахыг хүсч байна гэж бодъё. Мэдээжийн хэрэг, үүнийг гогцоонд хийж болно. Эсвэл та матрицаар бага зэрэг төвөгтэй тоглож болно - аз болоход, 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

сэтгэгдэл нэмэх