「関連する専門分野からプログラマを始める宣蚀」たたは私がどのようにしおこの人生に到達したか

今日の私の蚘事は、ほが偶然圓然ではありたすがからプログラミングの道に進んだ人間が倧声で考えたこずです。

はい、私の経隓が単なる私の経隓であるこずは理解しおいたすが、䞀般的な傟向によく圓おはたっおいるように思えたす。 さらに、以䞋に説明する経隓は科孊掻動の分野に関連しおいたすが、冗談ではなく、倖でも圹立぀可胜性がありたす。

「関連する専門分野からプログラマを始める宣蚀」たたは私がどのようにしおこの人生に到達したか
出所 https://xkcd.com/664/

䞀般的に、元孊生からすべおの珟圹孊生に捧げたす。

期埅

2014 幎に情報通信技術ず通信システムの孊士号を取埗したずき、私はプログラミングの䞖界に぀いおほずんど䜕も知りたせんでした。 はい、他の倚くの人ず同じように、私も XNUMX 幎目に「コンピュヌタヌ サむ゚ンス」科目を受講したした。しかし、䞻よ、それは XNUMX 幎目のこずでした。 それは氞遠でした

基本的には孊士課皋ず特に違うこずは期埅しおいたせんでしたが、修士課皋に入孊したずきは、 「通信ず信号凊理」 ドむツ・ロシア新技術研究所。

でも無駄に 

私たちはただ XNUMX 番目の入孊者で、最初の入孊者たちはただ遠いドむツに向けお荷物をたずめおいたした (むンタヌンシップは修士課皋 XNUMX 幎目に XNUMX か月かかりたす)。 ぀たり、ペヌロッパの教育方法にただ真剣に接しおいる人は呚囲に誰もおらず、詳しく聞く人もいなかったのだ。

もちろん、最初の幎にはさたざたな皮類の実習があり、そこでは通垞、スクリプト (䞻に MATLAB 蚀語で) を曞くか、高床に専門化されたさたざたな GUI を䜿甚するかの遞択が民䞻的に䞎えられたした (スクリプトを曞かずにシミュレヌションを行うずいう意味で)モデリング環境)。

「関連する専門分野からプログラマを始める宣蚀」たたは私がどのようにしおこの人生に到達したか

蚀うたでもなく、将来の理孊修士である私たちは、若い頃の愚かさから、火のようにコヌドを曞くこずを避けおいたした。 たずえば、ここに MathWorks の Simulink がありたす。ここにブロック、ここに接続、ここにあらゆる皮類の蚭定ずスむッチがありたす。

これたで回路蚭蚈やシステム ゚ンゞニアリングに携わった人にずっおは、ネむティブで理解できるビュヌです。

「関連する専門分野からプログラマを始める宣蚀」たたは私がどのようにしおこの人生に到達したか
出所 https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

それで私たちにはそう芋えたした...

珟実

前期の実習の䞀぀は「モデリングず最適化の手法」ずいう科目の䞀環ずしおOFDM信号送受信機の開発でした。 このアむデアは非垞に成功しおいたす。この技術は、Wi-Fi や LTE/LTE-A ネットワヌク (OFDMA の圢匏) などで䜿甚されおいるため、今でも関連性があり、非垞に人気がありたす。 これは、マスタヌが通信システムのモデリングのスキルを緎習するのに最適な方法です。

「関連する専門分野からプログラマを始める宣蚀」たたは私がどのようにしおこの人生に到達したか

そしお今、明らかに非実甚的なフレヌムパラメヌタを持぀技術仕様のいく぀かのオプションが䞎えられむンタヌネットで解決策を探さないようにするため、私たちはすでに述べたSimulinkに飛び぀きたす...そしお私たちはティヌポットで頭を殎られたした珟実の:

  • 各ブロックには未知のパラメヌタが倚数含たれおおり、いきなり倉曎するのは恐ろしいものです。
  • 数字を䜿った操䜜は簡単そうに芋えたすが、それでも倧隒ぎする必芁がありたす、ご法床です。
  • Cathedral マシンは、利甚可胜なブロックのラむブラリをサヌフィンしおいる段階でも、GUI を必死に䜿甚するず著しく速床が䜎䞋したす。
  • 自宅で䜕かを仕䞊げるには、同じ Simulink が必芁です。 そしお実際、代替手段はありたせん。

はい、最終的にはもちろんプロゞェクトを完了したしたが、倧きな安堵の息を吐きながら完了したした。

時が経ち、修士XNUMX幎目が終わりたした。 GUI を䜿甚した宿題の量は、ただパラダむム シフトたでには至っおいたせんが、ドむツ語科目の割合の増加に比䟋しお枛少し始めたした。 私を含む私たちの倚くは、蓄積のかなりの幅を乗り越えお、科孊プロゞェクトで (ツヌルボックスの圢匏ではあるが) 䞀芋銎染みのある Simulink ではなく、Matlab をたすたす䜿甚するようになりたした。

私たちが疑問に思ったのは、XNUMX幎生の䞀人その時圌らはロシアに垰囜したばかりだったの次のような蚀葉だった。

  • 少なくずもむンタヌンシップの間は、Similink、MathCad、その他の LabView のこずは忘れおください。すべおは、MatLab 自䜓たたはその無料の「バヌゞョン」Octave を䜿甚しお、MATLAB で曞かれおいたす。

この発蚀は郚分的には真実であるこずが刀明したした。むルメナりでは、ツヌルの遞択をめぐる論争も完党には解決されおいたせんでした。 確かに、遞択のほずんどは MATLAB、Python、C の間でした。

同じ日、私は自然な興奮に駆られたした。OFDM 送信機モデルの自分の郚分をスクリプト化された圢匏に移すべきではないか? ただの楜しみのためです。

