"Manifesto por komencaj programistoj de rilataj fakoj" aŭ kiel mi alvenis al ĉi tiu punkto en la vivo

Mia hodiaŭa artikolo estas pensoj laŭtaj de homo, kiu prenis la vojon de programado preskaŭ hazarde (kvankam nature).

Jes, mi komprenas, ke mia sperto estas nur mia sperto, sed ŝajnas al mi, ke ĝi bone kongruas en la ĝeneralan tendencon. Cetere, la ĉi-sube priskribita sperto rilatas pli al la kampo de scienca agado, sed kion diable ne ŝercas - ĝi povas esti utila ekstere.

"Manifesto por komencaj programistoj de rilataj fakoj" aŭ kiel mi alvenis al ĉi tiu punkto en la vivo
fonto: https://xkcd.com/664/

Ĝenerale, dediĉita al ĉiuj nunaj studentoj de iama studento!

Atendoj

Kiam mi finis mian bakalaŭron pri Infokomunikaj Teknologioj kaj Komunikaj Sistemoj en 2014, mi preskaŭ nenion sciis pri la mondo de programado. Jes, kiel multaj aliaj, mi ekzamenis la fakon "Komputiko" en mia unua jaro - sed, Sinjoro, ĝi estis en mia unua jaro! Jam pasis eterneco!

Ĝenerale, mi ne atendis ion aparte malsaman de bakalaŭro, kaj kiam mi eniris la majstran programon "Komunikado kaj Signal-Pretigo" Germana-Rusa Instituto de Novaj Teknologioj.

Sed vane...

Ni estis nur la dua konsumado, kaj la uloj de la unua ankoraŭ pakis siajn sakojn por malproksima Germanio (la staĝo daŭras ses monatojn en la dua jaro de magistro). Alivorte, neniu el la tuja rondo ankoraŭ serioze renkontis la metodojn de eŭropa edukado, kaj estis neniu por demandi pri la detaloj.

En nia unua jaro, kompreneble, ni havis diversajn praktikojn, en kiuj oni kutime demokratie proponis al ni elekton inter skribi skriptojn (ĉefe en la MATLAB-lingvo) kaj uzi diversajn tre specialigitajn GUI-ojn (en la senco, ke sen verkado de skriptoj - simulado). modeligaj medioj).

"Manifesto por komencaj programistoj de rilataj fakoj" aŭ kiel mi alvenis al ĉi tiu punkto en la vivo

Ne necesas diri, ke ni, la estontaj Majstroj de Scienco, pro nia juneca stulteco, evitis skribi kodon kiel fajro. Jen, ekzemple, Simulink de MathWorks: jen la blokoj, jen la konektoj, jen ĉiaj agordoj kaj ŝaltiloj.

Vido denaska kaj komprenebla por homo, kiu antaŭe laboris en cirkvitodezajno kaj sistema inĝenierado!

"Manifesto por komencaj programistoj de rilataj fakoj" aŭ kiel mi alvenis al ĉi tiu punkto en la vivo
fonto: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Do ŝajnis al ni...

Realaĵo

Unu el la praktikaj verkoj de la unua semestro estis la evoluo de OFDM-signalradio-ricevilo kiel parto de la temo "Metodoj por Modeligado kaj Optimumigo". La ideo estas tre sukcesa: la teknologio daŭre estas trafa kaj sufiĉe populara pro sia uzo, ekzemple, en retoj Wi-Fi kaj LTE/LTE-A (en formo de OFDMA). Ĉi tio estas la plej bona afero por majstroj praktiki siajn kapablojn en modeligado de telekomunikaj sistemoj.

"Manifesto por komencaj programistoj de rilataj fakoj" aŭ kiel mi alvenis al ĉi tiu punkto en la vivo

