"Tegishli mutaxassisliklardan boshlang'ich dasturchilar uchun manifest" yoki men hayotning bu nuqtasiga qanday erishdim

Mening bugungi maqolam dasturlash yo'lini deyarli tasodifan (tabiiy bo'lsa ham) egallab olgan odamning ovoz chiqarib fikrlari.

Ha, mening tajribam shunchaki mening tajribam ekanligini tushunaman, lekin menimcha, u umumiy tendentsiyaga juda mos keladi. Bundan tashqari, quyida tavsiflangan tajriba ko'proq ilmiy faoliyat sohasiga taalluqlidir, ammo hazil emas - bu tashqarida foydali bo'lishi mumkin.

"Tegishli mutaxassisliklardan boshlang'ich dasturchilar uchun manifest" yoki men hayotning bu nuqtasiga qanday erishdim
Manba: https://xkcd.com/664/

Umuman olganda, sobiq talabadan hozirgi barcha talabalarga bag'ishlangan!

Kutishlar

2014-yilda Axborot kommunikatsiya texnologiyalari va aloqa tizimlari bo‘yicha bakalavr darajasini tugatganimda dasturlash olami haqida deyarli hech narsa bilmasdim. Ha, boshqalar singari men ham birinchi kursimda “Informatika” fanini oldim – lekin, Rabbiy, bu mening birinchi kursimda edi! Bu abadiylik edi!

Umuman olganda, men bakalavr darajasidan farqli narsani kutmagan edim va magistraturaga kirganimda "Aloqa va signallarni qayta ishlash" Germaniya-Rossiya yangi texnologiyalar instituti.

Lekin behuda...

Biz bor-yo'g'i ikkinchi qabul qiluvchi edik, birinchidan kelgan yigitlar hamon uzoq Germaniyaga (magistraturaning ikkinchi yilida amaliyot olti oy davom etadi) sumkalarini yig'ishayotgan edi. Boshqacha qilib aytganda, yaqin atrofdagilardan hech kim Evropa ta'lim usullariga jiddiy duch kelmagan va tafsilotlarni so'ragan hech kim yo'q edi.

Bizning birinchi yilimizda, albatta, bizda turli xil amaliyotlar mavjud edi, ularda bizga odatda demokratik tarzda skriptlarni yozish (asosan MATLAB tilida) va turli xil yuqori ixtisoslashgan grafik interfeyslardan foydalanish (ya'ni, skriptlarni yozmasdan - simulyatsiya) o'rtasida tanlov taklif qilindi. modellashtirish muhiti).

"Tegishli mutaxassisliklardan boshlang'ich dasturchilar uchun manifest" yoki men hayotning bu nuqtasiga qanday erishdim

Aytishning hojati yo'q, biz, bo'lajak fan ustalari, yoshlik ahmoqligimizdan olov kabi kod yozishdan qochdik. Mana, masalan, MathWorks-dan Simulink: mana bloklar, mana ulanishlar, bu yerda barcha turdagi sozlamalar va kalitlar.

Ilgari elektron dizayn va tizim muhandisligi bo'yicha ishlagan odam uchun mahalliy va tushunarli ko'rinish!

"Tegishli mutaxassisliklardan boshlang'ich dasturchilar uchun manifest" yoki men hayotning bu nuqtasiga qanday erishdim
Manba: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Shunday qilib, bizga shunday tuyuldi ...

Haqiqat

Birinchi semestrning amaliy ishlaridan biri “Modellashtirish va optimallashtirish usullari” fanining bir qismi sifatida OFDM signal qabul qiluvchi qurilmasini ishlab chiqish edi. G'oya juda muvaffaqiyatli: texnologiya, masalan, Wi-Fi va LTE/LTE-A tarmoqlarida (OFDMA ko'rinishida) foydalanish tufayli hali ham dolzarb va juda mashhur. Bu magistrlar uchun telekommunikatsiya tizimlarini modellashtirishda o'z ko'nikmalarini mashq qilishlari uchun eng yaxshi narsa.

"Tegishli mutaxassisliklardan boshlang'ich dasturchilar uchun manifest" yoki men hayotning bu nuqtasiga qanday erishdim

