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.

Source:
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 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).

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!

Source:
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.

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 2011 von und auf den Folien Professoren (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)

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 .
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 nullsJetzt 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 , 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 concatenationFĂŒ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); % vectorizationUnd 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 vectorWir bekommen Pilotcharaktere:
vec_pilots = [resh; tail]; % completed pilots vector that frame consistsKommen 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_symbolsSie 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).

Zumindest fĂŒr diese KostĂŒme hat es sich gelohnt, das Programm zu beenden! (scherzhaft)
Source: habr.com
