“İlgili uzmanlık alanlarından yeni başlayan programcılar için manifesto” veya hayatımın bu noktasına nasıl geldiğim

Bugünkü makalem, programlama yolunu neredeyse tesadüfen (doğal da olsa) seçen bir kişinin yüksek sesle düşünceleridir.

Evet, deneyimimin sadece benim deneyimim olduğunu anlıyorum ama bana öyle geliyor ki genel eğilime çok iyi uyuyor. Dahası, aşağıda açıklanan deneyim daha çok bilimsel faaliyet alanıyla ilgilidir, ancak şaka değil - dışarıda faydalı olabilir.

“İlgili uzmanlık alanlarından yeni başlayan programcılar için manifesto” veya hayatımın bu noktasına nasıl geldiğim
Kaynak: https://xkcd.com/664/

Genel olarak, eski bir öğrenciden mevcut tüm öğrencilere adanmıştır!

beklentiler

Bilgi İletişim Teknolojileri ve İletişim Sistemleri alanında lisans eğitimimi 2014 yılında tamamladığımda programlama dünyası hakkında neredeyse hiçbir şey bilmiyordum. Evet, pek çok kişi gibi ben de ilk yılımda “Bilgisayar Bilimi” konusunu almıştım - ama Tanrım, bu ilk yılımdaydı! Sonsuzluk oldu!

Genel olarak lisans eğitiminden farklı bir şey beklemiyordum ve yüksek lisans programına girdiğimde "İletişim ve Sinyal İşleme" Alman-Rus Yeni Teknolojiler Enstitüsü.

Ama boşuna...

Biz sadece ikinci kişiydik ve ilk gelen arkadaşlar hâlâ uzak Almanya'ya gitmek üzere çantalarını topluyorlardı (yüksek lisans derecesinin ikinci yılında staj altı ay sürüyor). Yani yakın çevreden hiç kimse henüz Avrupa eğitim yöntemleriyle ciddi bir şekilde karşılaşmamıştı ve ayrıntıları soracak kimse de yoktu.

İlk yılımızda, elbette, çeşitli türde uygulamalarımız oldu ve bize genellikle demokratik olarak senaryo yazma (esas olarak MATLAB dilinde) ile çeşitli oldukça uzmanlaşmış GUI'leri kullanma (senaryo yazmadan - simülasyon anlamına gelir) arasında bir seçim teklif edildi. modelleme ortamları).

“İlgili uzmanlık alanlarından yeni başlayan programcılar için manifesto” veya hayatımın bu noktasına nasıl geldiğim

Söylemeye gerek yok, biz geleceğin Bilim Ustaları gençlikteki aptallığımız yüzünden ateş gibi kod yazmaktan kaçındık. Burada örneğin MathWorks'ün Simulink'i var: işte bloklar, işte bağlantılar, işte her türlü ayar ve anahtar.

Daha önce devre tasarımı ve sistem mühendisliği alanında çalışmış bir kişiye özgü ve anlaşılır bir bakış açısı!

“İlgili uzmanlık alanlarından yeni başlayan programcılar için manifesto” veya hayatımın bu noktasına nasıl geldiğim
Kaynak: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Bize öyle geldi...

Gerçeklik

İlk dönemin pratik çalışmalarından biri “Modelleme ve Optimizasyon Yöntemleri” konusunun bir parçası olarak bir OFDM sinyal alıcı-vericisinin geliştirilmesiydi. Fikir çok başarılı: teknoloji, örneğin Wi-Fi ve LTE/LTE-A ağlarında (OFDMA biçiminde) kullanılması nedeniyle hâlâ güncel ve oldukça popüler. Bu, ustaların telekom sistemlerini modelleme becerilerini geliştirmeleri için en iyi şeydir.

“İlgili uzmanlık alanlarından yeni başlayan programcılar için manifesto” veya hayatımın bu noktasına nasıl geldiğim

