“Manifesto สำหรับผู้เริ่มต้นโปรแกรมเมอร์จากสาขาที่เกี่ยวข้อง” หรือวิธีที่ฉันมาถึงจุดนี้ในชีวิต

บทความของฉันในวันนี้เป็นความคิดที่ดังออกมาจากบุคคลที่เลือกเส้นทางการเขียนโปรแกรมโดยบังเอิญ (แม้ว่าจะโดยธรรมชาติก็ตาม)

ใช่ ฉันเข้าใจว่าประสบการณ์ของฉันเป็นเพียงประสบการณ์ของฉัน แต่สำหรับฉันแล้วดูเหมือนว่ามันจะเข้ากับเทรนด์ทั่วไปได้ดี ยิ่งไปกว่านั้น ประสบการณ์ที่อธิบายไว้ด้านล่างนี้เกี่ยวข้องกับกิจกรรมทางวิทยาศาสตร์มากกว่า แต่สิ่งที่ไม่ได้ล้อเล่น - มันสามารถมีประโยชน์ภายนอกได้

“Manifesto สำหรับผู้เริ่มต้นโปรแกรมเมอร์จากสาขาที่เกี่ยวข้อง” หรือวิธีที่ฉันมาถึงจุดนี้ในชีวิต
ที่มา: https://xkcd.com/664/

โดยทั่วไปแล้วอุทิศให้กับนักเรียนปัจจุบันทุกคนตั้งแต่อดีตนักเรียน!

ความคาดหวัง

เมื่อฉันสำเร็จการศึกษาระดับปริญญาตรีสาขาเทคโนโลยีสารสนเทศและระบบการสื่อสารในปี 2014 ฉันแทบไม่รู้อะไรเลยเกี่ยวกับโลกแห่งการเขียนโปรแกรม ใช่ เช่นเดียวกับคนอื่นๆ ฉันเรียนวิชา "วิทยาการคอมพิวเตอร์" ในปีแรก แต่พระเจ้า มันเป็นปีแรกของฉัน! มันเป็นนิรันดร์!

โดยทั่วไปฉันไม่ได้คาดหวังอะไรที่แตกต่างไปจากปริญญาตรีเป็นพิเศษและเมื่อเข้าเรียนหลักสูตรปริญญาโท “การสื่อสารและการประมวลผลสัญญาณ” สถาบันเทคโนโลยีใหม่เยอรมัน - รัสเซีย

แต่เปล่าประโยชน์...

เราเป็นเพียงการรับเข้าเรียนครั้งที่สอง และคนจากคนแรกยังคงเก็บกระเป๋าไปเยอรมนีอันห่างไกล (การฝึกงานใช้เวลาหกเดือนในปีที่สองของปริญญาโท) กล่าวอีกนัยหนึ่ง ยังไม่มีใครจากแวดวงใกล้เคียงที่เคยพบกับวิธีการศึกษาของยุโรปอย่างจริงจัง และไม่มีใครถามเกี่ยวกับรายละเอียด

แน่นอนว่าในปีแรกของเรา เรามีแนวทางปฏิบัติหลายประเภท ซึ่งโดยปกติแล้วเราจะเสนอทางเลือกระหว่างการเขียนสคริปต์ (ส่วนใหญ่เป็นภาษา MATLAB) และการใช้ GUI ที่มีความเชี่ยวชาญสูงต่างๆ (ในแง่ที่ว่าโดยไม่ต้องเขียนสคริปต์ - การจำลอง) สภาพแวดล้อมการสร้างแบบจำลอง)

“Manifesto สำหรับผู้เริ่มต้นโปรแกรมเมอร์จากสาขาที่เกี่ยวข้อง” หรือวิธีที่ฉันมาถึงจุดนี้ในชีวิต

ไม่จำเป็นต้องพูดว่า พวกเราซึ่งเป็นปรมาจารย์ด้านวิทยาศาสตร์ในอนาคต มาจากความโง่เขลาในวัยเยาว์ของเรา หลีกเลี่ยงการเขียนโค้ดเหมือนไฟ ตัวอย่างเช่น นี่คือ Simulink จาก MathWorks: นี่คือบล็อก นี่คือการเชื่อมต่อ นี่คือการตั้งค่าและสวิตช์ทุกประเภท

