„Manifest für angehende Programmierer aus verwandten Fachgebieten“ oder wie ich zu diesem Punkt im Leben gekommen bin

Mein heutiger Artikel enthält laute Gedanken einer Person, die fast zufällig (wenn auch ganz natürlich) den Weg des Programmierens eingeschlagen hat.

Ja, ich verstehe, dass meine Erfahrung nur meine Erfahrung ist, aber es scheint mir, dass sie gut in den allgemeinen Trend passt. Darüber hinaus beziehen sich die im Folgenden beschriebenen Erfahrungen eher auf den Bereich der wissenschaftlichen Tätigkeit, aber was zum Teufel ist kein Scherz – sie können außerhalb nützlich sein.

„Manifest für angehende Programmierer aus verwandten Fachgebieten“ oder wie ich zu diesem Punkt im Leben gekommen bin
Source: https://xkcd.com/664/

Im Allgemeinen allen aktuellen Studenten eines ehemaligen Studenten gewidmet!

Erwartungen

Als ich 2014 meinen Bachelor in Infokommunikationstechnologien und Kommunikationssystemen abschloss, wusste ich fast nichts über die Welt des Programmierens. Ja, wie viele andere habe ich das Fach „Informatik“ in meinem ersten Jahr belegt – aber, Herrgott, es war in meinem ersten Jahr! Es ist eine Ewigkeit her!

Generell habe ich von einem Bachelorstudium und dem Einstieg in das Masterstudium nichts Besonderes erwartet „Kommunikation und Signalverarbeitung“ Deutsch-Russisches Institut für Neue Technologien.

Aber vergeblich...

Wir waren erst der zweite Studiengang und die Jungs vom ersten waren noch dabei, ihre Koffer für das ferne Deutschland zu packen (das Praktikum dauert im zweiten Jahr des Masterstudiums sechs Monate). Mit anderen Worten: Niemand aus dem unmittelbaren Umfeld hatte sich bisher ernsthaft mit den Methoden der europäischen Bildung auseinandergesetzt, und es gab niemanden, der sich nach den Einzelheiten erkundigen konnte.

In unserem ersten Jahr hatten wir natürlich verschiedene Arten von Übungen, bei denen uns normalerweise demokratisch die Wahl zwischen dem Schreiben von Skripten (hauptsächlich in der MATLAB-Sprache) und der Verwendung verschiedener hochspezialisierter GUIs (im Sinne von Simulation ohne das Schreiben von Skripten) angeboten wurde Modellierungsumgebungen).

„Manifest für angehende Programmierer aus verwandten Fachgebieten“ oder wie ich zu diesem Punkt im Leben gekommen bin

Unnötig zu erwähnen, dass wir, die zukünftigen Master of Science, es aufgrund unserer jugendlichen Dummheit vermieden haben, Code wie Feuer zu schreiben. Hier ist zum Beispiel Simulink von MathWorks: Hier sind die Blöcke, hier sind die Verbindungen, hier sind allerlei Einstellungen und Schalter.

Eine Sichtweise, die für jemanden verständlich ist, der zuvor in den Bereichen Schaltungsdesign und Systemtechnik gearbeitet hat!

„Manifest für angehende Programmierer aus verwandten Fachgebieten“ oder wie ich zu diesem Punkt im Leben gekommen bin
Source: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

So kam es uns vor...

Realität

Eine der praktischen Arbeiten des ersten Semesters war die Entwicklung eines OFDM-Signaltransceivers im Rahmen des Fachs „Methoden zur Modellierung und Optimierung“. Die Idee ist sehr erfolgreich: Die Technologie ist nach wie vor relevant und aufgrund ihrer Verwendung beispielsweise in Wi-Fi- und LTE/LTE-A-Netzwerken (in Form von OFDMA) sehr beliebt. Dies ist die beste Möglichkeit für Meister, ihre Fähigkeiten in der Modellierung von Telekommunikationssystemen zu üben.

„Manifest für angehende Programmierer aus verwandten Fachgebieten“ oder wie ich zu diesem Punkt im Leben gekommen bin

