“Manifesto untuk programmer pemula dari spesialisasi terkait” atau bagaimana saya sampai pada titik ini dalam hidup

Artikel saya hari ini adalah pemikiran keras dari seseorang yang mengambil jalur pemrograman hampir secara tidak sengaja (meskipun secara alami).

Ya, saya memahami bahwa pengalaman saya hanyalah pengalaman saya, tetapi menurut saya itu cocok dengan tren umum. Apalagi pengalaman yang diuraikan di bawah ini lebih berkaitan dengan bidang kegiatan ilmiah, namun yang tidak main-main - bisa bermanfaat di luar.

“Manifesto untuk programmer pemula dari spesialisasi terkait” atau bagaimana saya sampai pada titik ini dalam hidup
Sumber: https://xkcd.com/664/

Secara umum, didedikasikan untuk semua siswa saat ini dari mantan siswa!

Harapan

Ketika saya menyelesaikan gelar sarjana di bidang Teknologi Infokomunikasi dan Sistem Komunikasi pada tahun 2014, saya hampir tidak tahu apa-apa tentang dunia pemrograman. Ya, seperti banyak orang lain, saya mengambil mata pelajaran “Ilmu Komputer” di tahun pertama saya - tapi, Tuhan, itu di tahun pertama saya! Sudah lama sekali!

Secara umum, saya tidak mengharapkan sesuatu yang berbeda dari gelar sarjana, dan ketika saya masuk program magister "Komunikasi dan Pemrosesan Sinyal" Institut Teknologi Baru Jerman-Rusia.

Tapi sia-sia...

Kami baru angkatan kedua, dan orang-orang dari angkatan pertama masih mengemasi tas mereka ke Jerman yang jauh (magang memakan waktu enam bulan di tahun kedua gelar master). Dengan kata lain, belum ada seorang pun dari kalangan terdekat yang secara serius mengenal metode pendidikan Eropa, dan belum ada yang menanyakan detailnya.

Pada tahun pertama kami, tentu saja, kami memiliki berbagai macam praktik, di mana kami biasanya secara demokratis ditawari pilihan antara menulis skrip (terutama dalam bahasa MATLAB) dan menggunakan berbagai GUI yang sangat terspesialisasi (dalam artian tanpa menulis skrip - simulasi lingkungan pemodelan).

“Manifesto untuk programmer pemula dari spesialisasi terkait” atau bagaimana saya sampai pada titik ini dalam hidup

Tak perlu dikatakan lagi, kami, calon Master of Science, karena kebodohan masa muda kami, menghindari menulis kode seperti api. Ini misalnya Simulink dari MathWorks: ini bloknya, ini koneksinya, ini semua jenis pengaturan dan sakelarnya.

Pandangan yang asli dan dapat dimengerti oleh seseorang yang sebelumnya bekerja di bidang desain sirkuit dan rekayasa sistem!

“Manifesto untuk programmer pemula dari spesialisasi terkait” atau bagaimana saya sampai pada titik ini dalam hidup
Sumber: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Jadi bagi kami tampaknya...

Kenyataan

Salah satu kerja praktek semester XNUMX adalah pengembangan signal transceiver OFDM pada mata kuliah “Metode Pemodelan dan Optimasi”. Idenya sangat sukses: teknologinya masih relevan dan cukup populer karena penggunaannya, misalnya pada jaringan Wi-Fi dan LTE/LTE-A (dalam bentuk OFDMA). Ini adalah hal terbaik bagi para master untuk melatih keterampilan mereka dalam memodelkan sistem telekomunikasi.

“Manifesto untuk programmer pemula dari spesialisasi terkait” atau bagaimana saya sampai pada titik ini dalam hidup

