Mon article d'aujourd'hui est une réflexion à haute voix d'une personne qui s'est engagée sur la voie de la programmation presque par accident (bien que naturellement).
Oui, je comprends que mon expérience n'est que mon expérience, mais il me semble qu'elle s'inscrit bien dans la tendance générale. De plus, l'expérience décrite ci-dessous est plus pertinente pour le domaine de l'activité scientifique, mais ce n'est pas une blague - elle peut être utile à l'extérieur.

Source: https://xkcd.com/664/
En général, il est dédié à tous les vrais étudiants d'un ancien étudiant!
Les attentes
Quand, en 2014, j'ai terminé mon diplôme de premier cycle en "technologies de l'information et de la communication et systèmes de communication", je ne savais presque rien du monde de la programmation. Oui, comme beaucoup, j'avais un sujet "Informatique" dans ma première année - mais, mon Dieu, c'était dans ma première année! Ça fait des lustres!
En général, je ne m'attendais pas à quelque chose de particulièrement différent du premier cycle et à l'inscription au programme de maîtrise "Communication et traitement du signal" de l' Institut germano-russe des nouvelles technologies.
Mais en vain ...
Nous n'étions que le deuxième set, et les gars du premier venaient de récupérer leurs sacs dans la lointaine Allemagne (le stage dure six mois en deuxième année de master). En d'autres termes, aucun des cercles les plus proches n'a encore abordé sérieusement les méthodes de l'éducation européenne et il n'y avait pas grand chose à demander sur les détails.
Au cours de notre première année, bien sûr, nous avions toutes sortes de pratiques, au cours desquelles on nous proposait généralement démocratiquement le choix entre l'écriture de scripts (principalement dans MATLAB) et l'utilisation de différentes interfaces graphiques hautement spécialisées (dans le sens où sans écriture de scripts - environnements de simulation).

Inutile de dire que nous, les futurs maîtres des sciences, par notre stupidité juvénile, comme le feu, avons évité d'écrire du code. Ici, par exemple, il est Simulink de MathWorks: ici ce sont des blocs, ici ce sont des communications, ici ce sont toutes sortes de paramètres et de commutateurs.
Native et compréhensible pour une personne qui était auparavant engagée dans les circuits et l'ingénierie des systèmes, regardez! Il nous a donc semblé ...
La réalité
L'un des travaux pratiques du premier semestre a été le développement d'un émetteur-récepteur de signaux OFDM dans le cadre du sujet "Méthodes de modélisation et d'optimisation". L'idée est très réussie: la technologie est toujours pertinente et très populaire en raison de son utilisation, par exemple, dans les réseaux Wi-Fi et LTE / LTE-A (sous la forme OFDMA). La chose la plus importante pour les maîtres est de former leurs compétences en modélisation de systèmes de télécommunications.

Et maintenant, nous avons plusieurs options pour les spécifications techniques avec des paramètres de trame évidemment peu pratiques (afin de ne pas chercher de solution sur Internet), et nous attaquons le Simulink déjà mentionné ... Et nous obtenons une théière de réalité sur la tête:
- Chaque bloc est chargé de nombreux paramètres inconnus, qui sont effrayants à changer par rapport au kondachka.
- Des manipulations avec des chiffres doivent être faites, semble-t-il, simple, mais Dieu nous en garde, il faut tout de même clôturer.
- Les voitures de la cathédrale ralentissent sensiblement à cause de l'utilisation intense de l'interface graphique, même au stade de la navigation dans les bibliothèques de blocs disponibles.
- Pour terminer quelque chose à la maison, vous devez avoir le même Simulink. Et non, en fait, des alternatives.
Oui, à la fin, bien sûr, nous avons terminé le projet, mais nous l'avons terminé avec un grand soupir de soulagement.
Un certain temps s'est écoulé et nous sommes arrivés à la fin de la première année du programme de maîtrise. La quantité de devoirs à l'aide de l'interface graphique a commencé à diminuer proportionnellement avec une augmentation de la part des sujets allemands, bien qu'elle n'atteigne toujours pas le point de changement de paradigme. Beaucoup d'entre nous, y compris moi, surmontant notre amplitude considérable à l'accumulation, de plus en plus utilisé exactement Matlab (bien que sous la forme de boîtes à outils) dans leurs projets scientifiques, plutôt qu'un Simulink apparemment familier.
Le point dans nos doutes était la phrase d'un des étudiants de deuxième année (ils venaient de rentrer en Russie à cette époque):
- Oubliez, au moins pendant votre stage, à propos de Similink, MathCad et autres LabView - derrière la colline tout le monde écrit dans MATLAB, en utilisant MatLab lui-même ou sa "version" gratuite d'Octave.
La déclaration s'est avérée partiellement vraie: à Ilmenau, le différend sur le choix des outils n'a pas non plus été résolu jusqu'au bout. Certes, le choix s'est surtout fait entre les langages MATLAB, Python et C.
Le même jour, l'excitation logique m'a pris: pourrais-je transférer ma partie du modèle d'émetteur OFDM sous forme de script? Juste pour le plaisir.
Et je me suis mis au travail.
Pas à pas
Au lieu de calculs théoriques, je vais juste donner un lien vers cet excellent article de 2011 de tgx et vers les diapositives sur le niveau physique du LTE du professeur Michel-Thiel (TU Ilmenau). Je pense que ce sera suffisant.
"Alors," je pensais, "répétons ce que nous allons modéliser?"
Nous simulerons le générateur de trame OFDM.
Ce qu'il comprendra:
- symboles d'information
- signaux pilotes
- zéros (DC)
De quoi (par souci de simplicité) nous faisons abstraction:
- de la modélisation d'un préfixe cyclique (si vous connaissez les bases, l'ajouter ne sera pas difficile)