Ve şimdi bize, açıkça pratik olmayan çerçeve parametrelerine sahip birkaç teknik özellik seçeneği veriliyor (İnternette bir çözüm aramamak için) ve daha önce bahsedilen Simulink'e atlıyoruz... Ve kafamıza bir çaydanlıkla vuruluyoruz. gerçeklik:

  • Her blok, bir anda değişmesi korkutucu olan birçok bilinmeyen parametreyle doludur.
  • Sayılarla yapılan manipülasyonların yapılması gerekiyor, öyle görünüyor ki basit, ama yine de telaşlanmanız gerekiyor, Tanrı korusun.
  • Katedral makineleri, mevcut blokların kütüphaneleri arasında gezinme aşamasında bile GUI'nin çılgınca kullanımından dolayı gözle görülür şekilde yavaşlıyor.
  • Evde bir işi bitirmek için aynı Simulink'e sahip olmanız gerekir. Ve aslında alternatif yok.

Evet, sonunda elbette projeyi tamamladık ama büyük bir rahatlamayla tamamladık.

Aradan biraz zaman geçti ve yüksek lisansta ilk yılın sonuna geldik. Henüz bir paradigma değişimi noktasına ulaşmamış olsa da, GUI kullanan ödevlerin miktarı, Almanca konularının oranındaki artışla orantılı olarak düşmeye başladı. Ben de dahil olmak üzere çoğumuz, inşa etme konusundaki kayda değer genişliğimizi aşarak, bilimsel projelerimizde (Araç Kutuları biçiminde de olsa) giderek daha fazla Matlab kullandık ve görünüşte tanıdık olan Simulink'i değil.

Kuşkularımızı uyandıran nokta, ikinci sınıf öğrencilerinden birinin (o sırada Rusya'ya yeni dönmüşlerdi) şu sözüydü:

  • En azından staj süresince Similink, MathCad ve diğer LabView'i unutun - her şey MATLAB'da, MatLab'ın kendisi veya onun ücretsiz "versiyonu" Octave kullanılarak yazılır.

İfadenin kısmen doğru olduğu ortaya çıktı: Ilmenau'da araç seçimi konusundaki anlaşmazlık da tamamen çözülmedi. Doğru, seçim çoğunlukla MATLAB, Python ve C arasındaydı.

Aynı gün doğal bir heyecana kapıldım: OFDM verici modelinin bana düşen kısmını yazılı bir forma aktarmam gerekmez mi? Sadece eğlence için.

Ve işe koyuldum.

Adım adım

Teorik hesaplamalar yerine bunun linkini vereceğim. mükemmel makale 2011'den itibaren tgx ve slaytlarda LTE fiziksel katmanı profesör Michel-Tila (TU Ilmenau). Bunun yeterli olacağını düşünüyorum.

“Peki,” diye düşündüm, “tekrarlayalım, neyi modelleyeceğiz?”
Biz modelleyeceğiz OFDM çerçeve üreteci (OFDM çerçeve oluşturucu).

Neleri içerecek:

  • bilgi sembolleri
  • pilot sinyalleri
  • sıfırlar (DC)

Neyi (basitlik adına) çıkarıyoruz:

  • döngüsel bir önek modellemekten (temelleri biliyorsanız eklemek zor olmayacaktır)

“İlgili uzmanlık alanlarından yeni başlayan programcılar için manifesto” veya hayatımın bu noktasına nasıl geldiğim

Söz konusu modelin blok diyagramı. Ters FFT (IFFT) bloğunda duracağız. Resmi tamamlamak için gerisini herkes kendisi devam ettirebilir - Bölümdeki öğretmenlere öğrencilere bir şeyler bırakacağıma söz verdim.

Bunları kendimiz için tanımlayalım. egzersiz yapmak:

  • sabit sayıda alt taşıyıcı;
  • sabit çerçeve uzunluğu;
  • çerçevenin ortasına bir sıfır, başına ve sonuna birer çift sıfır eklemeliyiz (toplam 5 adet);
  • bilgi simgeleri, M-PSK veya M-QAM kullanılarak modüle edilir; burada M, modülasyon sırasıdır.

Kodla başlayalım.

Komut dosyasının tamamı şuradan indirilebilir: bağlantı.

Giriş parametrelerini tanımlayalı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

Şimdi pilot sinyallerin zorunlu olarak sıfırlardan önce ve/veya sonra gitmesi gerektiği önermesini kabul ederek bilgi sembollerinin indekslerini belirliyoruz:

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

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

Daha sonra konumlar fonksiyon kullanılarak belirlenebilir. boşlukdeğerleri en yakın tam sayıların en küçüğüne indirerek:

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

Buna sıfırların indekslerini ekleyelim ve sıralayalım:

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

Buna göre pilot sinyal endeksleri diğer her ş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); 