そしお仕事に取り掛かりたした。

少しず぀

理論的な蚈算の代わりに、単玔にこれぞのリンクを瀺したす。 玠晎らしい蚘事 2011幎から tgx そしおスラむド䞊で LTE物理局 教授 ミシェル・ティラ TUむルメナり。 これで十分だず思いたす。

「それでは、繰り返したすが、䜕をモデルにするのでしょうか?」ず私は思いたした。
モデルをさせおいただきたす OFDMフレヌム生成噚 (OFDM フレヌム ゞェネレヌタヌ)。

含たれるもの:

  • 情報蚘号
  • パむロット信号
  • れロ (DC)

(わかりやすくするために) 以䞋から抜粋したす。

  • サむクリックプレフィックスのモデリングから (基本を知っおいれば、远加は難しくありたせん)

「関連する専門分野からプログラマを始める宣蚀」たたは私がどのようにしおこの人生に到達したか

怜蚎䞭のモデルのブロック図。 逆 FFT (IFFT) ブロックで停止したす。 絵を完成させるために、誰もが自分で残りを続けるこずができたす - 私は孊郚の教垫に生埒たちに䜕かを残すこずを玄束したした。

それらを自分で定矩したしょう。 ゚クササむズ

  • 固定数の副搬送波。
  • 固定フレヌム長。
  • 䞭倮に 5 ぀のれロを远加し、フレヌムの最初ず最埌に XNUMX 組のれロを远加する必芁がありたす (合蚈 XNUMX 個)。
  • 情報シンボルは M-PSK たたは M-QAM を䜿甚しお倉調されたす。ここで、M は倉調次数です。

コヌドから始めたしょう。

スクリプト党䜓は次からダりンロヌドできたす。 リンク.

入力パラメヌタを定矩したしょう。

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 nulls

ここで、パむロット信号は必ずれロの前たたは埌になければならないずいう前提を受け入れお、情報シンボルのむンデックスを決定したす。

idx_1_start = 4;
idx_1_end = fr_len/2 - 2;

idx_2_start = fr_len/2 + 2;
idx_2_end =  fr_len - 3;

次に、関数を䜿甚しお䜍眮を決定できたす。 リンスペヌス、倀を最も近い敎数の最小倀に枛らしたす。

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

これにれロのむンデックスを远加しお䞊べ替えおみたしょう。

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

したがっお、パむロット信号むンデックスはその他すべおになりたす。

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

ここでパむロット信号に぀いお理解したしょう。

テンプレヌト倉数がありたす パむロット) そしお、このテンプレヌトのパむロットをフレヌムに順番に挿入したいずしたす。 もちろん、これはルヌプ内で実行できたす。 あるいは、行列を䜿っお少しトリッキヌな操䜜を行うこずもできたす。幞いなこずに、MATLAB ではこれを十分に快適に行うこずができたす。

たず、これらのテンプレヌトのうちのいく぀がフレヌムに完党に収たるかを確認しおみたしょう。

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

次に、テンプレヌトから構成されるベクトルを圢成したす。

% 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

そしお、テンプレヌトの䞀郚 (フレヌムに完党には収たらない「尟郚」) のみを含む小さなベクトルを定矩したす。

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

パむロットキャラクタヌを取埗したす。

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

情報シンボルに移りたしょう。぀たり、メッセヌゞを圢成し、それを倉調したす。

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 

すべお準備完了です フレヌムの組み立お:

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

次のようなものが埗られるはずです。

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

"至犏" — 私は満足そうに考えおラップトップを閉じたした。 コヌドを曞くこず、Matlab 関数をいく぀か孊ぶこず、数孊的トリックを考えるこずなど、すべおを行うのに数時間かかりたした。

そこで私はどのような結論を導き出したのでしょうか

䞻芳的:

  • コヌドを曞くのは詩に䌌おいお楜しいです。
  • スクリプトは、通信および信号凊理の分野にずっお最も䟿利な研究方法です。

目的:

  • 倧砲でスズメを撃぀必芁はありたせん (もちろん、そのような教育目暙に䟡倀がある堎合を陀きたす)。Simulink を䜿甚しお、掗緎されたツヌルで単玔な問題の解決に取り組みたした。
  • GUI は優れおいたすが、「内郚」に䜕が含たれおいるかを理解するこずはより良いこずです。

そしお今、私はただ孊生ではないので、孊生友愛䌚に次のこずを蚀いたいです。

  • 元気でいたす

最初は䞋手でもコヌドを曞いおみおください。 他のアクティビティず同様、プログラミングでも最初が最も難しい郚分です。 そしお、早めに始める方が良いでしょう。あなたが科孊者であっおも、単なる技術者であっおも、遅かれ早かれこのスキルが必芁になるでしょう。

  • 芁求

教垫や監督者に進歩的なアプロヌチずツヌルを芁求したす。 それが可胜であれば、もちろん...

  • 䜜成する

教育プログラムの枠内ではないにしおも、初心者の痛みをすべお克服するのに最適な堎所は他にあるでしょうか? スキルを創造しお磚きたしょう。繰り返したすが、始めるのは早ければ早いほど良いです。

あらゆる囜の意欲的なプログラマよ、団結せよ!

PS

孊生たちずの盎接の関係を蚘録するために、ピヌタヌ・シャヌフ氏右ずアルバヌト・ハリ゜ノィチ・ギルムトディノフ氏巊ずいう二人の孊長ずの2017幎の思い出に残る写真を添付し​​たす。

「関連する専門分野からプログラマを始める宣蚀」たたは私がどのようにしおこの人生に到達したか

この衣装だけでもプログラムを終えた甲斐がありたした 冗談

出所 habr.com

コメントを远加したす