زما نن ورځ مقاله د هغه چا څخه په لوړ غږ فکرونه دي چې د برنامه کولو لاره یې نږدې په ناڅاپي ډول اخیستې (که څه هم طبیعي وي).
هو، زه پوهیږم چې زما تجربه یوازې زما تجربه ده، مګر داسې ښکاري چې دا د عمومي رجحان سره ښه سمون لري. برسېره پردې، لاندې تشریح شوي تجربه د ساینسي فعالیتونو په ساحه کې ډیر تړاو لري، مګر هغه څه چې ټوکه نه ده - دا بهر ګټور کیدی شي.
سرچینه:
په عموم کې ، د پخواني زده کونکي څخه ټولو اوسني زده کونکو ته وقف شوی!
توقعات
کله چې ما په 2014 کې د انفارمیشن ټیکنالوژۍ او مخابراتو سیسټمونو کې د لیسانس سند بشپړ کړ، زه د پروګرام کولو نړۍ په اړه نږدې هیڅ نه پوهیږم. هو، د ډیرو نورو په څیر، ما په خپل لومړي کال کې د "کمپیوټر ساینس" مضمون واخیست - مګر، رب، دا زما په لومړي کال کې و! دا یو ابدیت دی!
په عموم کې ، ما د لیسانس سند څخه په ځانګړي ډول د کوم څه تمه نه درلوده ، او کله چې زه د ماسټرۍ برنامې ته داخل شوم
خو بې ګټې...
موږ یوازې دویمه برخه اخیستې وه، او د لومړي څخه هلکان لاهم د لرې آلمان لپاره خپل کڅوړې بسته کوي (انټرنشپ د ماسټرۍ په دوهم کال کې شپږ میاشتې وخت نیسي). په بل عبارت، د نږدی حلقې څخه هیڅوک تر اوسه د اروپایی زده کړو طریقې سره په جدي توګه نه دي مخامخ شوي، او هیڅوک شتون نلري چې د توضیحاتو په اړه پوښتنه وکړي.
زموږ په لومړي کال کې، البته، موږ مختلف ډوله کړنې درلودې، په کوم کې چې موږ معمولا په دیموکراتیک ډول د لیکلو سکریپټونو (په عمده توګه د MATLAB په ژبه کې) او د مختلفو لوړ تخصصي GUIs کارولو (په دې معنی چې د سکریپټونو لیکلو پرته - سمولیشن) تر منځ انتخاب وړاندیز کاوه. د ماډلینګ چاپیریال).
اړتیا نشته چې ووایو ، موږ ، د ساینس راتلونکي ماسټران ، زموږ د ځوان حماقت څخه د اور په څیر د کوډ لیکلو څخه ډډه وکړه. دلته، د مثال په توګه، د MathWorks څخه سمولنک دی: دلته بلاکونه دي، دلته اړیکې دي، دلته هر ډول ترتیبات او سویچونه دي.
یو نظر چې د هغه چا لپاره اصلي او د پوهیدو وړ دی چې دمخه یې د سرکټ ډیزاین او سیسټم انجینرۍ کې کار کړی!
نو موږ ته داسې ښکاري ...
حقیقت
د لومړي سمستر یو له عملي کارونو څخه د "موډل کولو او اصلاح کولو میتودونو" موضوع برخې په توګه د OFDM سیګنال ټرانسیور پراختیا وه. نظر خورا بریالی دی: ټیکنالوژي لاهم د هغې د کارولو له امله اړونده او خورا مشهوره ده، د بیلګې په توګه، په Wi-Fi او LTE/LTE-A شبکو کې (د OFDMA په بڼه). دا د ماسټرانو لپاره غوره شی دی چې د مخابراتي سیسټمونو ماډل کولو کې خپل مهارتونه تمرین کړي.
او اوس موږ ته د تخنیکي مشخصاتو ډیری اختیارونه د څرګند غیر عملي چوکاټ پیرامیټرو سره راکړل شوي (تر څو په انټرنیټ کې د حل په لټه کې نه شو) ، او موږ دمخه ذکر شوي سمولینک باندې ګوزار کوو ... او موږ په سر باندې د چای پاټ سره ووهلو. په حقیقت کې:
- هر بلاک د ډیری نامعلوم پیرامیټونو څخه ډک دی، کوم چې د خولۍ په څنډه کې د بدلون لپاره ویره لري.
- د شمیرو سره لاسوهنه باید ترسره شي، داسې ښکاري، ساده، مګر تاسو لاهم باید ګډوډ کړئ، خدای مه کړه.
- د کاتډرل ماشینونه د GUI د سخت کارونې څخه د پام وړ سست شوي ، حتی د موجود بلاکونو کتابتونونو له لارې د سرف کولو په مرحله کې.
- په کور کې د یو څه پای ته رسولو لپاره، تاسو اړتیا لرئ چې ورته سمولنک ولرئ. او، په حقیقت کې، هیڅ بدیل.
هو، په پای کې موږ، البته، پروژه بشپړه کړه، مګر موږ دا د راحت په لوړ تنفس سره بشپړه کړه.
یو څه وخت تېر شو، او موږ د ماسټرۍ د لومړي کال پای ته ورسیدو. د GUIs په کارولو سره د کور کار کولو مقدار د آلمان د مضامینو د تناسب په زیاتوالي سره په متناسب ډول راټیټ شو، که څه هم دا لاهم د تمثیل بدلون ته نه و رسیدلی. زموږ څخه ډیری، زما په شمول، د جوړولو لپاره زموږ د پام وړ پراخوالی باندې بریالي شوي، زموږ په ساینسي پروژو کې (که څه هم د وسیلې بکسونو په بڼه کې)، او داسې ښکاري چې پیژندل شوي سمولنک نه کارول کیږي.
زموږ د شکونو نقطه د دوهم کال د زده کونکو څخه یوه جمله وه (دوی پدې وخت کې روسیې ته راستانه شوي وو):
- هېر کړئ، لږترلږه د انټرنشپ مودې لپاره، د سمیلنک، MathCad او نورو LabView په اړه - د غونډۍ په اوږدو کې هرڅه په MATLAB کې لیکل شوي، پخپله MatLab یا د هغې وړیا "نسخه" Octave په کارولو سره.
بیان یو څه ریښتیا وګرځید: په ایلمیناو کې، د وسایلو د انتخاب په اړه شخړه هم په بشپړه توګه حل نه شوه. ریښتیا، انتخاب اکثرا د 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);
اوس راځئ چې د پیلوټ نښې پوه شو.
موږ یو ټیمپلیټ لرو (متغیر پیلوټان)، او راځئ چې ووایو چې موږ غواړو د دې ټیمپلیټ پیلوټان په ترتیب سره زموږ چوکاټ کې دننه شي. البته، دا په لوپ کې ترسره کیدی شي. یا تاسو کولی شئ د میټریکونو سره یو څه پیچلي لوبه وکړئ - خوشبختانه 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
"خوشحاله!" - ما په اطمینان سره فکر وکړ او لپ ټاپ مې بند کړ. ما د هر څه کولو لپاره څو ساعته وخت ونیو: د کوډ لیکلو په شمول، د متلاب ځینې دندې زده کول او د ریاضيیک چلونو له لارې فکر کول.
بیا ما کومې پایلې ترلاسه کړې؟
فرعي:
- د لیکلو کوډ خوندور او د شعر سره ورته دی!
- سکریپټینګ د مخابراتو او سیګنال پروسس کولو ساحې لپاره ترټولو اسانه څیړنې میتود دی.
هدف:
- د تپ څخه د مرغیو ډزې کولو ته اړتیا نشته (مګر دا ډول تعلیمي هدف البته د ارزښت وړ وي): د سمولنک په کارولو سره ، موږ د پیچلي وسیلې سره د ساده ستونزې حل کولو ته غاړه کیښوده.
- GUI ښه دی، مګر په دې پوهیدل چې "د هود لاندې" څه دي ښه دي.
او اوس، د زده کونکي څخه لرې، زه غواړم چې د زده کونکو ټولنې ته لاندې ووایم:
- د دې لپاره لاړ شه!
د کوډ لیکلو هڅه وکړئ، حتی که دا په لومړي سر کې خراب وي. د پروګرام کولو سره، د نورو فعالیتونو په څیر، ترټولو سخته برخه پیل دی. او دا غوره ده چې دمخه پیل کړئ: که تاسو ساینس پوه یاست یا حتی یوازې تخنیکي یاست ، ژر یا وروسته به تاسو دې مهارت ته اړتیا ولرئ.
- غوښتنه!
د ښوونکو او څارونکو څخه د پرمختللو طریقو او وسایلو غوښتنه وکړئ. که دا ممکنه وي، البته ...
- جوړ کړئ!
که چیرې د تعلیمي برنامې په چوکاټ کې نه وي ، نو بل چیرې دا غوره ده چې د پیل کونکي ټول زخمونه لرې کړئ؟ خپل مهارتونه جوړ او ښه کړئ - یو ځل بیا، څومره ژر چې تاسو پیل کړئ، ښه.
د ټولو هیوادونو لیوالتیا لرونکي پروګرام کونکي، متحد شئ!
PS
د زده کونکو سره زما د مستقیم اړیکو د ثبتولو لپاره، زه د 2017 یو یادګار عکس د دوو ریکټرانو سره ضمیمه کوم: پیټر شارف (ښي خوا ته) او البرټ خیروسوویچ ګیلمتدینوف (کیڼ اړخ ته).
لږترلږه د دې جامو لپاره دا د برنامه پای ته رسولو ارزښت درلود! (ټوکې)
سرچینه: www.habr.com