Kaj nun ni ricevas plurajn eblojn de teknikaj specifoj kun evidente nepraktikaj kadraj parametroj (por ne serĉi solvon en la Interreto), kaj ni saltas sur la jam menciitan Simulink... Kaj ni estas batitaj sur la kapon per tekruĉo. de la realo:

  • Ĉiu bloko estas plena de multaj nekonataj parametroj, kiuj estas timige ŝanĝiĝi ĉe la guto de ĉapelo.
  • La manipuladoj kun nombroj devas esti faritaj, ŝajnas, simplaj, sed vi ankoraŭ devas tumulti, Dio gardu.
  • Katedralaj maŝinoj rimarkeble malrapidiĝas de la panika uzo de la GUI, eĉ ĉe la stadio de navigado tra bibliotekoj de disponeblaj blokoj.
  • Por fini ion hejme, vi devas havi la saman Simulink. Kaj, fakte, neniuj alternativoj.

Jes, finfine ni, kompreneble, kompletigis la projekton, sed ni kompletigis ĝin per laŭta elspiro de malpeziĝo.

Iom da tempo pasis, kaj ni venis al la fino de la unua jaro de la magistro. La kvanto de hejmtasko uzanta GUI-ojn komencis fali proporcie kun la pliiĝo en la proporcio de germanaj temoj, kvankam ĝi ankoraŭ ne atingis la punkton de paradigmoŝanĝo. Multaj el ni, inkluzive de mi, venkante nian konsiderindan amplekson konstrui, pli kaj pli uzis Matlab en niaj sciencaj projektoj (kvankam en la formo de Toolboxes), kaj ne la ŝajne konatan Simulink.

La punkto en niaj duboj estis la frazo de unu el la dujaraj studentoj (ili ĵus revenis al Rusio en tiu tempo):

  • Forgesu, almenaŭ dum la daŭro de la staĝo, pri Similink, MathCad kaj aliaj LabView - super la monteto ĉio estas skribita en MATLAB, uzante MatLab mem aŭ ĝian senpagan "version" Octave.

La deklaro montriĝis parte vera: en Ilmenau ankaŭ la disputo pri la elekto de iloj ne estis tute solvita. Vere, la elekto estis plejparte inter MATLAB, Python kaj C.

En la sama tago, mi estis prenita de natura ekscito: ĉu mi ne devus transdoni mian parton de la OFDM-dissendilo-modelo en skripton? Nur por amuzo.

Kaj mi eklaboris.

Paŝo post paŝo

Anstataŭ teoriaj kalkuloj, mi simple donos ligilon al ĉi tio bonega artikolo 2011 de tgx kaj sur la lumbildoj LTE fizika tavolo profesoroj Michel-Tila (TU Ilmenau). Mi pensas, ke ĉi tio sufiĉos.

"Do," mi pensis, "ni ripetu, kion ni modeligos?"
Ni modelos OFDM-frama generatoro (OFDM framgeneratoro).

Kion ĝi inkluzivos:

  • informaj simboloj
  • pilotaj signaloj
  • nuloj (DC)

De kio (por simpleco) ni abstraktas:

  • de modelado de cikla prefikso (se vi konas la bazojn, aldoni ĝin ne estos malfacila)

"Manifesto por komencaj programistoj de rilataj fakoj" aŭ kiel mi alvenis al ĉi tiu punkto en la vivo

Blokdiagramo de la modelo konsiderata. Ni haltos ĉe la inversa FFT (IFFT) bloko. Por kompletigi la bildon, ĉiu povas mem daŭrigi la ceterajn – mi promesis al la instruistoj de la fako lasi ion por la lernantoj.

Ni difinu tiujn por ni mem. ekzerco:

  • fiksa nombro da subportantoj;
  • fiksa kadro-longo;
  • ni devas aldoni unu nulon en la mezo kaj paron da nuloj ĉe la komenco kaj fino de la kadro (entute, 5 pecoj);
  • informsimboloj estas modulitaj uzante M-PSK aŭ M-QAM, kie M estas la modula ordo.

Ni komencu per la kodo.

La tuta skripto estas elŝutebla de ligilo.

