"Əlaqədar ixtisaslardan başlayan proqramçılar üçün manifest" və ya həyatın bu nöqtəsinə necə gəldim

Bugünkü məqaləm proqramlaşdırma yolunu az qala təsadüfən (təbii də olsa) qət etmiş bir insanın yüksək səslə səsləndirdiyi fikirlərdir.

Bəli, başa düşürəm ki, mənim təcrübəm sadəcə mənim təcrübəmdir, amma mənə elə gəlir ki, bu, ümumi tendensiyaya yaxşı uyğun gəlir. Üstəlik, aşağıda təsvir edilən təcrübə daha çox elmi fəaliyyət sahəsinə aiddir, amma nə cəhənnəm zarafat etmir - kənarda faydalı ola bilər.

"Əlaqədar ixtisaslardan başlayan proqramçılar üçün manifest" və ya həyatın bu nöqtəsinə necə gəldim
Mənbə: https://xkcd.com/664/

Ümumiyyətlə, keçmiş tələbədən indiki bütün tələbələrə həsr olunur!

Gözləntilər

2014-cü ildə İnfokommunikasiya Texnologiyaları və Kommunikasiya Sistemləri üzrə bakalavr təhsilimi bitirəndə proqramlaşdırma dünyası haqqında demək olar ki, heç nə bilmirdim. Bəli, bir çoxları kimi, mən də birinci kursumda “Kompüter Elmləri” fənnini götürdüm - amma ya Rəbb, bu mənim birinci kursumda idi! Əbədilik oldu!

Ümumiyyətlə, mən bakalavrdan fərqli bir şey gözləmirdim və magistr proqramına daxil olanda "Rabitə və siqnal emalı" Alman-Rusiya Yeni Texnologiyalar İnstitutu.

Amma boş yerə...

Biz yalnız ikinci qəbul idik və birincinin oğlanları hələ də çantalarını uzaq Almaniyaya yığırdılar (magistraturanın ikinci kursunda təcrübə altı ay çəkir). Yəni yaxın çevrədən hələ heç kim Avropa təhsili üsulları ilə ciddi şəkildə qarşılaşmamış, təfərrüatları soruşacaq adam yox idi.

İlk ilimizdə, əlbəttə ki, bizim müxtəlif növ təcrübələrimiz var idi ki, bu təcrübələrdə bizə adətən demokratik şəkildə skriptlərin yazılması (əsasən MATLAB dilində) və müxtəlif yüksək ixtisaslaşmış GUI-lərdən (yani skript yazmadan - simulyasiya) istifadə arasında seçim təklif olunurdu. modelləşdirmə mühitləri).

"Əlaqədar ixtisaslardan başlayan proqramçılar üçün manifest" və ya həyatın bu nöqtəsinə necə gəldim

Söz yox ki, biz, gələcəyin Elm Ustaları, gənclik axmaqlığımızdan od kimi kod yazmaqdan çəkindik. Budur, məsələn, MathWorks-dən Simulink: burada bloklar, burada əlaqələr, burada hər cür parametrlər və açarlar var.

Daha əvvəl dövrə dizaynı və sistem mühəndisliyi sahəsində çalışmış bir şəxs üçün doğma və başa düşülən bir görünüş!

"Əlaqədar ixtisaslardan başlayan proqramçılar üçün manifest" və ya həyatın bu nöqtəsinə necə gəldim
Mənbə: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Bizə elə gəldi ki...

Həqiqət

Birinci semestrin praktiki işlərindən biri də “Modelləşdirmə və Optimallaşdırma Metodları” fənni çərçivəsində OFDM siqnal ötürücüsünün işlənib hazırlanması olmuşdur. İdeya çox uğurludur: texnologiya, məsələn, Wi-Fi və LTE/LTE-A şəbəkələrində (OFDMA formasında) istifadəsinə görə hələ də aktualdır və kifayət qədər populyardır. Bu, magistrlərin telekommunikasiya sistemlərinin modelləşdirilməsində bacarıqlarını tətbiq etmələri üçün ən yaxşı şeydir.

"Əlaqədar ixtisaslardan başlayan proqramçılar üçün manifest" və ya həyatın bu nöqtəsinə necə gəldim