Dan sekarang kita diberikan beberapa pilihan spesifikasi teknis dengan parameter frame yang jelas tidak praktis (agar tidak mencari solusi di Internet), dan kita menerkam Simulink yang telah disebutkan... Dan kepala kita dipukul dengan teko kenyataan:

  • Setiap blok penuh dengan banyak parameter yang tidak diketahui, yang menakutkan untuk diubah dengan mudah.
  • Manipulasi angka memang perlu dilakukan, kelihatannya sederhana, tapi tetap harus repot, amit-amit.
  • Mesin katedral terasa melambat karena penggunaan GUI yang panik, bahkan pada tahap menjelajahi perpustakaan blok yang tersedia.
  • Untuk menyelesaikan sesuatu di rumah, Anda harus memiliki Simulink yang sama. Dan faktanya, tidak ada alternatif lain.

Ya, pada akhirnya kami, tentu saja, menyelesaikan proyek tersebut, tetapi kami menyelesaikannya dengan embusan napas lega.

Beberapa waktu berlalu, dan kami sampai pada akhir tahun pertama gelar master. Jumlah pekerjaan rumah yang menggunakan GUI mulai menurun secara proporsional seiring dengan meningkatnya proporsi mata pelajaran bahasa Jerman, meskipun belum mencapai titik perubahan paradigma. Banyak dari kita, termasuk saya, mengatasi amplitudo yang cukup besar untuk membangun, semakin banyak menggunakan Matlab dalam proyek ilmiah kita (walaupun dalam bentuk Toolbox), dan bukan Simulink yang tampaknya familiar.

Inti dari keraguan kami adalah ungkapan salah satu siswa tahun kedua (mereka baru saja kembali ke Rusia saat itu):

  • Lupakan, setidaknya selama masa magang, tentang Similink, MathCad, dan LabView lainnya - di atas bukit, semuanya ditulis dalam MATLAB, menggunakan MatLab itu sendiri atau "versi" Oktaf gratisnya.

Pernyataan tersebut ternyata sebagian benar: di Ilmenau, perselisihan mengenai pilihan alat juga belum sepenuhnya terselesaikan. Benar, pilihannya sebagian besar adalah antara MATLAB, Python dan C.

Pada hari yang sama, saya diliputi oleh kegembiraan alami: bukankah saya harus mentransfer bagian model pemancar OFDM saya ke dalam bentuk skrip? Hanya untuk bersenang-senang.

Dan saya mulai bekerja.

Setapak demi setapak

Daripada perhitungan teoritis, saya hanya akan memberikan link ke sini artikel yang bagus 2011 dari tgx dan di slide Lapisan fisik LTE profesor Michel-Tila (TU Ilmenau). Saya rasa ini sudah cukup.

“Jadi,” pikirku, “mari kita ulangi, apa yang akan kita modelkan?”
Kami akan menjadi model pembuat bingkai OFDM (pembuat bingkai OFDM).

Apa yang termasuk di dalamnya:

  • simbol informasi
  • sinyal percontohan
  • nol (DC)

Apa (demi kesederhanaan) yang kami abstrak dari:

  • dari memodelkan awalan siklik (jika Anda mengetahui dasar-dasarnya, menambahkannya tidak akan sulit)

“Manifesto untuk programmer pemula dari spesialisasi terkait” atau bagaimana saya sampai pada titik ini dalam hidup

Diagram blok model yang sedang dipertimbangkan. Kita akan berhenti di blok invers FFT (IFFT). Untuk melengkapi gambarannya, setiap orang dapat melanjutkan sisanya sendiri - saya berjanji kepada guru dari departemen untuk meninggalkan sesuatu untuk siswa.

Mari kita definisikan sendiri. latihan:

  • jumlah sub-operator yang tetap;
  • panjang bingkai tetap;
  • kita harus menambahkan satu angka nol di tengah dan sepasang angka nol di awal dan akhir bingkai (total, 5 buah);
  • simbol informasi dimodulasi menggunakan M-PSK atau M-QAM, dimana M adalah orde modulasi.

Mari kita mulai dengan kodenya.