Und jetzt werden uns mehrere Optionen technischer Spezifikationen mit offensichtlich unpraktischen Rahmenparametern angezeigt (um nicht im Internet nach einer Lösung zu suchen), und wir stürzen uns auf das bereits erwähnte Simulink ... Und wir werden mit einer Teekanne auf den Kopf geschlagen der Realität:

  • Jeder Block ist mit vielen unbekannten Parametern behaftet, deren Änderung im Handumdrehen beängstigend ist.
  • Die Manipulationen mit Zahlen müssen scheinbar einfach durchgeführt werden, aber man muss trotzdem viel Aufhebens machen, Gott bewahre es.
  • Cathedral-Maschinen werden durch die hektische Nutzung der GUI merklich langsamer, selbst beim Surfen durch Bibliotheken verfügbarer Blöcke.
  • Um etwas zu Hause fertigzustellen, benötigen Sie dasselbe Simulink. Und tatsächlich: keine Alternativen.

Ja, am Ende haben wir das Projekt natürlich abgeschlossen, aber wir haben es mit einem lauten Ausatmen der Erleichterung abgeschlossen.

Es verging einige Zeit und wir waren am Ende des ersten Jahres des Masterstudiums angelangt. Mit dem Anstieg des Anteils deutscher Fächer begann der Umfang der Hausaufgaben mittels GUI proportional abzunehmen, obwohl noch kein Paradigmenwechsel eingetreten war. Viele von uns, darunter auch ich, nutzten in unseren wissenschaftlichen Projekten zunehmend Matlab (wenn auch in Form von Toolboxen) und nicht das scheinbar vertraute Simulink, nachdem wir unseren beträchtlichen Entwicklungsspielraum überwunden hatten.

Der Punkt, an dem wir zweifelten, war der Satz eines der Studenten im zweiten Jahr (sie waren zu diesem Zeitpunkt gerade nach Russland zurückgekehrt):

  • Vergessen Sie, zumindest für die Dauer des Praktikums, Similink, MathCad und anderes LabView – auf der anderen Seite ist alles in MATLAB geschrieben, mit MatLab selbst oder seiner kostenlosen „Version“ Octave.

Die Aussage erwies sich teilweise als richtig: Auch in Ilmenau wurde der Streit um die Wahl der Werkzeuge nicht vollständig beigelegt. Die Wahl fiel zwar hauptsächlich zwischen MATLAB, Python und C.

Am selben Tag überkam mich eine natürliche Aufregung: Sollte ich meinen Teil des OFDM-Sendermodells nicht in eine Skriptform übertragen? Nur zum Spaß.

Und ich machte mich an die Arbeit.

Schritt für Schritt

Anstelle theoretischer Berechnungen gebe ich einfach einen Link dazu ausgezeichneter Artikel 2011 von tgx und auf den Folien Physikalische LTE-Schicht Professoren Michel-Tila (TU Ilmenau). Ich denke, das wird ausreichen.

„Also“, dachte ich, „lasst uns wiederholen: Was werden wir modellieren?“
Wir werden modellieren OFDM-Framegenerator (OFDM-Rahmengenerator).

Was es beinhalten wird:

  • Informationssymbole
  • Pilotsignale
  • Nullen (DC)

Wovon wir (der Einfachheit halber) abstrahieren:

  • von der Modellierung eines zyklischen Präfixes (wenn Sie die Grundlagen kennen, wird das Hinzufügen nicht schwierig sein)

„Manifest für angehende Programmierer aus verwandten Fachgebieten“ oder wie ich zu diesem Punkt im Leben gekommen bin

Blockdiagramm des betrachteten Modells. Wir werden beim inversen FFT-Block (IFFT) anhalten. Um das Bild abzurunden, kann jeder den Rest selbst weitermachen – ich habe den Lehrern des Fachbereichs versprochen, den Schülern etwas zu hinterlassen.

Definieren wir diese für uns. Übung:

  • feste Anzahl von Unterträgern;
  • feste Rahmenlänge;
  • wir müssen eine Null in der Mitte und ein Paar Nullen am Anfang und Ende des Rahmens hinzufügen (insgesamt 5 Stück);
  • Informationssymbole werden mit M-PSK oder M-QAM moduliert, wobei M die Modulationsreihenfolge ist.

Beginnen wir mit dem Code.

Das gesamte Skript kann hier heruntergeladen werden Link.

Definieren wir die Eingabeparameter:

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