İndi isə bizə açıq-aydın praktiki olmayan çərçivə parametrləri ilə (İnternetdə həll axtarmamaq üçün) bir neçə texniki spesifikasiyalar variantı verilir və biz artıq qeyd olunan Simulink-ə sıçrayırıq... Və başımıza çayniklə vururuq. reallıqdan:

  • Hər bir blok bir anda dəyişdirmək qorxulu olan bir çox naməlum parametrlərlə doludur.
  • Rəqəmlərlə manipulyasiyalar etmək lazımdır, görünür, sadədir, amma yenə də təlaşa düşmək lazımdır, Allah eləməsin.
  • Katedral maşınları, hətta mövcud blokların kitabxanalarında sörf etmək mərhələsində də GUI-nin qəzəbli istifadəsindən nəzərəçarpacaq dərəcədə yavaşlayır.
  • Evdə bir şeyi bitirmək üçün eyni Simulinkə sahib olmalısınız. Və əslində alternativ yoxdur.

Bəli, sonda biz, əlbəttə ki, layihəni başa vurduq, lakin yüksək bir relyef ekshalasiyası ilə başa çatdırdıq.

Aradan bir müddət keçdi və magistraturanın birinci kursunun sonuna gəldik. GUI-dən istifadə edən ev tapşırığının miqdarı, hələ paradiqma dəyişikliyi nöqtəsinə çatmasa da, Alman subyektlərinin payının artması ilə mütənasib olaraq azalmağa başladı. Bir çoxumuz, o cümlədən mən, qurmaq üçün kifayət qədər genişliyimizi aşaraq, elmi layihələrimizdə (Alətlər qutuları şəklində olsa da) Matlab-dan daha çox istifadə edirik, nəinki tanış görünən Simulink.

Şübhə etdiyimiz məqam XNUMX-ci kurs tələbələrindən birinin (o vaxt Rusiyaya təzə qayıtmışdılar) ifadəsi oldu:

  • Heç olmasa təcrübə müddətində Similink, MathCad və digər LabView-ı unudun - təpənin üstündə hər şey MatLab-ın özündən və ya onun pulsuz "versiyasından" Octave istifadə edərək MATLAB-da yazılmışdır.

Bəyanatın qismən doğru olduğu ortaya çıxdı: İlmenauda alətlərin seçimi ilə bağlı mübahisə də tam həll edilmədi. Düzdür, seçim daha çox MATLAB, Python və C arasında idi.

Elə həmin gün məni təbii bir həyəcan aldı: OFDM ötürücü modelinin bir hissəsini skript formasına köçürməməliyəmmi? Sadəcə əylənmək üçün.

Və işə başladım.

Addım-addım

Nəzəri hesablamalar əvəzinə, sadəcə olaraq buna bir keçid verəcəm əla məqalə 2011-dən tgx və slaydlarda LTE fiziki təbəqəsi professorlar Mişel-Tila (TU Ilmenau). Məncə, bu kifayət edəcək.

"Beləliklə," deyə düşündüm, "bir daha təkrarlayaq, biz nəyi modelləşdirəcəyik?"
Model edəcəyik OFDM çərçivə generatoru (OFDM çərçivə generatoru).

Buraya nə daxil olacaq:

  • məlumat simvolları
  • pilot siqnalları
  • sıfırlar (DC)

Nədən (sadəlik naminə) mücərrəd edirik:

  • tsiklik prefiksin modelləşdirilməsindən (əsasları bilirsinizsə, əlavə etmək çətin olmayacaq)

"Əlaqədar ixtisaslardan başlayan proqramçılar üçün manifest" və ya həyatın bu nöqtəsinə necə gəldim

Baxılan modelin blok diaqramı. Biz tərs FFT (IFFT) blokunda dayanacağıq. Şəkli tamamlamaq üçün hər kəs qalanını özü davam etdirə bilər - kafedradan gələn müəllimlərə söz verdim ki, tələbələrə nəsə qoyub getsinlər.

Gəlin bunları özümüz üçün müəyyən edək. məşq:

  • sub-daşıyıcıların sabit sayı;
  • sabit çərçivə uzunluğu;
  • ortada bir sıfır və çərçivənin əvvəlində və sonunda bir cüt sıfır əlavə etməliyik (cəmi, 5 ədəd);
  • məlumat simvolları M-PSK və ya M-QAM istifadə edərək modulyasiya edilir, burada M modulyasiya sırasıdır.

Kodu ilə başlayaq.

Bütün skripti buradan yükləmək olar əlaqə.

Giriş parametrlərini təyin edək:

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

