"Manifesto de programadores iniciantes de especialidades relacionadas" ou como cheguei a essa vida

Meu artigo de hoje é um pensamento em voz alta de uma pessoa que embarcou no caminho da programação quase por acidente (embora naturalmente).


Sim, entendo que minha experiência é apenas minha, mas parece-me que cai bem na tendência geral. Além disso, a experiência descrita abaixo é mais relevante para o campo da atividade científica, mas o que diabos não está brincando - pode ser útil lá fora.



Fonte: https://xkcd.com/664/


Em geral, ele é dedicado a todos os alunos reais de um ex-aluno!


Expectativas


Quando em 2014 terminei minha graduação em "Tecnologias da informação e comunicação e sistemas de comunicação", eu não sabia quase nada sobre o mundo da programação. Sim, eu, como muitos, tive um assunto de ciência da computação no primeiro ano - mas, meu Deus, foi no primeiro ano! Já faz muito tempo!


Em geral, eu não esperava nada particularmente diferente da graduação, e entrei no programa de mestrado "Comunicação e processamento de sinais" do Instituto Alemão-Russo de Novas Tecnologias.


Mas em vão ...


Nós éramos apenas o segundo set, e os caras do primeiro pegaram suas malas na Alemanha distante (o estágio leva seis meses no segundo ano do programa de mestrado). Em outras palavras, nenhum dos círculos mais próximos ainda precisa lidar seriamente com os métodos da educação europeia, e não havia muito o que perguntar sobre detalhes.


Em nosso primeiro ano, é claro, tínhamos todo tipo de práticas, nas quais geralmente oferecíamos democraticamente a escolha entre escrever scripts (principalmente no MATLAB) e usar diferentes GUIs altamente especializadas (no sentido de que sem escrever scripts - ambientes de simulação).



Desnecessário dizer que nós, os futuros Mestres da Ciência, por nossa estupidez juvenil, como fogo, evitamos escrever código. Aqui, por exemplo, ele é Simulink do MathWorks: aqui estão blocos, aqui estão comunicações, aqui estão todos os tipos de configurações e comutadores.


Nativo e compreensível para uma pessoa que estava anteriormente envolvida em engenharia de circuitos e sistemas, veja!

Então pareceu-nos ...


Realidade


Um dos trabalhos práticos do primeiro semestre foi o desenvolvimento de um transceptor de sinal OFDM no âmbito da disciplina "Métodos para modelagem e otimização". A idéia é muito bem-sucedida: a tecnologia ainda é relevante e bastante popular devido ao seu uso, por exemplo, em redes Wi-Fi e LTE / LTE-A (na forma de OFDMA). O mais importante para os mestres é treinar suas habilidades na modelagem de sistemas de telecomunicações.



E agora temos várias opções para o TK com parâmetros de quadro obviamente impraticáveis ​​(para não procurar uma solução na Internet), e atacamos o já mencionado Simulink ... E temos um monte de realidade na cabeça:


  • Cada bloco é repleto de muitos parâmetros desconhecidos, que são assustadores para mudar do kondachka.
  • As manipulações com números precisam ser feitas, ao que parece, simples, mas Deus proíba o mesmo que é necessário cercar.
  • Os carros das catedrais diminuem visivelmente o uso agitado da GUI, mesmo na fase de surfar pelas bibliotecas de blocos disponíveis.
  • Para finalizar algo em casa, você precisa ter o mesmo Simulink. E não, na verdade, alternativas.

Sim, no final, é claro, concluímos o projeto, mas o concluímos com um suspiro alto de alívio.


Passou algum tempo e chegamos ao final do primeiro ano do programa de mestrado. A quantidade de trabalhos de casa usando a GUI começou a diminuir proporcionalmente com um aumento na participação de sujeitos alemães, embora ainda não chegasse ao ponto de mudança de paradigma. Muitos de nós, inclusive eu, superando nossa considerável amplitude para o acúmulo, usamos cada vez mais exatamente o Matlab (embora na forma de caixas de ferramentas) em seus projetos científicos, em vez de um Simulink aparentemente familiar.


O ponto em nossas dúvidas era a frase de um dos alunos do segundo ano (eles haviam acabado de voltar para a Rússia naquela época):


  • Esqueça, pelo menos durante o estágio, sobre o Similink, MathCad e outros LabView - por trás da colina, todos escrevem no MATLAB, usando o próprio MatLab ou sua "versão" gratuita do Octave.

A afirmação acabou sendo parcialmente verdadeira: em Ilmenau, a disputa pela escolha de ferramentas também não foi resolvida até o fim. É verdade que a escolha foi principalmente entre os idiomas MATLAB, Python e C.


