"Manifest von Programmieranfängern aus verwandten Fachgebieten" oder wie ich zu einem solchen Leben kam

Mein heutiger Artikel handelt von lauten Gedanken einer Person, die sich fast zufällig (wenn auch natürlich) auf den Weg der Programmierung gemacht hat.


Ja, ich verstehe, dass meine Erfahrung nur meine Erfahrung ist, aber es scheint mir, dass sie gut in den allgemeinen Trend fällt. Darüber hinaus ist die unten beschriebene Erfahrung für das Gebiet der wissenschaftlichen Tätigkeit relevanter, aber was zum Teufel nicht scherzt - es kann sich draußen als nützlich erweisen.



Quelle: https://xkcd.com/664/


Im Allgemeinen widmet er sich allen echten Schülern eines ehemaligen Schülers!


Erwartungen


Als ich 2014 mein Grundstudium in "Informations- und Kommunikationstechnologien und Kommunikationssysteme" abschloss, wusste ich fast nichts über die Programmierwelt. Ja, ich hatte, wie viele, im ersten Jahr ein Informatikfach - aber mein Gott, es war im ersten Jahr! Es ist Ewigkeiten her!


Generell hatte ich nichts Besonderes erwartet als ein Bachelor-Abschluss und die Einschreibung in den Masterstudiengang "Kommunikation und Signalverarbeitung" des Deutsch-Russischen Instituts für Neue Technologien.


Aber vergebens ...


Wir waren erst der zweite Satz, und die Jungs vom ersten haben gerade ihre Koffer im fernen Deutschland abgeholt (das Praktikum dauert sechs Monate im zweiten Jahr des Masterstudiengangs). Mit anderen Worten, keiner der engsten Kreise hat sich bisher ernsthaft mit den Methoden der europäischen Bildung befasst, und es gab nicht viel zu fragen.


In unserem ersten Jahr hatten wir natürlich alle möglichen Praktiken, bei denen uns normalerweise demokratisch die Wahl zwischen dem Schreiben von Skripten (hauptsächlich in MATLAB) und der Verwendung verschiedener hochspezialisierter GUIs (in dem Sinne, dass ohne Schreiben von Skripten - Simulationsumgebungen) angeboten wurde.



Unnötig zu erwähnen, dass wir, die zukünftigen Meister der Wissenschaft, aufgrund unserer jugendlichen Dummheit wie Feuer vermieden haben, Code zu schreiben. Hier ist er zum Beispiel Simulink von MathWorks: Hier sind sie Blöcke, hier sind sie Kommunikation, hier sind sie alle Arten von Einstellungen und Schaltern.


Muttersprachlich und verständlich für eine Person, die zuvor in der Schaltungs- und Systemtechnik tätig war.

So kam es uns vor ...


Realität


Eine der praktischen Arbeiten des ersten Semesters war die Entwicklung eines OFDM-Signaltransceivers im Rahmen des Faches "Methoden zur Modellierung und Optimierung". Die Idee ist sehr erfolgreich: Die Technologie ist nach wie vor relevant und sehr beliebt, da sie beispielsweise in Wi-Fi- und LTE / LTE-A-Netzwerken (in Form von OFDMA) eingesetzt wird. Das Wichtigste für Meister ist, ihre Fähigkeiten in der Modellierung von Telekommunikationssystemen zu trainieren.



Und jetzt haben wir verschiedene Optionen für technische Spezifikationen mit offensichtlich unpraktischen Rahmenparametern (um nicht im Internet nach einer Lösung zu suchen), und wir greifen den bereits erwähnten Simulink an ... Und wir bekommen eine Teekanne Realität auf den Kopf:


  • Jeder Block ist mit vielen unbekannten Parametern behaftet, deren Veränderung gegenüber der Kondachka beängstigend ist.
  • Manipulationen mit Zahlen müssen anscheinend einfach durchgeführt werden, aber Gott verbietet es trotzdem, zu zäunen.
  • Die Autos der Kathedrale werden durch die hektische Nutzung der grafischen Benutzeroberfläche spürbar langsamer, selbst wenn sie durch die Bibliotheken der verfügbaren Blöcke surfen.
  • Um etwas zu Hause zu erledigen, benötigen Sie denselben Simulink. Und eigentlich keine Alternativen.

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


Einige Zeit verging und wir kamen zum Ende des ersten Jahres des Masterstudiengangs. Die Anzahl der Hausaufgaben, die die grafische Benutzeroberfläche verwenden, begann proportional zu sinken, wobei der Anteil der deutschen Probanden zunahm, obwohl sie noch nicht den Punkt des Paradigmenwechsels erreichten. Viele von uns, einschließlich mir, überwanden immer mehr genau Matlab (wenn auch in Form von Toolboxen) in ihren wissenschaftlichen Projekten und nicht nur einen scheinbar vertrauten Simulink.


Der Punkt in unseren Zweifeln war der Satz eines Studenten im zweiten Jahr (sie waren gerade zu diesem Zeitpunkt nach Russland zurückgekehrt):


  • Vergessen Sie zumindest während Ihres Praktikums Similink, MathCad und andere LabView - hinter dem Hügel schreibt jeder in MATLAB mit MatLab selbst oder seiner kostenlosen "Version" von Octave.

