Mi artículo de hoy es pensamientos en voz alta de una persona que se embarcó en el camino de la programación casi por accidente (aunque naturalmente).
Sí, entiendo que mi experiencia es solo mi experiencia, pero me parece que encaja bien en la tendencia general. Además, la experiencia que se describe a continuación es más relevante para el campo de la actividad científica, pero qué demonios no es una broma: puede ser útil en el exterior.

Fuente: https://xkcd.com/664/
En general, ¡está dedicado a todos los estudiantes reales de un ex alumno!
Las expectativas
Cuando en 2014 terminé mi licenciatura en "Tecnologías de la información y la comunicación y los sistemas de comunicación" no sabía casi nada sobre el mundo de la programación. Sí, yo, como muchos, tuve una asignatura de informática en el primer año, pero, Dios mío, ¡fue en el primer año! ¡Han pasado años!
En general, no esperaba nada particularmente diferente de la licenciatura, y de inscribirme en el programa de maestría "Comunicación y procesamiento de señales" del Instituto de Nuevas Tecnologías Alemán-Ruso.
Pero en vano ...
Solo éramos el segundo set, y los chicos del primero solo recogieron sus maletas en la lejana Alemania (la pasantía dura seis meses en el segundo año de la escuela de posgrado). En otras palabras, ninguno de los círculos más cercanos aún tiene que lidiar seriamente con los métodos de educación europea, y no había mucho que preguntar sobre los detalles.
En nuestro primer año, por supuesto, tuvimos todo tipo de prácticas, en las que generalmente se nos ofreció democráticamente la elección entre escribir guiones (principalmente en MATLAB) y usar diferentes GUI altamente especializadas (en el sentido de que sin escribir guiones, entornos de simulación).

No hace falta decir que nosotros, los futuros Maestros de la Ciencia, por nuestra estupidez juvenil, como el fuego, evitamos escribir código. Aquí, por ejemplo, él es Simulink de MathWorks: aquí están los bloques, aquí están las comunicaciones, aquí están todo tipo de configuraciones e interruptores.
Nativo y comprensible para una persona que anteriormente se dedicaba a la ingeniería de circuitos y sistemas, ¡mira! Entonces nos pareció ...
Realidad
Uno de los trabajos prácticos del primer semestre fue el desarrollo de un transceptor de señal OFDM en el marco de la asignatura "Métodos de modelado y optimización". La idea es muy exitosa: la tecnología sigue siendo relevante y bastante popular debido a su uso, por ejemplo, en redes Wi-Fi y LTE / LTE-A (en forma de OFDMA). Lo más importante para los maestros es entrenar sus habilidades en el modelado de sistemas de telecomunicaciones.

Y ahora se nos dan varias opciones para especificaciones técnicas con parámetros de marco obviamente poco prácticos (para no buscar una solución en Internet), y atacamos el Simulink ya mencionado ... Y tenemos una tetera de la realidad en la cabeza:
- Cada bloque está lleno de muchos parámetros desconocidos, que dan miedo cambiar de la kondachka.
- Las manipulaciones con números deben hacerse, parece, simple, pero Dios no lo quiera, de todos modos es necesario cercar.
- Los autos de la catedral se ralentizan notablemente por el uso agitado de la GUI, incluso en la etapa de navegar a través de las bibliotecas de los bloques disponibles.
- Para terminar algo en casa, debes tener el mismo Simulink. Y no, en realidad, alternativas.
Sí, al final, por supuesto, completamos el proyecto, pero lo completamos con un fuerte suspiro de alivio.
Pasó un tiempo y llegamos al final del primer año del programa de maestría. La cantidad de tarea con la GUI comenzó a disminuir proporcionalmente con un aumento en la proporción de sujetos alemanes, aunque todavía no alcanzó el punto de cambio de paradigma. Muchos de nosotros, incluyéndome a mí, superando nuestra considerable amplitud en la acumulación, usamos cada vez más exactamente Matlab (aunque en forma de Toolboxes) en sus proyectos científicos, en lugar de un Simulink aparentemente familiar.
El punto en nuestras dudas fue la frase de uno de los estudiantes de segundo año (que acababan de regresar a Rusia en ese momento):
- Olvídese, al menos durante su pasantía, sobre Similink, MathCad y otros LabView: detrás de la colina, todos escriben en MATLAB, utilizando MatLab o su "versión" gratuita de Octave.
La declaración resultó ser parcialmente cierta: en Ilmenau, la disputa sobre la elección de herramientas tampoco se resolvió hasta el final. Es cierto que la elección fue principalmente entre los lenguajes MATLAB, Python y C.
El mismo día, la emoción lógica me llevó: ¿podría transferir mi parte del modelo de transmisor OFDM a un formulario de script? Solo por diversión.
Y me puse a trabajar.
Paso a paso
En lugar de cálculos teóricos, solo daré un enlace a este excelente artículo de 2011 de tgx y las diapositivas sobre el nivel físico de LTE por el profesor Michel-Thiel (TU Ilmenau). Creo que eso será suficiente.
"Entonces", pensé, "repitamos ¿qué vamos a modelar?"
Simularemos el generador de trama OFDM.
Lo que incluirá:
- símbolos de información
- señales piloto
- ceros (DC)
De lo que (en aras de la simplicidad) abstraemos:
- desde el modelado de un prefijo cíclico (si conoce los conceptos básicos, agregarlo no será difícil)

