"مانیفست برای برنامه نویسان مبتدی از تخصص های مرتبط" یا اینکه چگونه به این نقطه از زندگی رسیدم

مقاله امروز من افکار بلند شخصی است که تقریباً به طور تصادفی (البته به طور طبیعی) مسیر برنامه نویسی را در پیش گرفته است.

بله، من درک می کنم که تجربه من فقط تجربه من است، اما به نظر من به خوبی با روند کلی مطابقت دارد. علاوه بر این، تجربه شرح داده شده در زیر بیشتر به زمینه فعالیت علمی مربوط می شود، اما آنچه که جهنم شوخی نیست - می تواند در خارج مفید باشد.

"مانیفست برای برنامه نویسان مبتدی از تخصص های مرتبط" یا اینکه چگونه به این نقطه از زندگی رسیدم
منبع: https://xkcd.com/664/

به طور کلی تقدیم به تمام دانش آموزان فعلی از یک دانشجوی سابق!

انتظارات

زمانی که در سال 2014 مدرک لیسانس خود را در زمینه فناوری اطلاعات و سیستم های ارتباطی به پایان رساندم، تقریباً هیچ چیز در مورد دنیای برنامه نویسی نمی دانستم. بله، مانند بسیاری دیگر، من در سال اول درس "علوم کامپیوتر" را خواندم - اما، پروردگارا، در سال اول من بود! این یک ابدیت بوده است!

به طور کلی، من هیچ چیز متفاوتی از لیسانس و زمانی که وارد برنامه کارشناسی ارشد شدم، انتظار نداشتم. "ارتباطات و پردازش سیگنال" مؤسسه فن آوری های جدید آلمان و روسیه.

اما بیهوده...

ما فقط پذیرش دوم بودیم و بچه های اولی هنوز در حال بستن چمدان هایشان برای آلمان دوردست بودند (کارآموزی در سال دوم کارشناسی ارشد شش ماه طول می کشد). به عبارت دیگر، هیچ کس از حلقه های نزدیک هنوز به طور جدی با روش های آموزش اروپایی برخورد نکرده بود و کسی نبود که در مورد جزئیات بپرسد.

البته در سال اول ما انواع مختلفی از شیوه‌ها داشتیم که معمولاً به صورت دموکراتیک بین نوشتن اسکریپت‌ها (عمدتاً به زبان متلب) و استفاده از رابط‌های کاربری گرافیکی بسیار تخصصی مختلف (به این معنا که بدون نوشتن اسکریپت - شبیه‌سازی انتخاب می‌شد، انتخاب می‌شد. محیط های مدل سازی).

"مانیفست برای برنامه نویسان مبتدی از تخصص های مرتبط" یا اینکه چگونه به این نقطه از زندگی رسیدم

ناگفته نماند که ما استادان علوم آینده از روی حماقت جوانی از نوشتن رمز مانند آتش پرهیز کردیم. به عنوان مثال، Simulink از MathWorks: اینجا بلوک ها، اینجا اتصالات، اینجا انواع تنظیمات و سوئیچ ها هستند.

دیدگاهی که برای فردی که قبلا در زمینه طراحی مدار و مهندسی سیستم کار کرده است بومی و قابل درک است!

"مانیفست برای برنامه نویسان مبتدی از تخصص های مرتبط" یا اینکه چگونه به این نقطه از زندگی رسیدم
منبع: https://ch.mathworks.com/help/comm/examples/parallel-concatenated-convolutional-coding-turbo-codes.html

بنابراین به نظر ما ...

واقعیت

یکی از کارهای عملی ترم اول توسعه یک فرستنده سیگنال OFDM به عنوان بخشی از موضوع "روش های مدل سازی و بهینه سازی" بود. این ایده بسیار موفق است: این فناوری به دلیل استفاده از آن، به عنوان مثال، در شبکه های Wi-Fi و LTE/LTE-A (به شکل OFDMA) همچنان مرتبط و کاملاً محبوب است. این بهترین چیز برای استادان برای تمرین مهارت های خود در مدل سازی سیستم های مخابراتی است.

"مانیفست برای برنامه نویسان مبتدی از تخصص های مرتبط" یا اینکه چگونه به این نقطه از زندگی رسیدم

و اکنون چندین گزینه از مشخصات فنی با پارامترهای قاب آشکارا غیرعملی به ما داده می شود (برای اینکه به دنبال راه حل در اینترنت نباشیم) و ما به سیمولینک که قبلاً ذکر شد می کوبیم ... و با قوری به سرمان ضربه می زنیم. واقعیت:

  • هر بلوک مملو از بسیاری از پارامترهای ناشناخته است که تغییر آنها در زمان سقوط یک کلاه ترسناک است.
  • دستکاری با اعداد باید انجام شود، به نظر می رسد ساده است، اما شما هنوز هم باید سر و صدا کنید، خدای ناکرده.
  • ماشین‌های کلیسای جامع حتی در مرحله گشت و گذار در کتابخانه‌های بلوک‌های موجود، به طور قابل توجهی از استفاده دیوانه‌وار از رابط کاربری گرافیکی کند می‌شوند.
  • برای تمام کردن کاری در خانه، باید همان سیمولینک را داشته باشید. و در واقع هیچ جایگزینی وجود ندارد.