No mesmo dia, a excitação lógica me levou: eu poderia transferir minha parte do modelo de transmissor OFDM para um formulário de script? Apenas por diversão.


E eu comecei a trabalhar.


Passo a passo


Em vez de cálculos teóricos, apenas darei um link para este excelente artigo de 2011, de tgx, e para os slides do nível físico de LTE do professor Michel-Thiel (TU Ilmenau). Eu acho que isso será suficiente.

"Então", pensei, "vamos repetir o que vamos modelar?"
Simularemos o gerador de quadros OFDM.


O que incluirá:


  • símbolos de informação
  • sinais piloto
  • zeros (DC)

Do que (por uma questão de simplicidade) abstraímos:


  • da modelagem de um prefixo cíclico (se você souber o básico, adicioná-lo não será difícil)


O diagrama de blocos do modelo em consideração. Pararemos no bloco de retorno FFT (IFFT). Todos podem continuar o resto para completar o quadro - prometi aos professores do departamento que deixassem algo para os alunos.


Definimos para nós mesmos esses. tarefa:


  • número fixo de subportadoras;
  • comprimento fixo do quadro;
  • devemos adicionar um zero ao meio e um par de zeros no início e no final do quadro (total de 5 peças);
  • os símbolos de informação são modulados usando M-PSK ou M-QAM, onde M é a ordem de modulação.

Chegando ao código.


O script inteiro pode ser baixado aqui .

Defina os parâmetros de entrada:


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 

Agora, definimos os índices dos símbolos de informação, assumindo a premissa de que os sinais piloto devem necessariamente ir antes e / ou depois dos zeros:


 idx_1_start = 4; idx_1_end = fr_len/2 - 2; idx_2_start = fr_len/2 + 2; idx_2_end = fr_len - 3; 

Em seguida, as posições podem ser determinadas usando a função linspace , convertendo os valores no menor dos números inteiros mais próximos:


 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 

Adicione zero índices a isso e classifique:


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

Assim, os índices de sinal piloto são tudo o mais:


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

Agora vamos lidar com sinais piloto.


Temos um modelo (a variável pilotos ) e digamos que queremos que os pilotos sejam inseridos sequencialmente neste modelo em nosso quadro. Obviamente, isso pode ser feito em um loop. E você pode ser um pouco mais sábio com matrizes - o benefício do MATLAB permite que você faça isso com conforto suficiente.


Primeiro, determine quantos desses padrões se encaixam completamente no quadro:


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

Em seguida, formamos um vetor, que consiste em nossos modelos:


 % 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 

E definimos um pequeno vetor que contém apenas uma parte do modelo - a “cauda”, que não se encaixava completamente no quadro:


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

Temos os símbolos piloto:


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

Nos voltamos para os símbolos de informação, ou seja, formaremos uma mensagem e a modularemos:


 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 

Está tudo pronto! Montando o quadro:


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

Deveria acontecer algo assim:


 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!" - pensei bastante e fechei o laptop. Levei algumas horas para fazer tudo: incluindo escrever código, aprender algumas funções do Matlab e pensar em truques matemáticos.


Que conclusões tirei então


Assunto :


  • Escrever código é agradável e semelhante à poesia!
  • O script é o método de pesquisa mais conveniente para o campo de Comunicação e processamento de sinais.

Objetivo :


  • Não é necessário disparar pardais de um canhão (se esse objetivo educacional, é claro, não vale a pena): usando o Simulink, decidimos resolver uma tarefa simples com uma ferramenta sofisticada.
  • Uma GUI é boa, mas entender o que está por trás é melhor.

E agora, estando longe de ser um estudante, quero dizer o seguinte à fraternidade estudantil:


  • Vá em frente!

Tente escrever código, mesmo que a princípio seja ruim. Com a programação, como em qualquer outra atividade, problemas urgentes são o começo. E é melhor começar mais cedo: se você é um cientista ou mesmo um técnico, mais cedo ou mais tarde precisará dessa habilidade.


  • Procura!

Exigir abordagens e ferramentas inovadoras de educadores e supervisores. Se for, é claro, o máximo possível ...


  • Faça isso!

Onde é ainda melhor ficar doente com as feridas de um iniciante, se não como parte do programa educacional? Crie e aprimore suas habilidades - novamente, quanto mais cedo você começar, melhor.


Programadores iniciantes de todos os países, uni-vos!


PS


Para registrar meu relacionamento direto com os alunos, anexo uma foto memorável de 2017 com dois reitores: Peter Sharff (à direita) e Albert Harisovich Gilmutdinov (à esquerda).


imagem


Valeu a pena terminar o programa pelo menos por causa de tais fantasias! (brincando)

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


All Articles