มุมมองที่เป็นพื้นเมืองและเข้าใจได้สำหรับผู้ที่เคยทำงานด้านการออกแบบวงจรและวิศวกรรมระบบมาก่อน!

“Manifesto สำหรับผู้เริ่มต้นโปรแกรมเมอร์จากสาขาที่เกี่ยวข้อง” หรือวิธีที่ฉันมาถึงจุดนี้ในชีวิต
ที่มา: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

ดังนั้นดูเหมือนว่าสำหรับเรา...

ความจริง

งานภาคปฏิบัติอย่างหนึ่งของภาคการศึกษาแรกคือการพัฒนาเครื่องรับส่งสัญญาณ OFDM ซึ่งเป็นส่วนหนึ่งของหัวข้อ "วิธีการสำหรับการสร้างแบบจำลองและการเพิ่มประสิทธิภาพ" แนวคิดนี้ประสบความสำเร็จอย่างมาก: เทคโนโลยีนี้ยังคงมีความเกี่ยวข้องและค่อนข้างได้รับความนิยมเนื่องจากการใช้งาน เช่น ในเครือข่าย Wi-Fi และ LTE/LTE-A (ในรูปแบบของ OFDMA) นี่เป็นสิ่งที่ดีที่สุดสำหรับผู้เชี่ยวชาญในการฝึกฝนทักษะในการสร้างแบบจำลองระบบโทรคมนาคม

“Manifesto สำหรับผู้เริ่มต้นโปรแกรมเมอร์จากสาขาที่เกี่ยวข้อง” หรือวิธีที่ฉันมาถึงจุดนี้ในชีวิต

และตอนนี้เราได้รับข้อกำหนดทางเทคนิคหลายตัวเลือกพร้อมพารามิเตอร์เฟรมที่ใช้งานไม่ได้อย่างเห็นได้ชัด (เพื่อไม่ให้มองหาวิธีแก้ปัญหาบนอินเทอร์เน็ต) และเราก็กระโจนไปที่ Simulink ที่กล่าวไปแล้ว... และเราก็โดนกาน้ำชาตีหัว ของความเป็นจริง:

  • แต่ละบล็อกจะเต็มไปด้วยพารามิเตอร์ที่ไม่รู้จักจำนวนมาก ซึ่งน่ากลัวที่จะเปลี่ยนแปลงทันทีที่หมวกหล่น
  • การยักย้ายด้วยตัวเลขจำเป็นต้องทำดูเหมือนง่าย แต่คุณยังต้องยุ่งยากพระเจ้าห้าม
  • เครื่องจักรของมหาวิหารช้าลงอย่างเห็นได้ชัดจากการใช้ GUI อย่างบ้าคลั่ง แม้จะอยู่ในขั้นตอนการท่องผ่านไลบรารีของบล็อกที่มีอยู่ก็ตาม
  • หากต้องการทำอะไรบางอย่างที่บ้านให้เสร็จ คุณต้องมี Simulink อันเดียวกัน และในความเป็นจริงไม่มีทางเลือกอื่น

ใช่ ในที่สุดเราก็ทำโปรเจ็กต์เสร็จเรียบร้อย แต่เราก็ทำสำเร็จด้วยความโล่งใจดังลั่น

เวลาผ่านไปสักพักก็เข้าสู่ช่วงสิ้นปีแรกของหลักสูตรปริญญาโท จำนวนการบ้านที่ใช้ GUI เริ่มลดลงตามสัดส่วนของวิชาภาษาเยอรมันที่เพิ่มขึ้น แม้ว่าจะยังไม่ถึงจุดเปลี่ยนกระบวนทัศน์ก็ตาม พวกเราหลายคนรวมทั้งฉันด้วย เอาชนะความกว้างใหญ่ไพศาลในการสร้างมันขึ้นมา ใช้ Matlab มากขึ้นเรื่อยๆ ในโครงการวิทยาศาสตร์ของเรา (แม้ว่าจะอยู่ในรูปแบบของกล่องเครื่องมือ) และไม่ใช่ Simulink ที่ดูเหมือนจะคุ้นเคย