Şimdi pilot sinyallerini anlayalım.

Bir şablonumuz var (değişken pilotlar) ve diyelim ki bu şablondaki pilotların çerçevemize sırayla eklenmesini istiyoruz. Elbette bu bir döngü halinde yapılabilir. Veya matrislerle biraz hileli oynayabilirsiniz - neyse ki MATLAB bunu yeterli rahatlıkla yapmanıza izin veriyor.

Öncelikle bu şablonlardan kaç tanesinin çerçeveye tam olarak uyduğunu belirleyelim:

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

Daha sonra şablonlarımızdan oluşan bir vektör oluşturuyoruz:

% 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

Ve şablonun yalnızca bir parçasını içeren küçük bir vektörü (çerçeveye tam olarak sığmayan "kuyruk") tanımlarız:

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

Pilot karakterleri alıyoruz:

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

Bilgi sembollerine geçelim yani bir mesaj oluşturup onu modüle edeceğiz:

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 

Her şey hazır! Çerçevenin montajı:

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

Bunun gibi 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

"Mutluluk!" — Memnuniyetle düşündüm ve dizüstü bilgisayarı kapattım. Her şeyi yapmam birkaç saatimi aldı: kod yazmak, bazı Matlab fonksiyonlarını öğrenmek ve matematiksel hileler üzerinde düşünmek dahil.

O zaman ne gibi sonuçlar çıkardım?

Öznel:

  • Kod yazmak keyiflidir ve şiire benzer!
  • Komut Dosyası Yazma, İletişim ve Sinyal İşleme alanı için en uygun araştırma yöntemidir.

Amaç:

  • Serçeleri toptan vurmaya gerek yok (tabii ki böyle bir eğitim hedefi buna değmediği sürece): Simulink'i kullanarak basit bir sorunu karmaşık bir araçla çözmeyi üstlendik.
  • GUI iyidir, ancak "kaputun altında" nelerin bulunduğunu anlamak daha iyidir.

Şimdi öğrenci olmaktan uzak olarak öğrenci camiasına şunu söylemek istiyorum:

  • Go for it!

İlk başta kötü olsa bile kod yazmayı deneyin. Diğer aktivitelerde olduğu gibi programlamada da en zor kısım başlangıçtır. Ve daha erken başlamak daha iyidir: Eğer bir bilim insanıysanız, hatta sadece bir teknisyenseniz, er ya da geç bu beceriye ihtiyacınız olacak.

  • Talep etmek!

Öğretmenlerden ve denetçilerden ilerici yaklaşımlar ve araçlar talep edin. Tabii eğer bu mümkünse...

  • Yaratmak!

Bir eğitim programı çerçevesinde değilse, yeni başlayan birinin tüm yaralarını aşmak başka nerede daha iyi olabilir? Becerilerinizi yaratın ve geliştirin; yine, ne kadar erken başlarsanız o kadar iyi.

Tüm ülkelerden gelecek vaat eden programcılar birleşin!

PS

Öğrencilerle olan doğrudan ilişkimi kaydetmek için, iki rektörle 2017'nin unutulmaz bir fotoğrafını ekliyorum: Peter Scharff (sağda) ve Albert Kharisovich Gilmutdinov (solda).

“İlgili uzmanlık alanlarından yeni başlayan programcılar için manifesto” veya hayatımın bu noktasına nasıl geldiğim

En azından bu kostümler için programı bitirmeye değerdi! (şaka yapmak)

Kaynak: habr.com

Yorum ekle