Ni difinu la enigajn parametrojn:

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

Nun ni determinas la indeksojn de informaj simboloj, akceptante la premison, ke pilotsignaloj nepre devas iri antaŭ kaj/aŭ post nuloj:

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

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

Tiam la pozicioj povas esti determinitaj uzante la funkcion linspace, reduktante la valorojn al la plej malgranda el la plej proksimaj entjeroj:

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

Ni aldonu indeksojn de nuloj al ĉi tio kaj ordigu:

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

Sekve, la pilotsignalaj indicoj estas ĉio alia:

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

Nun ni komprenu pilotsignalojn.

Ni havas ŝablonon (variablo pilotoj), kaj ni diru, ke ni volas, ke pilotoj de ĉi tiu ŝablono estu enmetitaj en nian kadron sinsekve. Kompreneble, ĉi tio povas esti farita en buklo. Aŭ vi povas ludi iom ruze kun matricoj - feliĉe MATLAB permesas fari tion kun sufiĉa komforto.

Unue, ni determinu kiom da ĉi tiuj ŝablonoj tute konvenas en la kadron:

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

Poste, ni formas vektoron kiu konsistas el niaj ŝablonoj:

% 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

Kaj ni difinas malgrandan vektoron, kiu enhavas nur pecon de la ŝablono - la "vosto", kiu ne tute konvenas en la kadron:

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

Ni ricevas pilotfigurojn:

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

Ni iru al informaj simboloj, nome, ni formos mesaĝon kaj modulos ĝin:

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 

Ĉio estas preta! Kunvenado de la kadro:

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

Vi devus ricevi ion tian:

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

"Feliĉo!" — Mi pensis kontente kaj fermis la tekkomputilon. Mi bezonis kelkajn horojn por fari ĉion: inkluzive de skribi kodon, lerni kelkajn Matlab-funkciojn kaj pripensi matematikajn lertaĵojn.

Kiajn konkludojn mi tiris tiam?

Subjektiva:

  • Skribi kodon estas agrabla kaj simila al poezio!
  • Skripto estas la plej oportuna esplormetodo por la kampo de Komunikado kaj Signal-Pretigo.

Objektivo:

  • Ne necesas pafi paserojn el kanono (krom se tia eduka celo kompreneble indas): uzante Simulink, ni okupiĝis pri solvi simplan problemon per kompleksa ilo.
  • GUI estas bona, sed kompreni kio estas enhavita "sub la kapuĉo" estas pli bona.

Kaj nun, estante malproksime de esti studento, mi volas diri jenon al la studenta frataro:

  • Iru por ĝi!

Provu skribi kodon, eĉ se ĝi unue estas malbona. Kun programado, kiel kun ajna alia aktiveco, la plej malfacila parto estas la komenco. Kaj estas pli bone komenci pli frue: se vi estas sciencisto aŭ eĉ nur teknikisto, pli aŭ malpli frue vi bezonos ĉi tiun kapablon.

  • Postulo!

Postulu progresemajn alirojn kaj ilojn de instruistoj kaj kontrolistoj. Se tio eblas, kompreneble...

  • Kreu!

Kie alie estas pli bone superi ĉiujn ulcerojn de komencanto, se ne kadre de eduka programo? Kreu kaj perfektigu viajn kapablojn - denove, ju pli frue vi komencos, des pli bone.

Aspirantaj programistoj el ĉiuj landoj, kuniĝu!

PS

Por registri mian rektan rilaton kun studentoj, mi aldonas memorindan foton de 2017 kun du rektoroj: Peter Scharff (dekstre) kaj Albert Kharisovich Gilmutdinov (maldekstre).

"Manifesto por komencaj programistoj de rilataj fakoj" aŭ kiel mi alvenis al ĉi tiu punkto en la vivo

Valoris fini la programon almenaŭ por ĉi tiuj kostumoj! (ŝercante)

fonto: www.habr.com

Aldoni komenton