Va endi bizga aniq amaliy bo'lmagan ramka parametrlari bo'lgan texnik xususiyatlarning bir nechta variantlari berilgan (Internetda yechim izlamaslik uchun) va biz yuqorida aytib o'tilgan Simulinkga o'tamiz ... Va biz choynak bilan boshimizga zarba beramiz. haqiqatdan:

  • Har bir blok juda ko'p noma'lum parametrlarga to'la bo'lib, ularni bir lahzada o'zgartirish qo'rqinchli.
  • Raqamlar bilan manipulyatsiya qilish kerak, oddiy ko'rinadi, lekin siz hali ham bezovta qilishingiz kerak, Xudo saqlasin.
  • Katedral mashinalari, hatto mavjud bloklar kutubxonalarini kezish bosqichida ham GUI-dan g'azablangan foydalanishdan sezilarli darajada sekinlashadi.
  • Uyda biror narsani tugatish uchun sizda bir xil Simulink bo'lishi kerak. Va, aslida, alternativa yo'q.

Ha, oxirida biz, albatta, loyihani yakunladik, lekin biz uni baland ovozda yengillik bilan yakunladik.

Oradan biroz vaqt o‘tib, magistraturaning birinchi kursini ham yakunladik. GUI-lardan foydalangan holda uy vazifalari miqdori nemis sub'ektlari ulushining ortishi bilan mutanosib ravishda pasayishni boshladi, garchi u hali paradigma o'zgarishi nuqtasiga etib bormagan edi. Ko'pchiligimiz, shu jumladan, men ham o'zimizning katta amplitudamizni yengib o'tib, ilmiy loyihalarimizda (Asboblar qutilari ko'rinishida bo'lsa ham) Matlab-dan ko'proq foydalanmoqdamiz.

Bizning shubhalarimiz ikkinchi kurs talabalaridan birining iborasi edi (ular Rossiyaga endigina qaytib kelishgan edi):

  • Hech bo'lmaganda amaliyot davomida Similink, MathCad va boshqa LabView haqida unutmang - tepada hamma narsa MatLab-ning o'zi yoki Oktavaning bepul "versiyasi" yordamida MATLAB-da yozilgan.

Bayonot qisman to'g'ri bo'lib chiqdi: Ilmenauda asboblarni tanlash bo'yicha nizo ham to'liq hal etilmagan. To'g'ri, tanlov asosan MATLAB, Python va C o'rtasida edi.

O'sha kuni meni tabiiy hayajon oldi: OFDM transmitter modelining o'z qismini skriptli shaklga o'tkazishim kerak emasmi? Faqat o'yin-kulgi uchun.

Va men ishga kirishdim.

Qadam baqadam

Nazariy hisob-kitoblar o'rniga, men bunga shunchaki havola beraman ajoyib maqola 2011 yildan tgx va slaydlarda LTE jismoniy qatlami professorlar Mishel-Tila (TU Ilmenau). Menimcha, bu etarli bo'ladi.

"Xo'sh," deb o'yladim men, "qayta takrorlaylik, biz nimani modellashtiramiz?"
Biz model qilamiz OFDM ramka generatori (OFDM ramka generatori).

U nimani o'z ichiga oladi:

  • axborot belgilari
  • uchuvchi signallari
  • nollar (DC)

Biz nimadan (oddiylik uchun) mavhum qilamiz:

  • tsiklik prefiksni modellashtirishdan (agar siz asoslarni bilsangiz, uni qo'shish qiyin bo'lmaydi)

"Tegishli mutaxassisliklardan boshlang'ich dasturchilar uchun manifest" yoki men hayotning bu nuqtasiga qanday erishdim

Ko'rib chiqilayotgan modelning blok diagrammasi. Biz teskari FFT (IFFT) blokida to'xtab qolamiz. Rasmni to'ldirish uchun har kim qolganini o'zi davom ettirishi mumkin - men kafedra o'qituvchilariga talabalar uchun biror narsa qoldirishga va'da berdim.

Keling, ularni o'zimiz uchun aniqlaylik. mashq:

  • sub-tashuvchilarning belgilangan soni;
  • belgilangan ramka uzunligi;
  • biz o'rtada bitta nol va ramkaning boshida va oxirida bir juft nol qo'shishimiz kerak (jami, 5 dona);
  • axborot belgilari M-PSK yoki M-QAM yordamida modulyatsiya qilinadi, bu erda M - modulyatsiya tartibi.

Keling, kod bilan boshlaylik.

To'liq skriptni yuklab olish mumkin aloqa.

Keling, kirish parametrlarini aniqlaymiz:

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

Endi biz uchuvchi signallar noldan oldin va/yoki undan keyin bo'lishi kerak degan asosni qabul qilib, axborot belgilarining indekslarini aniqlaymiz:

idx_1_start = 4;
idx_1_end = fr_len/2 - 2;

idx_2_start = fr_len/2 + 2;
idx_2_end =  fr_len - 3;

Keyin funksiya yordamida pozitsiyalarni aniqlash mumkin linspace, qiymatlarni eng yaqin butun sonlarning eng kichigigacha kamaytirish:

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