Seluruh skrip dapat diunduh dari link.

Mari kita tentukan parameter masukan:

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

Sekarang kita menentukan indeks simbol informasi, menerima premis bahwa sinyal pilot harus berada sebelum dan/atau setelah angka nol:

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 posisinya dapat ditentukan menggunakan fungsi tersebut linspace, mengurangi nilainya menjadi bilangan bulat terkecil 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 tambahkan indeks nol ke dalamnya dan urutkan:

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

Oleh karena itu, indeks sinyal pilot adalah segalanya:

%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 pahami sinyal pilot.

Kami memiliki template (variabel pilot), dan katakanlah kita ingin pilot dari template ini dimasukkan ke dalam frame kita secara berurutan. Tentu saja, hal ini dapat dilakukan dalam satu putaran. Atau Anda dapat bermain sedikit rumit dengan matriks - untungnya MATLAB memungkinkan Anda melakukan ini dengan cukup nyaman.

Pertama, mari kita tentukan berapa banyak template yang sesuai dengan bingkai:

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

Selanjutnya, kita membentuk vektor yang terdiri dari template kita:

% 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 mendefinisikan vektor kecil yang hanya berisi sebagian dari templat - "ekor", yang tidak sepenuhnya masuk 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 mendapatkan karakter percontohan:

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

Mari kita beralih ke simbol informasi, yaitu kita akan membentuk pesan 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 

Semuanya sudah siap! Merakit bingkai:

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

Anda harus mendapatkan 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

"Kebahagiaan!" – Saya berpikir dengan puas dan menutup laptop. Saya memerlukan waktu beberapa jam untuk melakukan segalanya: termasuk menulis kode, mempelajari beberapa fungsi Matlab, dan memikirkan trik matematika.

Kesimpulan apa yang saya ambil saat itu?

Subyektif:

  • Menulis kode itu menyenangkan dan mirip dengan puisi!
  • Scripting adalah metode penelitian yang paling nyaman untuk bidang Komunikasi dan Pemrosesan Sinyal.

Objektif:

  • Tidak perlu menembak burung pipit dari meriam (kecuali tujuan pendidikan seperti itu, tentu saja, sepadan): dengan menggunakan Simulink, kami memecahkan masalah sederhana dengan alat yang canggih.
  • GUI-nya bagus, tapi memahami apa yang terkandung “di balik terpal” lebih baik.

Dan sekarang, karena masih jauh dari kata mahasiswa, saya ingin menyampaikan hal berikut kepada persaudaraan mahasiswa:

  • Kuatkanlah hatimu!

Cobalah menulis kode, meskipun pada awalnya buruk. Dengan pemrograman, seperti halnya aktivitas lainnya, bagian tersulitnya adalah permulaan. Dan lebih baik memulainya lebih awal: jika Anda seorang ilmuwan atau bahkan hanya seorang teknisi, cepat atau lambat Anda akan membutuhkan keterampilan ini.

  • Tuntutan!

Menuntut pendekatan dan alat progresif dari guru dan pengawas. Jika hal ini memungkinkan, tentu saja...

  • Membuat!

Di mana lagi tempat terbaik untuk mengatasi semua kesulitan seorang pemula, jika tidak dalam kerangka program pendidikan? Ciptakan dan asah keterampilan Anda - sekali lagi, semakin cepat Anda memulai, semakin baik.

Calon programmer dari semua negara, bersatu!

PS

Untuk merekam hubungan langsung saya dengan mahasiswa, saya lampirkan foto kenangan tahun 2017 bersama dua rektor: Peter Scharff (kanan) dan Albert Kharisovich Gilmutdinov (kiri).

“Manifesto untuk programmer pemula dari spesialisasi terkait” atau bagaimana saya sampai pada titik ini dalam hidup

Program ini layak untuk diselesaikan setidaknya untuk kostum ini! (bercanda)

Sumber: www.habr.com

Tambah komentar