El diagrama de bloques del modelo en consideración. Nos detendremos al bloque de la devolución FFT (IFFT). Todos pueden continuar el resto para completar la imagen ellos mismos: les prometí a los maestros del departamento que dejarían algo para los estudiantes.
Definimos para nosotros esos. tarea:
- número fijo de subportadoras;
- longitud fija del marco;
- debemos agregar un cero al medio y un par de ceros al principio y al final del cuadro (total, 5 piezas);
- Los símbolos de información se modulan utilizando M-PSK o M-QAM, donde M es el orden de modulación.
Llegando al código.
El script completo se puede descargar aquí .
Defina los parámetros de entrada:
clear all; close all; clc M = 4;
Ahora definimos los índices de símbolos de información, asumiendo la premisa de que las señales piloto deben ir necesariamente antes y / o después de ceros:
idx_1_start = 4; idx_1_end = fr_len/2 - 2; idx_2_start = fr_len/2 + 2; idx_2_end = fr_len - 3;
Luego, las posiciones se pueden determinar utilizando la función linspace , convirtiendo los valores al menor de los enteros más cercanos:
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];
Agregue índices cero a esto y ordene:
En consecuencia, los índices de señal piloto son todo lo demás:
Ahora tratemos con las señales piloto.
Tenemos una plantilla (la variable piloto ), y digamos que queremos que los pilotos se inserten de esta plantilla secuencialmente en nuestro marco. Esto, por supuesto, se puede hacer en un bucle. Y puede ser un poco más sabio con las matrices: el beneficio de MATLAB le permite hacer esto con suficiente comodidad.
Primero, determine cuántos patrones de este tipo encajan completamente en el marco:
pilots_len_psudo = floor(N_pil/length(pilots));
A continuación, formamos un vector, que consiste en nuestras plantillas:
Y definimos un pequeño vector que contiene solo una parte de la plantilla: la "cola", que no encaja completamente en el marco:
tail_len = fr_len - N_inf - length(nulls_idx) ... - length(pilots)*pilots_len_psudo; tail = pilots(1:tail_len);
Obtenemos los símbolos piloto:
vec_pilots = [resh; tail];
Pasamos a los símbolos de información, es decir, formaremos un mensaje y lo modularemos:
message = randi([0 M-1], N_inf, 1);
Todo esta listo! Poniendo el marco juntos:
Debería resultar algo como esto:
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
"¡Zumbido!" - Pensé bastante y cerré la laptop. Me llevó un par de horas hacer todo: incluso escribir código, aprender algunas funciones de Matlab y pensar en trucos matemáticos.
¿Qué conclusiones saqué entonces?
Subjetivo :
- ¡Escribir código es agradable y parecido a la poesía!
- La secuencia de comandos es el método de investigación más conveniente para el campo de la comunicación y el procesamiento de señales.
Objetivo :
- No es necesario disparar gorriones desde un cañón (si ese objetivo educativo, por supuesto, no vale la pena): usando Simulink, nos propusimos resolver una tarea simple con una herramienta sofisticada.
- Una GUI es buena, pero es mejor comprender qué hay debajo del capó.
Y ahora, estando lejos de ser un estudiante, quiero decir lo siguiente a la fraternidad de estudiantes:
Intente escribir código, incluso si al principio será malo. Con la programación como con cualquier otra actividad, el apuro es el comienzo. Y es mejor comenzar antes: si eres un científico o incluso un técnico, tarde o temprano necesitarás esta habilidad.
Exija enfoques innovadores y herramientas de educadores y supervisores. Si es, por supuesto, tanto como sea posible ...
¿Dónde es aún mejor enfermarse con las llagas de un principiante, si no como parte del programa educativo? Crea y perfecciona tus habilidades; de nuevo, cuanto antes comiences, mejor.
Programadores novatos de todos los países, ¡únanse!
PS
Para registrar mi relación directa con los estudiantes, adjunto una foto memorable de 2017 con dos rectores: Peter Sharff (derecha) y Albert Harisovich Gilmutdinov (izquierda).

¡Valió la pena terminar el programa al menos por el bien de tales disfraces! (es broma)