Keling, bunga nol indekslarini qo'shamiz va tartiblaymiz:

%concatenation and ascending sorting
inf_and_nulls_idx = union(inf_ind, nulls_idx); 

Shunga ko'ra, uchuvchi signal indekslari hamma narsadir:

%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); 

Endi uchuvchi signallarni tushunamiz.

Bizda shablon mavjud (o'zgaruvchi uchuvchi) va keling, biz ushbu shablondagi uchuvchilarni bizning ramkamizga ketma-ket kiritishni xohlaymiz. Albatta, bu tsiklda amalga oshirilishi mumkin. Yoki siz matritsalar bilan biroz qiyin o'ynashingiz mumkin - xayriyatki, MATLAB buni etarli darajada qulaylik bilan bajarishga imkon beradi.

Birinchidan, ushbu shablonlarning nechtasi ramkaga to'liq mos kelishini aniqlaymiz:

pilots_len_psudo = floor(N_pil/length(pilots));

Keyinchalik, biz shablonlarimizdan iborat vektor hosil qilamiz:

% 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

Va biz shablonning faqat bir qismini o'z ichiga olgan kichik vektorni aniqlaymiz - ramkaga to'liq mos kelmaydigan "dum":

tail_len = fr_len  - N_inf - length(nulls_idx) ...
                - length(pilots)*pilots_len_psudo; 
tail = pilots(1:tail_len); % "tail" of pilots vector

Biz uchuvchi belgilarni olamiz:

vec_pilots = [resh; tail]; % completed pilots vector that frame consists

Keling, ma'lumot belgilariga o'tamiz, ya'ni biz xabarni shakllantiramiz va uni modulyatsiya qilamiz:

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 

Hammasi tayyor! Ramkani yig'ish:

%% Frame construction
frame = zeros(fr_len,1);
frame(pilot_idx) = vec_pilots;
frame(inf_ind) = info_symbols

Siz shunga o'xshash narsani olishingiz kerak:

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

"Baxt!" — Men mamnunlik bilan o'yladim va noutbukni yopdim. Menga hamma narsani qilish uchun bir necha soat vaqt ketdi: kod yozish, Matlabning ba'zi funktsiyalarini o'rganish va matematik fokuslar orqali o'ylash.

Keyin qanday xulosalar chiqardim?

Subyektiv:

  • Kod yozish yoqimli va she'rga o'xshaydi!
  • Skript yozish aloqa va signallarni qayta ishlash sohasi uchun eng qulay tadqiqot usuli hisoblanadi.

Maqsad:

  • To'pdan chumchuqlarni otishning hojati yo'q (agar bunday ta'lim maqsadi, albatta, bunga loyiq bo'lmasa): Simulink-dan foydalanib, biz murakkab vosita bilan oddiy muammoni hal qildik.
  • GUI yaxshi, lekin "kaput ostida" nima borligini tushunish yaxshiroq.

Va endi, talabalikdan yiroq ekanman, talabalar birodarligiga quyidagilarni aytmoqchiman:

  • Dare!

Avvaliga yomon bo'lsa ham kod yozishga harakat qiling. Har qanday boshqa faoliyatda bo'lgani kabi, dasturlashda ham eng qiyin qismi bu boshlanishi. Va avvalroq boshlash yaxshidir: agar siz olim yoki hatto oddiy texnik bo'lsangiz, ertami-kechmi sizga bu mahorat kerak bo'ladi.

  • Talab!

O'qituvchilar va rahbarlardan ilg'or yondashuvlar va vositalarni talab qiling. Agar bu mumkin bo'lsa, albatta ...

  • Yaratmoq!

Agar ta'lim dasturi doirasida bo'lmasa, yangi boshlanuvchining barcha jarohatlarini qayerda engish yaxshiroq? O'z mahoratingizni yarating va oshiring - yana, qanchalik tez boshlasangiz, shuncha yaxshi bo'ladi.

Barcha mamlakatlardan intiluvchan dasturchilar, birlashing!

PS

Talabalar bilan to'g'ridan-to'g'ri munosabatlarimni yozib olish uchun men ikki rektor: Piter Sharff (o'ngda) va Albert Xarisovich Gilmutdinov (chapda) bilan 2017 yildagi esdalik fotosuratini ilova qilaman.

"Tegishli mutaxassisliklardan boshlang'ich dasturchilar uchun manifest" yoki men hayotning bu nuqtasiga qanday erishdim

Hech bo'lmaganda ushbu kostyumlar uchun dasturni tugatishga arziydi! (hazil)

Manba: www.habr.com

a Izoh qo'shish