Jetzt bestimmen wir die Indizes von Informationssymbolen und akzeptieren die Prämisse, dass Pilotsignale notwendigerweise vor und/oder nach Nullen stehen müssen:

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

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

Anschließend können mit der Funktion die Positionen ermittelt werden Linspace, Reduzieren der Werte auf die kleinste der nächsten ganzen Zahlen:

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

Fügen wir hier Indizes von Nullen hinzu und sortieren:

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

Dementsprechend sind die Pilotsignalindizes alles andere:

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

Lassen Sie uns nun die Pilotsignale verstehen.

Wir haben eine Vorlage (variabel Piloten), und nehmen wir an, wir möchten, dass Piloten aus dieser Vorlage nacheinander in unseren Frame eingefügt werden. Dies kann natürlich auch in einer Schleife erfolgen. Oder Sie spielen ein wenig knifflig mit Matrizen – glücklicherweise ermöglicht Ihnen MATLAB dies mit ausreichend Komfort.

Ermitteln wir zunächst, wie viele dieser Vorlagen vollständig in den Rahmen passen:

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

Als nächstes bilden wir einen Vektor, der aus unseren Vorlagen besteht:

% 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

Und wir definieren einen kleinen Vektor, der nur einen Teil der Vorlage enthält – den „Schwanz“, der nicht vollständig in den Rahmen passt:

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

Wir bekommen Pilotcharaktere:

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

Kommen wir zu den Informationssymbolen, wir bilden nämlich eine Nachricht und modulieren sie:

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 

Alles ist fertig! Zusammenbau des Rahmens:

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

Sie sollten so etwas erhalten:

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

"Wonne!" – dachte ich zufrieden und klappte den Laptop zu. Ich habe ein paar Stunden gebraucht, um alles zu erledigen: einschließlich dem Schreiben von Code, dem Erlernen einiger Matlab-Funktionen und dem Durchdenken mathematischer Tricks.

Welche Schlussfolgerungen habe ich dann gezogen?

Subjektiv:

  • Code zu schreiben ist angenehm und ähnelt der Poesie!
  • Scripting ist die bequemste Forschungsmethode für den Bereich Kommunikation und Signalverarbeitung.

Zielsetzung:

  • Es besteht keine Notwendigkeit, Spatzen aus einer Kanone abzuschießen (es sei denn, ein solches pädagogisches Ziel lohnt sich natürlich): Mithilfe von Simulink haben wir es uns zur Aufgabe gemacht, ein einfaches Problem mit einem hochentwickelten Tool zu lösen.
  • Die grafische Benutzeroberfläche ist gut, aber zu verstehen, was „unter der Haube“ steckt, ist besser.

Und jetzt, da ich noch lange kein Student bin, möchte ich der Studentenverbindung Folgendes sagen:

  • Seid guten Mutes!

Versuchen Sie, Code zu schreiben, auch wenn er zunächst schlecht ist. Beim Programmieren ist, wie bei jeder anderen Aktivität auch, der Anfang der schwierigste Teil. Und es ist besser, früher anzufangen: Wenn Sie Wissenschaftler oder auch nur ein Technikfreak sind, werden Sie diese Fähigkeit früher oder später brauchen.

  • Nachfrage!

Fordern Sie fortschrittliche Ansätze und Werkzeuge von Lehrern und Vorgesetzten. Wenn das möglich ist, natürlich...

  • Seien Sie kreativ!

Wo sonst kann man die Wehwehchen eines Anfängers besser überwinden, wenn nicht im Rahmen eines Bildungsprogramms? Erweitern und verfeinern Sie Ihre Fähigkeiten – auch hier gilt: Je früher Sie beginnen, desto besser.

Angehende Programmierer aus allen Ländern, vereinigt euch!

PS

Um meine direkte Beziehung zu den Studierenden festzuhalten, füge ich ein unvergessliches Foto von 2017 mit zwei Rektoren bei: Peter Scharff (rechts) und Albert Kharisovich Gilmutdinov (links).

„Manifest für angehende Programmierer aus verwandten Fachgebieten“ oder wie ich zu diesem Punkt im Leben gekommen bin

Zumindest für diese Kostüme hat es sich gelohnt, das Programm zu beenden! (scherzhaft)

Source: habr.com

Kommentar hinzufügen