Die Aussage hat sich teilweise als richtig erwiesen: In Ilmenau wurde der Streit um die Wahl der Werkzeuge ebenfalls nicht bis zum Ende beigelegt. Die Wahl fiel zwar hauptsächlich zwischen den Sprachen MATLAB, Python und C.


Am selben Tag war ich logisch aufgeregt: Könnte ich meinen Teil des OFDM-Sendermodells auf ein Skriptformular übertragen? Nur zum Spaß.


Und ich muss arbeiten.


Schritt für Schritt


Anstelle von theoretischen Berechnungen werde ich nur einen Link zu diesem hervorragenden Artikel von tgx aus dem Jahr 2011 und zu den Folien auf der physikalischen Ebene von LTE von Professor Michel-Thiel (TU Ilmenau) geben. Ich denke das wird reichen.

"Also", dachte ich, "wiederholen wir, was wir modellieren werden."
Wir werden den OFDM-Frame-Generator simulieren.


Was es beinhalten wird:


  • Informationssymbole
  • Pilotsignale
  • Nullen (DC)

Von was (der Einfachheit halber) abstrahieren wir:


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


Das Blockschaltbild des betrachteten Modells. Wir werden zum Block der Rückgabe-FFT (IFFT) anhalten. Jeder kann den Rest fortsetzen, um das Bild selbst zu vervollständigen - ich habe den Lehrern der Abteilung versprochen, etwas für die Schüler zu hinterlassen.


Wir definieren diese für uns. Aufgabe:


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

Zum Code gelangen.


Das gesamte Skript kann hier heruntergeladen werden .

Definieren Sie die Eingabeparameter:


clear all; close all; clc M = 4; % eg 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 definieren wir die Indizes von Informationssymbolen unter der Annahme, dass Pilotsignale notwendigerweise vor und / oder nach Nullen gehen 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; 

Dann können die Positionen mit der Linspace- Funktion bestimmt werden, wobei die Werte in die kleinste der nächsten ganzen Zahlen konvertiert werden :


 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 Sie dazu Nullindizes hinzu und sortieren Sie:


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

Dementsprechend sind 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 behandeln.


Wir haben eine Vorlage (die Pilotenvariable ), und wir möchten, dass Piloten nacheinander aus dieser Vorlage in unseren Rahmen eingefügt werden. Dies kann natürlich in einer Schleife erfolgen. Und mit Matrizen können Sie etwas weiser sein - der Vorteil von MATLAB ermöglicht es Ihnen, dies mit ausreichendem Komfort zu tun.


Bestimmen Sie zunächst, wie viele solcher Muster 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 ein Stück der Vorlage enthält - den „Schwanz“, der nicht vollständig in den Rahmen passte:


 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 die Pilotsymbole:


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

Wir wenden uns den Informationssymbolen zu, nämlich eine Nachricht zu bilden und sie zu modulieren:


 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! Rahmen zusammensetzen:


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

Es sollte sich ungefähr so ​​herausstellen:


 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 

"Buzz!" - Ich dachte ganz nach und schloss den Laptop. Ich habe ein paar Stunden gebraucht, um alles zu erledigen: Code schreiben, einige Matlab-Funktionen lernen und mathematische Tricks durchdenken.


Welche Schlussfolgerungen habe ich dann gezogen?


Subjektiv :


  • Das Schreiben von Code ist nett und der Poesie ähnlich!
  • Scripting ist die bequemste Forschungsmethode für den Bereich Kommunikation und Signalverarbeitung.

Ziel :


  • Sie müssen keine Spatzen aus einer Kanone schießen (wenn sich ein solches Bildungsziel natürlich nicht lohnt): Mit Simulink haben wir uns daran gemacht, eine einfache Aufgabe mit einem ausgeklügelten Werkzeug zu lösen.
  • Eine grafische Benutzeroberfläche ist gut, aber es ist besser zu verstehen, was sich unter der Haube befindet.

Und jetzt, da ich weit von einem Studenten entfernt bin, möchte ich der Studentengemeinschaft Folgendes sagen:


  • Mach es!

Versuchen Sie, Code zu schreiben, auch wenn dieser zunächst schlecht sein wird. Bei der Programmierung wie bei jeder anderen Aktivität sind schneidige Probleme der Anfang. Und es ist besser, früher zu beginnen: Wenn Sie Wissenschaftler oder auch nur ein Technikfreak sind, benötigen Sie diese Fähigkeit früher oder später.


  • Nachfrage!

Fordern Sie innovative Ansätze und Tools von Pädagogen und Betreuern. Wenn es natürlich so viel wie möglich ist ...


  • Mach es!

Wo ist es noch besser, an Wunden eines Anfängers zu erkranken, wenn nicht im Rahmen des Bildungsprogramms? Erstellen und verbessern Sie Ihre Fähigkeiten - je früher Sie anfangen, desto besser.


Anfänger aus allen Ländern, vereinigt euch!


PS


Um meine direkte Beziehung zu Studenten festzuhalten, füge ich ein denkwürdiges Foto von 2017 mit zwei Rektoren bei: Peter Sharff (rechts) und Albert Harisovich Gilmutdinov (links).


Bild


Es hat sich gelohnt, das Programm zumindest wegen solcher Kostüme zu beenden! (nur ein Scherz)

Source: https://habr.com/ru/post/de464479/


All Articles