ประเด็นที่เราสงสัยคือวลีของนักศึกษาปีสองคนหนึ่ง (ตอนนั้นพวกเขาเพิ่งกลับมารัสเซีย):

  • ลืมอย่างน้อยในช่วงระยะเวลาของการฝึกงานเกี่ยวกับ Similink, MathCad และ LabView อื่น ๆ ทุกอย่างเขียนด้วย MATLAB บนเนินเขาโดยใช้ MatLab เองหรืออ็อกเทฟ "เวอร์ชัน" ฟรี

ข้อความดังกล่าวกลายเป็นความจริงบางส่วน: ใน Ilmenau ข้อพิพาทเกี่ยวกับการเลือกเครื่องมือก็ไม่ได้รับการแก้ไขอย่างสมบูรณ์เช่นกัน จริงอยู่ ตัวเลือกส่วนใหญ่อยู่ระหว่าง MATLAB, Python และ C

ในวันเดียวกันนั้นเอง ฉันรู้สึกตื่นเต้นอย่างเป็นธรรมชาติ: ฉันไม่ควรโอนส่วนของโมเดลเครื่องส่ง OFDM ของฉันไปเป็นรูปแบบที่มีสคริปต์หรือไม่ แค่เล่น ๆ.

และฉันต้องทำงาน

ทีละขั้นตอน

แทนที่จะใช้การคำนวณทางทฤษฎี ฉันจะให้ลิงก์ไปยังสิ่งนี้ บทความที่ยอดเยี่ยม 2011 จาก ทีจีเอ็กซ์ และบนสไลด์ เลเยอร์ทางกายภาพ LTE อาจารย์ มิเชล-ติลา (TU อิลเมเนา). ฉันคิดว่านี่จะเพียงพอแล้ว

“เอาล่ะ” ฉันคิดว่า “มาทวนซ้ำว่าเราจะสร้างแบบจำลองอะไร?”
เราจะเป็นนางแบบ เครื่องกำเนิดเฟรม OFDM (เครื่องกำเนิดเฟรม OFDM)

สิ่งที่จะรวมถึง:

  • สัญลักษณ์ข้อมูล
  • สัญญาณนำร่อง
  • ศูนย์ (กระแสตรง)

เราสรุปอะไร (เพื่อความเรียบง่าย) จาก:

  • จากการสร้างแบบจำลองคำนำหน้าแบบวน (ถ้ารู้พื้นฐานบวกก็ไม่ยาก)

“Manifesto สำหรับผู้เริ่มต้นโปรแกรมเมอร์จากสาขาที่เกี่ยวข้อง” หรือวิธีที่ฉันมาถึงจุดนี้ในชีวิต

บล็อกไดอะแกรมของแบบจำลองที่อยู่ระหว่างการพิจารณา เราจะหยุดที่บล็อก 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); 

ตอนนี้เรามาทำความเข้าใจสัญญาณนำร่องกัน

เรามีเทมเพลต (variable นักบิน) และสมมติว่าเราต้องการให้นักบินจากเทมเพลตนี้ถูกแทรกลงในเฟรมของเราตามลำดับ แน่นอนว่าสามารถทำได้แบบวนซ้ำ หรือคุณสามารถเล่นเมทริกซ์ได้ยากสักหน่อย โชคดีที่ 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 กับอธิการบดีสองคน: Peter Scharff (ทางขวา) และ Albert Kharisovich Gilmutdinov (ทางซ้าย)

“Manifesto สำหรับผู้เริ่มต้นโปรแกรมเมอร์จากสาขาที่เกี่ยวข้อง” หรือวิธีที่ฉันมาถึงจุดนี้ในชีวิต

อย่างน้อยก็ควรจบโปรแกรมเพื่อชุดเหล่านี้! (ล้อเล่น)

ที่มา: will.com

เพิ่มความคิดเห็น