"Manifesto untuk memulakan pengaturcara daripada kepakaran yang berkaitan" atau bagaimana saya sampai ke tahap ini dalam hidup

Artikel saya hari ini adalah pemikiran yang lantang daripada seseorang yang mengambil jalan pengaturcaraan hampir secara tidak sengaja (walaupun secara semula jadi).

Ya, saya faham bahawa pengalaman saya hanyalah pengalaman saya, tetapi nampaknya ia sesuai dengan trend umum. Selain itu, pengalaman yang diterangkan di bawah lebih berkaitan dengan bidang aktiviti saintifik, tetapi apa yang bukan main-main - ia boleh berguna di luar.

"Manifesto untuk memulakan pengaturcara daripada kepakaran yang berkaitan" atau bagaimana saya sampai ke tahap ini dalam hidup
Sumber: https://xkcd.com/664/

Secara umum, khusus untuk semua pelajar semasa daripada bekas pelajar!

Harapan

Apabila saya menamatkan ijazah sarjana muda saya dalam Teknologi Maklumat dan Sistem Komunikasi pada tahun 2014, saya hampir tidak tahu apa-apa tentang dunia pengaturcaraan. Ya, seperti kebanyakan orang lain, saya mengambil subjek "Sains Komputer" pada tahun pertama saya - tetapi, Tuhan, ia adalah pada tahun pertama saya! Ia adalah keabadian!

Secara umum, saya tidak mengharapkan apa-apa yang berbeza daripada ijazah sarjana muda, dan apabila saya memasuki program sarjana "Komunikasi dan Pemprosesan Isyarat" Institut Teknologi Baru Jerman-Rusia.

Tetapi sia-sia...

Kami hanya pengambilan kedua, dan lelaki dari yang pertama masih mengemas beg mereka untuk Jerman yang jauh (magang mengambil masa enam bulan pada tahun kedua ijazah sarjana). Dalam erti kata lain, tiada seorang pun dari kalangan terdekat yang telah menemui kaedah pendidikan Eropah secara serius, dan tiada siapa yang bertanya tentang butirannya.

Pada tahun pertama kami, sudah tentu, kami mempunyai pelbagai jenis amalan, di mana kami biasanya ditawarkan secara demokratik pilihan antara menulis skrip (terutamanya dalam bahasa MATLAB) dan menggunakan pelbagai GUI yang sangat khusus (dalam erti kata tanpa menulis skrip - simulasi persekitaran pemodelan).

"Manifesto untuk memulakan pengaturcara daripada kepakaran yang berkaitan" atau bagaimana saya sampai ke tahap ini dalam hidup

Tidak perlu dikatakan, kami, Sarjana Sains masa depan, daripada kebodohan masa muda kami, mengelak daripada menulis kod seperti api. Di sini, sebagai contoh, ialah Simulink dari MathWorks: berikut adalah bloknya, inilah sambungannya, di sini adalah semua jenis tetapan dan suis.

Pandangan yang asli dan boleh difahami oleh seseorang yang pernah bekerja dalam reka bentuk litar dan kejuruteraan sistem!

"Manifesto untuk memulakan pengaturcara daripada kepakaran yang berkaitan" atau bagaimana saya sampai ke tahap ini dalam hidup
Sumber: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Jadi nampaknya kami...

Realiti

Salah satu kerja amali pada semester pertama ialah pembangunan transceiver isyarat OFDM sebagai sebahagian daripada subjek "Kaedah untuk Pemodelan dan Pengoptimuman". Idea ini sangat berjaya: teknologi ini masih relevan dan agak popular kerana penggunaannya, contohnya, dalam rangkaian Wi-Fi dan LTE/LTE-A (dalam bentuk OFDMA). Ini adalah perkara terbaik untuk sarjana untuk mempraktikkan kemahiran mereka dalam memodelkan sistem telekom.

"Manifesto untuk memulakan pengaturcara daripada kepakaran yang berkaitan" atau bagaimana saya sampai ke tahap ini dalam hidup