بله، در نهایت ما، البته، پروژه را به پایان رساندیم، اما آن را با دم بلندی از آرامش به پایان رساندیم.

مدتی گذشت و به پایان سال اول کارشناسی ارشد رسیدیم. میزان تکالیف با استفاده از رابط کاربری گرافیکی به تناسب با افزایش نسبت سوژه های آلمانی شروع به کاهش کرد، اگرچه هنوز به نقطه تغییر پارادایم نرسیده بود. بسیاری از ما، از جمله من، با غلبه بر دامنه قابل توجه خود برای ساختن، بیشتر و بیشتر از Matlab در پروژه های علمی خود استفاده می کنیم (البته در قالب جعبه ابزار)، و نه سیمولینک به ظاهر آشنا.

نکته ای که در شک ما وجود داشت عبارت یکی از دانش آموزان سال دوم بود (آنها در آن زمان تازه به روسیه بازگشته بودند):

  • حداقل در طول دوره کارآموزی، Similink، MathCad و سایر LabView را فراموش کنید - در بالای تپه همه چیز در MATLAB نوشته شده است، با استفاده از خود MatLab یا "نسخه" رایگان آن Octave.

این بیانیه تا حدی درست بود: در Ilmenau، اختلاف بر سر انتخاب ابزار نیز به طور کامل حل نشد. درست است، انتخاب بیشتر بین MATLAB، Python و C بود.

در همان روز، هیجان طبیعی من را فرا گرفت: آیا نباید بخشی از مدل فرستنده OFDM را به یک فرم اسکریپت منتقل کنم؟ فقط برای سرگرمی

و من دست به کار شدم

گام به گام

به جای محاسبات تئوری، من به سادگی یک لینک به این می دهم مقاله عالی 2011 از tgx و روی اسلایدها لایه فیزیکی LTE استادان میشل تیلا (TU Ilmenau). فکر می کنم این کافی باشد.

فکر کردم: «بنابراین، بیایید تکرار کنیم، قرار است چه چیزی را مدل کنیم؟»
ما مدل خواهیم کرد مولد فریم OFDM (سازنده فریم OFDM).

چه چیزی شامل خواهد شد:

  • نمادهای اطلاعاتی
  • سیگنال های خلبان
  • صفر (DC)

آنچه (به منظور سادگی) از آن انتزاع می کنیم:

  • از مدل سازی یک پیشوند چرخه ای (اگر اصول اولیه را می دانید، اضافه کردن آن دشوار نخواهد بود)

"مانیفست برای برنامه نویسان مبتدی از تخصص های مرتبط" یا اینکه چگونه به این نقطه از زندگی رسیدم

بلوک دیاگرام مدل مورد نظر. ما در بلوک معکوس 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); 

حالا بیایید سیگنال های خلبان را درک کنیم.

ما یک الگو داریم (متغیر خلبانانو فرض کنید می‌خواهیم خلبان‌هایی از این الگو به صورت متوالی در کادر ما قرار داده شوند. البته این کار را می توان در یک حلقه انجام داد. یا می توانید با ماتریس ها کمی مشکل بازی کنید - خوشبختانه متلب به شما این امکان را می دهد که این کار را با راحتی کافی انجام دهید.

ابتدا، بیایید تعیین کنیم که چه تعداد از این الگوها به طور کامل در قاب قرار می گیرند:

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، ما حل یک مشکل ساده را با یک ابزار پیچیده انجام دادیم.
  • رابط کاربری گرافیکی خوب است، اما درک آنچه در "زیر هود" موجود است بهتر است.

و حالا که دور از دانشجویی هستم، می خواهم این را به برادر دانشجویی بگویم:

  • جرات کن

سعی کنید کد بنویسید، حتی اگر در ابتدا بد باشد. با برنامه نویسی، مانند هر فعالیت دیگری، سخت ترین قسمت شروع کار است. و بهتر است زودتر شروع کنید: اگر یک دانشمند یا حتی یک متخصص فنی هستید، دیر یا زود به این مهارت نیاز خواهید داشت.

  • تقاضا!

رویکردها و ابزارهای مترقی را از معلمان و سرپرستان بخواهید. البته اگر این امکان وجود داشته باشد ...

  • ايجاد كردن!

اگر در چارچوب یک برنامه آموزشی نباشد، کجای دیگر بهتر است که همه زخم های یک مبتدی را پشت سر بگذاریم؟ مهارت های خود را ایجاد و تقویت کنید - دوباره، هر چه زودتر شروع کنید، بهتر است.

برنامه نویسان مشتاق از همه کشورها، متحد شوید!

PS

برای ثبت رابطه مستقیمم با دانشجویان، عکسی به یاد ماندنی از سال 2017 با دو ناظم پیتر شارف (راست) و آلبرت خاریسوویچ گیلموتدینوف (سمت چپ) ضمیمه می کنم.

"مانیفست برای برنامه نویسان مبتدی از تخصص های مرتبط" یا اینکه چگونه به این نقطه از زندگی رسیدم

لااقل برای این لباس ها ارزش تمام شدن برنامه را داشت! (شوخی کردن)

منبع: www.habr.com

اضافه کردن نظر