“Tuyên ngôn dành cho những lập trình viên mới bắt đầu từ các chuyên ngành liên quan” hoặc làm thế nào tôi đạt được thành tựu này trong cuộc đời

Bài viết hôm nay của tôi là những suy nghĩ của một người đã bước vào con đường lập trình gần như một cách tình cờ (mặc dù là một cách tự nhiên).

Vâng, tôi hiểu rằng trải nghiệm của tôi chỉ là trải nghiệm của tôi, nhưng đối với tôi, nó có vẻ rất phù hợp với xu hướng chung. Hơn nữa, trải nghiệm được mô tả dưới đây liên quan nhiều hơn đến lĩnh vực hoạt động khoa học, nhưng không đùa đâu - nó có thể hữu ích ở bên ngoài.

“Tuyên ngôn dành cho những lập trình viên mới bắt đầu từ các chuyên ngành liên quan” hoặc làm thế nào tôi đạt được thành tựu này trong cuộc đời
Nguồn: https://xkcd.com/664/

Nói chung, dành riêng cho tất cả sinh viên hiện tại từ một cựu sinh viên!

Kỳ vọng

Khi tôi hoàn thành bằng cử nhân về Công nghệ thông tin liên lạc và Hệ thống truyền thông vào năm 2014, tôi hầu như không biết gì về thế giới lập trình. Vâng, giống như nhiều người khác, tôi đã học môn “Khoa học Máy tính” vào năm đầu tiên - nhưng Chúa ơi, đó là vào năm đầu tiên của tôi! Đó là một sự vĩnh cửu!

Nói chung, tôi không mong đợi điều gì đặc biệt khác biệt so với tấm bằng cử nhân và khi tôi bước vào chương trình thạc sĩ "Truyền thông và xử lý tín hiệu" Viện công nghệ mới Đức-Nga.

Nhưng vô ích...

Chúng tôi mới chỉ là học sinh đầu tiên nhập học lần thứ hai, và những chàng trai của học sinh đầu tiên vẫn đang chuẩn bị hành lý để đến nước Đức xa xôi (thời gian thực tập kéo dài sáu tháng trong năm thứ hai của chương trình thạc sĩ). Nói cách khác, chưa có ai trong vòng trực tiếp thực sự tiếp xúc với các phương pháp giáo dục châu Âu và cũng không có ai để hỏi chi tiết.

Tất nhiên, trong năm đầu tiên của chúng tôi, chúng tôi đã có nhiều loại hình thực hành khác nhau, trong đó chúng tôi thường được đưa ra lựa chọn một cách dân chủ giữa việc viết tập lệnh (chủ yếu bằng ngôn ngữ MATLAB) và sử dụng nhiều GUI chuyên dụng cao khác nhau (theo nghĩa là không viết tập lệnh - mô phỏng môi trường mô hình hóa).

“Tuyên ngôn dành cho những lập trình viên mới bắt đầu từ các chuyên ngành liên quan” hoặc làm thế nào tôi đạt được thành tựu này trong cuộc đời

Không cần phải nói, chúng tôi, những Thạc sĩ Khoa học tương lai, vì sự ngu ngốc của tuổi trẻ, đã tránh viết mã như lửa. Ví dụ: đây là Simulink từ MathWorks: đây là các khối, đây là các kết nối, đây là tất cả các loại cài đặt và công tắc.

Một góc nhìn quen thuộc và dễ hiểu đối với một người trước đây đã từng làm việc trong lĩnh vực thiết kế mạch và kỹ thuật hệ thống!

“Tuyên ngôn dành cho những lập trình viên mới bắt đầu từ các chuyên ngành liên quan” hoặc làm thế nào tôi đạt được thành tựu này trong cuộc đời
Nguồn: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

Vì vậy, đối với chúng tôi, dường như...

Thực tế

Một trong những công việc thực tế của học kỳ đầu tiên là phát triển bộ thu phát tín hiệu OFDM như một phần của chủ đề “Phương pháp mô hình hóa và tối ưu hóa”. Ý tưởng này rất thành công: công nghệ này vẫn phù hợp và khá phổ biến do được sử dụng, chẳng hạn như trong mạng Wi-Fi và LTE/LTE-A (ở dạng OFDMA). Đây là điều tốt nhất để các bậc thầy rèn luyện kỹ năng mô hình hóa hệ thống viễn thông.

“Tuyên ngôn dành cho những lập trình viên mới bắt đầu từ các chuyên ngành liên quan” hoặc làm thế nào tôi đạt được thành tựu này trong cuộc đời