Dan kini kami diberi beberapa pilihan spesifikasi teknikal dengan parameter bingkai yang jelas tidak praktikal (supaya tidak mencari penyelesaian di Internet), dan kami menerkam Simulink yang telah disebutkan... Dan kami dipukul di kepala dengan teko daripada realiti:

  • Setiap blok penuh dengan banyak parameter yang tidak diketahui, yang menakutkan untuk berubah pada penurunan topi.
  • Manipulasi dengan nombor perlu dilakukan, nampaknya, mudah, tetapi anda masih perlu kecoh, Allah melarang.
  • Mesin katedral ketara perlahan daripada penggunaan GUI yang terburu-buru, walaupun pada peringkat melayari perpustakaan blok yang tersedia.
  • Untuk menyelesaikan sesuatu di rumah, anda perlu mempunyai Simulink yang sama. Dan, sebenarnya, tiada alternatif.

Ya, pada akhirnya kami, sudah tentu, menyelesaikan projek itu, tetapi kami menyelesaikannya dengan hembusan nafas lega yang kuat.

Beberapa waktu berlalu, dan kami sampai ke penghujung tahun pertama ijazah sarjana. Jumlah kerja rumah yang menggunakan GUI mula menurun secara berkadar dengan peningkatan dalam perkadaran subjek Jerman, walaupun ia masih belum mencapai titik anjakan paradigma. Ramai di antara kita, termasuk saya, mengatasi amplitud yang besar untuk membina, semakin banyak menggunakan Matlab dalam projek saintifik kami (walaupun dalam bentuk Kotak Alat), dan bukannya Simulink yang kelihatan biasa.

Perkara yang menjadi keraguan kami ialah ungkapan salah seorang pelajar tahun dua (mereka baru sahaja pulang ke Rusia pada masa itu):

  • Lupakan, sekurang-kurangnya untuk tempoh latihan, tentang Similink, MathCad dan LabView lain - di atas bukit semuanya ditulis dalam MATLAB, menggunakan MatLab sendiri atau Oktaf "versi" percumanya.

Kenyataan itu ternyata sebahagiannya benar: di Ilmenau, pertikaian mengenai pilihan alat juga tidak diselesaikan sepenuhnya. Benar, pilihannya kebanyakannya antara MATLAB, Python dan C.

Pada hari yang sama, saya terpesona oleh keseronokan semula jadi: tidakkah saya patut memindahkan bahagian saya daripada model pemancar OFDM ke dalam bentuk skrip? Hanya untuk bersuka-ria.

Dan saya perlu bekerja.

Langkah demi langkah

Daripada pengiraan teori, saya hanya akan memberikan pautan kepada ini artikel yang sangat baik 2011 daripada tgx dan pada slaid Lapisan fizikal LTE profesor Michel-Tila (TU Ilmenau). Saya rasa ini sudah cukup.

β€œJadi,” saya fikir, β€œmari kita ulangi, apakah yang akan kita jadikan model?”
Kami akan model Penjana bingkai OFDM (penjana bingkai OFDM).

Perkara yang akan disertakan:

  • simbol maklumat
  • isyarat juruterbang
  • sifar (DC)

Apa (demi kesederhanaan) kami abstrak daripada:

  • daripada memodelkan awalan kitaran (jika anda tahu asasnya, menambahnya tidak sukar)

"Manifesto untuk memulakan pengaturcara daripada kepakaran yang berkaitan" atau bagaimana saya sampai ke tahap ini dalam hidup

Gambar rajah blok model yang sedang dipertimbangkan. Kami akan berhenti di blok FFT songsang (IFFT). Untuk melengkapkan gambar, semua orang boleh meneruskan selebihnya sendiri - Saya berjanji kepada guru-guru dari jabatan untuk meninggalkan sesuatu untuk pelajar.

Mari kita tentukan sendiri. senaman:

  • bilangan tetap sub-pembawa;
  • panjang bingkai tetap;
  • kita mesti menambah satu sifar di tengah dan sepasang sifar pada permulaan dan akhir bingkai (jumlah, 5 keping);
  • simbol maklumat dimodulasi menggunakan M-PSK atau M-QAM, di mana M ialah susunan modulasi.

Mari kita mulakan dengan kod.

