「相關專業的初級程式設計師宣言」或我是如何走到這一步的

我今天的文章是一個幾乎偶然(儘管很自然)走上程式設計道路的人大聲說出的想法。

是的,我明白我的經歷只是我的經歷,但在我看來,它很符合大勢。 此外,下面描述的經驗更多地與科學活動領域相關,但這不是開玩笑——它在外面也可能有用。

「相關專業的初級程式設計師宣言」或我是如何走到這一步的
來源: https://xkcd.com/664/

總的來說,獻給所有現在的學生和以前的學生!

預期

2014 年,當我完成資訊通信技術和通訊系統學士學位時,我對程式設計世界幾乎一無所知。 是的,像許多其他人一樣,我在第一年就選修了“計算機科學”科目 - 但是,主啊,那是在我的第一年! 已經是永恆了!

總的來說,我並沒有期望與學士學位有什麼特別不同,當我進入碩士課程時 《通信與訊號處理》 德俄新技術研究所。

但徒勞無功...

我們只是第二批招收的學生,第一批的同學們還在收拾行李前往遙遠的德國(碩士學位第二年的實習時間為六個月)。 也就是說,身邊的人還沒有認真接觸過歐洲的教育方法,也沒有人去問細節。

當然,在我們的第一年,我們有各種各樣的實踐,其中我們通常會民主地在編寫腳本(主要是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......我們被茶壺擊中頭部現實的:

  • 每個區塊都充滿了許多未知參數,這些參數很容易突然改變。
  • 對數字的操作看起來很簡單,但你仍然需要大驚小怪,上帝保佑。
  • 大教堂機器由於 GUI 的瘋狂使用而明顯減慢速度,即使在瀏覽可用區塊庫的階段也是如此。
  • 要在家完成某件事,您需要擁有相同的 Simulink。 事實上,沒有其他選擇。

是的,最終我們當然完成了這個項目,但我們長長地鬆了一口氣。

一段時間過去了,我們已經到了碩士第一年的結束。 隨著德國科目比例的增加,使用 GUI 的作業量開始成比例下降,儘管尚未達到典範轉移的程度。 我們中的許多人,包括我在內,克服了相當大的開發難度,越來越多地在我們的科學專案中使用 Matlab(儘管以工具箱的形式),而不是看似熟悉的 Simulink。

我們疑惑的地方是一位二年級學生的一句話(當時他們剛回到俄羅斯):

  • 至少在實習期間,忘記 Similink、MathCad 和其他 LabView——一切都是用 MATLAB 編寫的,使用 MatLab 本身或其免費「版本」Octave。

事實證明,這種說法部分屬實:在伊爾梅瑙,關於工具選擇的爭議也沒有完全解決。 確實,選擇主要是在 MATLAB、Python 和 C 之間。

同一天,我自然而然地興奮起來:難道我不應該將我的 OFDM 發射機模型部分轉換為腳本形式嗎? 只是為了好玩。

我開始工作了。

步步

我將簡單地給出一個鏈接,而不是理論計算 優秀的文章 2011年起 tgx 以及幻燈片上 LTE物理層 教授 米歇爾-蒂拉 (伊爾梅瑙工業大學)。 我想這就夠了。

“那麼,”我想,“讓我們再說一遍,我們要建模什麼?”
我們將建模 正交頻分複用幀生成器 (OFDM 幀產生器)。

它將包括什麼:

  • 訊息符號
  • 導頻訊號
  • 零點(直流)

(為了簡單起見)我們從以下內容中抽像出來:

  • 來自建模循環前綴(如果您了解基礎知識,添加它並不困難)

「相關專業的初級程式設計師宣言」或我是如何走到這一步的

所考慮模型的框圖。 我們將停在逆 FFT (IFFT) 區塊。 完成這張圖,剩下的大家可以自己繼續下去──我答應系裡的老師留給學生們一些東西。

讓我們自己定義它們。 鍛鍊:

  • 固定數量的子載波;
  • 固定幀長度;
  • 我們必須在幀的中間添加一個零,並在幀的開頭和結尾添加一對零(總共 5 個);
  • 訊息符號使用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 很好,但了解「幕後」包含的內容會更好。

現在,我已經不再是學生了,我想對學生說以下的話:

  • 加油!

嘗試編寫程式碼,即使一開始很糟糕。 對於編程,與任何其他活動一樣,最困難的部分是開始。 最好儘早開始:如果您是科學家,甚至只是技術人員,遲早您會需要這項技能。

  • 要求!

要求教師和主管採用先進的方法和工具。 如果這可能的話,當然…

  • 創造!

如果不在教育計畫的框架內,還有什麼地方可以更好地克服初學者的所有痛苦呢? 創造並磨練你的技能——同樣,越早開始越好。

各國有抱負的程式設計師,聯合起來!

聚苯乙烯

為了記錄我與學生的直接關係,我附上一張 2017 年與兩位校長的難忘照片:Peter Scharff(右)和 Albert Kharisovich Gilmutdinov(左)。

「相關專業的初級程式設計師宣言」或我是如何走到這一步的

至少為了這些服裝完成這個節目是值得的! (開玩笑)

來源: www.habr.com

添加評論