Và bây giờ chúng tôi được cung cấp một số tùy chọn về thông số kỹ thuật với các tham số khung rõ ràng là không thực tế (để không phải tìm kiếm giải pháp trên Internet) và chúng tôi vồ lấy Simulink đã được đề cập... Và chúng tôi bị một ấm trà đập vào đầu của thực tế:

  • Mỗi khối chứa rất nhiều tham số không xác định, rất đáng sợ khi thay đổi chỉ trong tích tắc.
  • Các thao tác với con số tưởng chừng đơn giản nhưng bạn vẫn phải phiền phức, lạy Chúa.
  • Máy nhà thờ chậm lại đáng kể do sử dụng GUI một cách điên cuồng, ngay cả ở giai đoạn lướt qua các thư viện của các khối có sẵn.
  • Để hoàn thành một việc gì đó ở nhà, bạn cần có Simulink tương tự. Và trên thực tế, không có lựa chọn thay thế nào.

Vâng, tất nhiên cuối cùng thì chúng tôi cũng đã hoàn thành dự án, nhưng chúng tôi đã hoàn thành nó với một tiếng thở phào nhẹ nhõm.

Một thời gian trôi qua, chúng tôi đã sắp kết thúc năm thứ nhất của chương trình thạc sĩ. Lượng bài tập về nhà sử dụng GUI bắt đầu giảm tỷ lệ thuận với sự gia tăng tỷ lệ các môn học tiếng Đức, mặc dù nó vẫn chưa đạt đến mức chuyển đổi mô hình. Nhiều người trong chúng tôi, trong đó có tôi, đã vượt qua biên độ đáng kể của mình để xây dựng, ngày càng sử dụng Matlab nhiều hơn trong các dự án khoa học của mình (dù ở dạng Hộp công cụ), chứ không phải Simulink tưởng chừng như quen thuộc.

Điểm khiến chúng tôi nghi ngờ là câu nói của một sinh viên năm thứ hai (lúc đó họ mới về Nga):

  • Hãy quên đi, ít nhất là trong suốt thời gian thực tập, về Similink, MathCad và LabView khác - tất cả mọi thứ đều được viết bằng MATLAB, sử dụng chính MatLab hoặc “phiên bản” Octave miễn phí của nó.

Tuyên bố này hóa ra đúng một phần: ở Ilmenau, tranh chấp về việc lựa chọn công cụ cũng chưa được giải quyết triệt để. Đúng, sự lựa chọn chủ yếu là giữa MATLAB, Python và C.

Cùng ngày hôm đó, tôi tự nhiên thấy phấn khích: chẳng phải tôi nên chuyển phần mô hình máy phát OFDM của mình sang dạng kịch bản sao? Chỉ để cho vui thôi.

Và tôi phải làm việc.

Từng bước một

Thay vì tính toán lý thuyết, tôi sẽ chỉ đưa ra một liên kết đến điều này bài viết xuất sắc 2011 từ tgx và trên các slide Lớp vật lý LTE giáo sư Michel-Tila (TU Ilmenau). Tôi nghĩ thế này là đủ.

“Vì vậy,” tôi nghĩ, “hãy lặp lại, chúng ta sẽ làm mô hình gì?”
Chúng ta sẽ làm mẫu Bộ tạo khung OFDM (Bộ tạo khung OFDM).

Nó sẽ bao gồm những gì:

  • biểu tượng thông tin
  • tín hiệu thí điểm
  • số không (DC)

Những gì (vì mục đích đơn giản) chúng tôi trừu tượng hóa từ:

  • từ việc lập mô hình tiền tố tuần hoàn (nếu bạn biết những điều cơ bản thì việc thêm nó sẽ không khó)

“Tuyên ngôn dành cho những lập trình viên mới bắt đầu từ các chuyên ngành liên quan” hoặc làm thế nào tôi đạt được thành tựu này trong cuộc đời

Sơ đồ khối của mô hình đang xét. Chúng ta sẽ dừng ở khối FFT (IFFT) nghịch đảo. Để hoàn thành bức tranh, mọi người có thể tự mình tiếp tục phần còn lại - Tôi đã hứa với các thầy cô trong khoa sẽ để lại một thứ gì đó cho học sinh.

Chúng ta hãy xác định những điều đó cho chính mình. bài tập:

  • số lượng nhà cung cấp dịch vụ phụ cố định;
  • chiều dài khung cố định;
  • chúng ta phải thêm một số 5 ở giữa và một cặp số XNUMX ở đầu và cuối khung (tổng cộng XNUMX miếng);
  • các ký hiệu thông tin được điều chế bằng M-PSK hoặc M-QAM, trong đó M là thứ tự điều chế.

Hãy bắt đầu với mã.