Le schéma de principe du modèle considéré. Nous nous arrêterons au bloc du retour FFT (IFFT). Chacun peut continuer le reste pour compléter le tableau lui-même - j'ai promis aux professeurs du département de laisser quelque chose aux élèves.
Nous les définissons nous-mêmes. tâche:
- nombre fixe de sous-porteuses;
- longueur de cadre fixe;
- nous devons ajouter un zéro au milieu et une paire de zéros au début et à la fin du cadre (total, 5 pièces);
- les symboles d'information sont modulés en utilisant M-PSK ou M-QAM, où M est l'ordre de modulation.
Accéder au code.
Le script complet peut être téléchargé ici .
Définissez les paramètres d'entrée:
clear all; close all; clc M = 4;
Nous définissons maintenant les indices des symboles d'information, en supposant que les signaux pilotes doivent nécessairement aller avant et / ou après les zéros:
idx_1_start = 4; idx_1_end = fr_len/2 - 2; idx_2_start = fr_len/2 + 2; idx_2_end = fr_len - 3;
Ensuite, les positions peuvent être déterminées à l'aide de la fonction linspace , en convertissant les valeurs au plus petit des entiers les plus proches:
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];
Ajoutez zéro indice à cela et triez:
En conséquence, les indices de signal pilote sont tout le reste:
Voyons maintenant les signaux pilotes.
Nous avons un modèle (la variable pilotes ), et disons que nous voulons que les pilotes soient insérés de ce modèle séquentiellement dans notre cadre. Cela peut, bien sûr, être fait en boucle. Et vous pouvez être un peu plus sage avec les matrices - l'avantage de MATLAB vous permet de le faire avec un confort suffisant.
Tout d'abord, déterminez combien de modèles de ce type tiennent complètement dans le cadre:
pilots_len_psudo = floor(N_pil/length(pilots));
Ensuite, nous formons un vecteur, qui se compose de nos modèles:
Et nous définissons un petit vecteur qui ne contient qu'une partie du modèle - la «queue», qui ne rentre pas complètement dans le cadre:
tail_len = fr_len - N_inf - length(nulls_idx) ... - length(pilots)*pilots_len_psudo; tail = pilots(1:tail_len);
Nous obtenons les symboles pilotes:
vec_pilots = [resh; tail];
Nous passons aux symboles d'information, à savoir, nous allons former un message et le moduler:
message = randi([0 M-1], N_inf, 1);
Tout est prêt! Assembler le cadre:
Il devrait en résulter quelque chose comme ceci:
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!" - J'ai bien réfléchi et j'ai fermé l'ordinateur portable. Cela m'a pris quelques heures pour tout faire: y compris écrire du code, apprendre certaines fonctions de Matlab et réfléchir à des astuces mathématiques.
Quelles conclusions ai-je tirées alors
Subjective :
- L'écriture de code est agréable et s'apparente à de la poésie!
- Le scripting est la méthode de recherche la plus pratique pour le domaine de la communication et du traitement du signal.
Objectif :
- Pas besoin de tirer des moineaux à partir d'un canon (si un tel objectif éducatif, bien sûr, n'en vaut pas la peine): en utilisant Simulink, nous avons entrepris de résoudre une tâche simple avec un outil sophistiqué.
- Une interface graphique est bonne, mais mieux comprendre ce qui se cache sous le capot.
Et maintenant, étant loin d'être étudiant, je veux dire ce qui suit à la fraternité étudiante:
Essayez d'écrire du code, même si au début ce sera mauvais. Avec la programmation comme avec toute autre activité, les ennuis fringants sont le début. Et il vaut mieux commencer plus tôt: si vous êtes un scientifique ou même juste un technicien, tôt ou tard vous aurez besoin de cette compétence.
Exigez des enseignants et des superviseurs des approches et des outils innovants. Si c'est, bien sûr, autant que possible ...
Où est-il encore mieux de tomber malade avec des plaies de débutant, sinon dans le cadre du programme éducatif? Créez et perfectionnez vos compétences - encore une fois, plus vous commencez tôt, mieux c'est.
Programmeurs novices de tous les pays, unissez-vous!
PS
Afin d'enregistrer ma relation directe avec les étudiants, je joins une photo mémorable de 2017 avec deux recteurs: Peter Sharff (à droite) et Albert Harisovich Gilmutdinov (à gauche).

Cela valait la peine de terminer le programme au moins pour de tels costumes! (je plaisante)