İndi pilot siqnalların mütləq sıfırlardan əvvəl və/yaxud sonra getməli olduğu müddəasını qəbul edərək, informasiya simvollarının indekslərini müəyyən edirik:

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

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

Sonra funksiyadan istifadə edərək mövqelər müəyyən edilə bilər linspace, dəyərləri ən yaxın tam ədədlərin ən kiçiyinə endirərək:

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

Gəlin buna sıfır indekslərini əlavə edək və sıralayaq:

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

Buna görə pilot siqnal indeksləri hər şeydir:

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

İndi pilot siqnallarını anlayaq.

Şablonumuz var (dəyişən pilotlar) və deyək ki, bu şablondan pilotların ardıcıllıqla çərçivəmizə daxil edilməsini istəyirik. Əlbəttə ki, bunu bir döngədə etmək olar. Və ya matrislərlə bir az çətin oynaya bilərsiniz - xoşbəxtlikdən MATLAB sizə bunu kifayət qədər rahatlıqla etməyə imkan verir.

Əvvəlcə bu şablonlardan neçəsinin çərçivəyə tam uyğun olduğunu müəyyən edək:

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

Sonra, şablonlarımızdan ibarət bir vektor meydana gətiririk:

% 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

Və şablonun yalnız bir hissəsini - çərçivəyə tamamilə uyğun gəlməyən "quyruq" ehtiva edən kiçik bir vektor təyin edirik:

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

Pilot personajları alırıq:

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

Gəlin məlumat simvollarına keçək, yəni bir mesaj formalaşdıracağıq və onu modullaşdıracağıq:

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 

Hamısı hazırdır! Çərçivənin yığılması:

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

Bu kimi bir şey almalısınız:

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

"Zövq!" — Mən məmnuniyyətlə düşündüm və noutbuku bağladım. Hər şeyi etmək mənə bir neçə saat çəkdi: kod yazmaq, bəzi Matlab funksiyalarını öyrənmək və riyazi fəndlərlə düşünmək.

Onda mən hansı nəticələr çıxardım?

Subyektiv:

  • Şifrə yazmaq xoşdur və poeziyaya bənzəyir!
  • Skriptləmə Rabitə və Siqnal Emalı sahəsi üçün ən əlverişli tədqiqat üsuludur.

Məqsəd:

  • Topdan sərçə atmağa ehtiyac yoxdur (əgər belə bir təhsil məqsədi, əlbəttə ki, buna dəyər deyilsə): Simulink-dən istifadə edərək, mürəkkəb bir alətlə sadə bir problemi həll etməyi öz üzərimizə götürdük.
  • GUI yaxşıdır, lakin "başlıq altında" nə olduğunu başa düşmək daha yaxşıdır.

İndi isə tələbəlikdən uzaq olduğum üçün tələbə qardaşlığına bunları demək istəyirəm:

  • Cəsarət!

Əvvəlcə pis olsa belə, kod yazmağa çalışın. Proqramlaşdırma ilə, hər hansı digər fəaliyyətdə olduğu kimi, ən çətin hissə başlanğıcdır. Daha əvvəl başlamaq daha yaxşıdır: alim və ya sadəcə texniki mütəxəssissinizsə, gec-tez bu bacarıq sizə lazım olacaq.

  • Tələb!

Müəllimlərdən və nəzarətçilərdən mütərəqqi yanaşmalar və alətlər tələb edin. Bu mümkün olsa, təbii ki...

  • Yarat!

Bir təhsil proqramı çərçivəsində deyilsə, bir başlanğıcın bütün yaralarını aradan qaldırmaq başqa harada daha yaxşıdır? Bacarıqlarınızı yaradın və təkmilləşdirin - yenə də nə qədər tez başlasanız, bir o qədər yaxşıdır.

Bütün ölkələrdən arzulanan proqramçılar, birləşin!

PS

Tələbələrlə birbaşa münasibətimi qeyd etmək üçün iki rektorla 2017-ci ilin yaddaqalan şəklini əlavə edirəm: Peter Scharff (sağda) və Albert Kharisoviç Gilmutdinov (solda).

"Əlaqədar ixtisaslardan başlayan proqramçılar üçün manifest" və ya həyatın bu nöqtəsinə necə gəldim

Heç olmasa bu kostyumlara görə proqramı bitirməyə dəyərdi! (zarafat)

Mənbə: www.habr.com

Добавить комментарий