Toàn bộ tập lệnh có thể được tải xuống từ liên kết.

Hãy xác định các tham số đầu vào:

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

Bây giờ chúng tôi xác định chỉ số của các ký hiệu thông tin, chấp nhận tiền đề rằng tín hiệu hoa tiêu nhất thiết phải đi trước và/hoặc sau số 0:

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

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

Sau đó, vị trí có thể được xác định bằng hàm không gian, giảm các giá trị xuống số nguyên nhỏ nhất gần nhất:

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

Hãy thêm chỉ mục của số 0 vào đây và sắp xếp:

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

Theo đó, các chỉ số tín hiệu thí điểm là mọi thứ khác:

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

Bây giờ hãy hiểu các tín hiệu thí điểm.

Chúng tôi có một mẫu (biến phi công) và giả sử chúng ta muốn các phi công từ mẫu này được chèn vào khung của chúng ta một cách tuần tự. Tất nhiên, điều này có thể được thực hiện trong một vòng lặp. Hoặc bạn có thể chơi phức tạp một chút với ma trận - may mắn thay MATLAB cho phép bạn làm điều này một cách thoải mái.

Trước tiên, hãy xác định xem có bao nhiêu mẫu trong số này hoàn toàn phù hợp với khung:

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

Tiếp theo, chúng ta tạo một vectơ bao gồm các mẫu của chúng ta:

% 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

Và chúng tôi xác định một vectơ nhỏ chỉ chứa một phần của mẫu - "đuôi", không hoàn toàn khớp với khung:

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

Chúng tôi nhận được các nhân vật thí điểm:

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

Hãy chuyển sang các ký hiệu thông tin, cụ thể là chúng ta sẽ tạo một thông báo và điều chỉnh nó:

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 

Tất cả đã sẵn sàng! Lắp ráp khung:

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

Bạn sẽ nhận được một cái gì đó như thế này:

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

"Hạnh phúc!" – Tôi hài lòng nghĩ rồi đóng laptop lại. Tôi mất vài giờ để làm mọi thứ: bao gồm viết mã, học một số hàm Matlab và suy nghĩ thông qua các thủ thuật toán học.

Khi đó tôi đã rút ra kết luận gì?

Chủ quan:

  • Viết mã thật dễ chịu và giống như làm thơ!
  • Viết kịch bản là phương pháp nghiên cứu thuận tiện nhất cho lĩnh vực Truyền thông và Xử lý tín hiệu.

Mục tiêu:

  • Không cần thiết phải bắn chim sẻ từ súng đại bác (tất nhiên trừ khi mục tiêu giáo dục đó đáng giá): bằng cách sử dụng Simulink, chúng tôi đã giải quyết một vấn đề đơn giản bằng một công cụ phức tạp.
  • GUI là tốt, nhưng hiểu được những gì được chứa “dưới mui xe” thì tốt hơn.

Và bây giờ, không còn là sinh viên nữa, tôi muốn nói với huynh đệ đoàn sinh viên như sau:

  • Hãy vui lên!

Hãy thử viết mã, ngay cả khi lúc đầu nó rất tệ. Với lập trình, cũng như bất kỳ hoạt động nào khác, phần khó nhất là phần khởi đầu. Và tốt hơn hết là bạn nên bắt đầu sớm hơn: nếu bạn là một nhà khoa học hoặc thậm chí chỉ là một dân công nghệ, sớm hay muộn bạn cũng sẽ cần đến kỹ năng này.

  • Yêu cầu!

Yêu cầu các phương pháp tiếp cận và công cụ tiến bộ từ giáo viên và người giám sát. Nếu điều này là có thể, tất nhiên...

  • Tạo nên!

Còn nơi nào tốt hơn để vượt qua mọi nỗi đau của người mới bắt đầu, nếu không nằm trong khuôn khổ chương trình giáo dục? Tạo và trau dồi kỹ năng của bạn - một lần nữa, bạn bắt đầu càng sớm thì càng tốt.

Các lập trình viên đầy tham vọng từ mọi quốc gia, đoàn kết lại!

PS

Để ghi lại mối quan hệ trực tiếp của tôi với sinh viên, tôi đính kèm bức ảnh đáng nhớ trong năm 2017 với hai hiệu trưởng: Peter Scharff (phải) và Albert Kharisovich Gilmutdinov (trái).

“Tuyên ngôn dành cho những lập trình viên mới bắt đầu từ các chuyên ngành liên quan” hoặc làm thế nào tôi đạt được thành tựu này trong cuộc đời

Ít nhất là kết thúc chương trình với những bộ trang phục này! (đùa)

Nguồn: www.habr.com

Thêm một lời nhận xét