Keseluruhan skrip boleh dimuat turun dari pautan.

Mari kita tentukan parameter input:

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

Kini kami menentukan indeks simbol maklumat, menerima premis bahawa isyarat perintis semestinya perlu pergi sebelum dan/atau selepas sifar:

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

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

Kemudian kedudukan boleh ditentukan menggunakan fungsi linspace, mengurangkan nilai kepada terkecil daripada integer terdekat:

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

Mari tambah indeks sifar pada ini dan susun:

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

Sehubungan itu, indeks isyarat perintis adalah segala-galanya:

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

Sekarang mari kita fahami isyarat perintis.

Kami mempunyai templat (pembolehubah juruterbang), dan katakan kami mahu juruterbang daripada templat ini dimasukkan ke dalam bingkai kami secara berurutan. Sudah tentu, ini boleh dilakukan dalam gelung. Atau anda boleh bermain sedikit rumit dengan matriks - mujurlah MATLAB membenarkan anda melakukan ini dengan keselesaan yang mencukupi.

Mula-mula, mari kita tentukan bilangan templat ini sesuai sepenuhnya ke dalam bingkai:

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

Seterusnya, kami membentuk vektor yang terdiri daripada templat kami:

% 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

Dan kami mentakrifkan vektor kecil yang mengandungi hanya sekeping templat - "ekor", yang tidak sesuai sepenuhnya ke dalam bingkai:

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

Kami mendapat watak perintis:

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

Mari kita beralih kepada simbol maklumat, iaitu, kita akan membentuk mesej dan memodulasinya:

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 

Semua sudah sedia! Memasang bingkai:

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

Anda sepatutnya mendapat sesuatu seperti ini:

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

"Bliss!" β€” Saya berfikir dengan puas dan menutup komputer riba. Saya mengambil masa beberapa jam untuk melakukan segala-galanya: termasuk menulis kod, mempelajari beberapa fungsi Matlab dan berfikir melalui helah matematik.

Apakah kesimpulan yang saya buat ketika itu?

Subjektif:

  • Kod penulisan adalah menyenangkan dan serupa dengan puisi!
  • Skrip ialah kaedah penyelidikan yang paling mudah untuk bidang Komunikasi dan Pemprosesan Isyarat.

Objektif:

  • Tidak perlu menembak burung pipit dari meriam (melainkan matlamat pendidikan seperti itu, sudah tentu, berbaloi): menggunakan Simulink, kami menyelesaikan masalah mudah dengan alat yang canggih.
  • GUI adalah baik, tetapi memahami apa yang terkandung "di bawah tudung" adalah lebih baik.

Dan sekarang, kerana jauh dari menjadi seorang pelajar, saya ingin mengatakan perkara berikut kepada persaudaraan pelajar:

  • Tenanglah!

Cuba tulis kod, walaupun ia buruk pada mulanya. Dengan pengaturcaraan, seperti mana-mana aktiviti lain, bahagian yang paling sukar adalah permulaan. Dan lebih baik untuk bermula lebih awal: jika anda seorang saintis atau hanya seorang juruteknik, lambat laun anda akan memerlukan kemahiran ini.

  • Permintaan!

Tuntut pendekatan dan alat progresif daripada guru dan penyelia. Jika ini boleh, sudah tentu...

  • Cipta!

Di manakah lebih baik untuk mengatasi semua luka seorang pemula, jika tidak dalam rangka program pendidikan? Cipta dan asah kemahiran anda - sekali lagi, lebih cepat anda bermula, lebih baik.

Aspirasi pengaturcara dari semua negara, bersatulah!

PS

Untuk merakam hubungan langsung saya dengan pelajar, saya melampirkan foto kenangan 2017 bersama dua rektor: Peter Scharff (di sebelah kanan) dan Albert Kharisovich Gilmutdinov (di sebelah kiri).

"Manifesto untuk memulakan pengaturcara daripada kepakaran yang berkaitan" atau bagaimana saya sampai ke tahap ini dalam hidup

Ia berbaloi untuk menamatkan program sekurang-kurangnya untuk pakaian ini! (gurau)

Sumber: www.habr.com

Tambah komen