අද මගේ ලිපිය අහම්බෙන් වගේ (තාර්කිකව වුවද) ක්රමලේඛන මාවතට අවතීර්ණ වූ පුද්ගලයෙකුගේ සිතුවිල්ලකි.
ඔව්, මගේ අත්දැකීම ඒක විතරයි කියලා මට තේරෙනවා - මගේ අත්දැකීම, නමුත් මම හිතන්නේ එය සාමාන්ය ප්රවණතාවයට හොඳින් ගැලපෙනවා. එපමණක් නොව, පහත විස්තර කර ඇති අත්දැකීම අධ්යයන කටයුතු ක්ෂේත්රයට වඩාත් අදාළයි, නමුත් කවුද දන්නේ - එය ඉන් ඔබ්බට ප්රයෝජනවත් විය හැකිය.

මූලාශ්රය:
පොදුවේ ගත් කල, මෙය පැරණි ශිෂ්යයෙකුගේ සිට වත්මන් සියලුම සිසුන් සඳහා කැප කර ඇත!
අපේක්ෂාවන්
2014 දී "තොරතුරු සන්නිවේදන තාක්ෂණයන් සහ පද්ධති" පිළිබඳ මගේ උපාධිය අවසන් කරන විට, මම ක්රමලේඛන ලෝකය ගැන කිසිවක් දැන සිටියේ නැත. ඔව්, අනෙක් බොහෝ අය මෙන්, මම මගේ පළමු වසරේදී "පරිගණක විද්යාව" හැදෑරුවා - නමුත්, මගේ දෙවියනේ, ඒ මගේ පළමු වසරේදීයි! එය සදාකාලික බවක් දැනුණා!
සමස්තයක් වශයෙන්, මම උපාධියකට වඩා විශේෂයෙන් වෙනස් දෙයක් අපේක්ෂා කළේ නැහැ, සහ මම ශාස්ත්රපති වැඩසටහනට ඇතුළත් වූ විට ජර්මානු-රුසියානු නව තාක්ෂණ ආයතනය.
නමුත් නිෂ්ඵලයි...
අපි දෙවන කණ්ඩායම පමණයි, පළමු කණ්ඩායමේ අය තවමත් දුර බැහැර ජර්මනියට යාමට තම බෑග් අසුරමින් සිටියහ (මාස්ටර් උපාධියක දෙවන වසර තුළ සීමාවාසික පුහුණුව මාස හයක් පවතී). වෙනත් වචන වලින් කිවහොත්, අපගේ සමීප කවයේ කිසිවෙකු තවමත් කිසිදු අර්ථවත් ආකාරයකින් යුරෝපීය අධ්යාපන ක්රම අත්විඳ නොතිබූ අතර, විස්තර ගැන විමසීමට එතරම් කිසිවෙකු සිටියේ නැත.
ඇත්ත වශයෙන්ම, අපගේ පළමු වසර තුළ අපට විවිධ ආකාරයේ ප්රායෝගික පුහුණුවක් ලැබුණු අතර, එම කාලය තුළ අපට සාමාන්යයෙන් ස්ක්රිප්ට් ලිවීම (ප්රධාන වශයෙන් MATLAB භාෂාවෙන්) සහ විවිධ විශේෂිත GUI භාවිතා කිරීම (ස්ක්රිප්ට් ලිවීමකින් තොරව - සමාකරණ ආකෘති නිර්මාණ පරිසරයන් යන අර්ථයෙන්) අතර ප්රජාතන්ත්රවාදී තේරීමක් පිරිනමන ලදී.

අපි, අනාගත විද්යා පශ්චාත් උපාධි සිසුන්, අපේ තරුණ මෝඩකම තුළ, වසංගතය මෙන් කේත ලිවීමෙන් වැළකී සිටිය බව අමුතුවෙන් කිව යුතු නැත. උදාහරණයක් ලෙස, MathWorks වෙතින් Simulink ගන්න: මෙන්න බ්ලොක්, මෙන්න සම්බන්ධතා, මෙන්න සියලු ආකාරයේ සැකසුම් සහ ස්විච.
පරිපථ නිර්මාණය සහ පද්ධති ඉංජිනේරු විද්යාව සමඟ කලින් වැඩ කළ කෙනෙකුට හුරුපුරුදු සහ තේරුම්ගත හැකි පෙනුමක්!

මූලාශ්රය:
ඒක තමයි අපිට පෙනුනේ...
යථාර්ථය
පළමු අධ්යයන වාරයේ ප්රායෝගික පැවරුම්වලින් එකක් වූයේ "ආකෘති නිර්මාණය සහ ප්රශස්තිකරණය සඳහා ක්රම" පාඨමාලාවේ කොටසක් ලෙස OFDM සංඥා සම්ප්රේෂකයක් සංවර්ධනය කිරීමයි. අදහස තරමක් දක්ෂ විය: තාක්ෂණය අදටත් අදාළ වන අතර තරමක් ජනප්රියයි, Wi-Fi සහ LTE/LTE-A ජාල වල (OFDMA ආකාරයෙන්) එහි භාවිතයට ස්තූතිවන්ත වන්න. ශාස්ත්රපති සිසුන්ට ඔවුන්ගේ විදුලි සංදේශ පද්ධති ආකෘති නිර්මාණ කුසලතා පුහුණු වීමට එය පරිපූර්ණයි.

ඉතින්, අපට පැහැදිලිවම ප්රායෝගික නොවන රාමු පරාමිතීන් සහිත තාක්ෂණික පිරිවිතරවල අනුවාද කිහිපයක් ලබා දී ඇත (එබැවින් අන්තර්ජාලය හරහා විසඳුමක් සෙවීමට සිදු නොවේ), අපි ඉහත සඳහන් කළ සිමියුලින්ක් වෙත පහර දෙමු... තවද අපට රියැලිටි බෝම්බයකින් හිසට පහර දෙනු ලැබේ:
- සෑම බ්ලොක් එකකම නොදන්නා පරාමිතීන් ටොන් ගණනක් අඩංගු වන අතර, ඒවා හදිසියේ වෙනස් කිරීමට බියජනක ය.
- සංඛ්යා සමඟ කළ යුතු හැසිරවීම් බැලූ බැල්මට සරල බව පෙනේ, නමුත් ඔබට තවමත් බැරෑරුම් වැඩ කිහිපයක් කිරීමට සිදුවේ.
- පවතින බ්ලොක් වල පුස්තකාල හරහා සැරිසරන විට පවා, GUI හි වියරු භාවිතය නිසා දෙපාර්තමේන්තු යන්ත්ර සැලකිය යුතු ලෙස මන්දගාමී වේ.
- නිවසේදී යමක් අවසන් කිරීමට, ඔබට එම සිමියුලින්ක් එක අවශ්ය වේ. ඇත්තටම විකල්ප නොමැත.
ඔව්, ඇත්ත වශයෙන්ම, අපි අවසානයේ ව්යාපෘතිය අවසන් කළා, නමුත් අපි එය අවසන් කළේ සහනදායී සුසුමක් හෙළමින්.
යම් කාලයක් ගත වූ අතර, අපි අපගේ ශාස්ත්රපති වැඩසටහනේ පළමු වසරේ අවසානයට ළඟා විය. ජර්මානු පාඨමාලා අනුපාතය වැඩි වන විට GUI භාවිතා කරන ගෙදර වැඩ ප්රමාණය සමානුපාතිකව අඩු වීමට පටන් ගත් නමුත් එය තවමත් සුසමාදර්ශී මාරුවක ලක්ෂ්යයට ළඟා වී නොතිබුණි. මා ඇතුළු අපෙන් බොහෝ දෙනෙක්, වෙනස් වීමට ඇති අපගේ සැලකිය යුතු ආශාව ජය ගනිමින්, අපගේ පර්යේෂණ ව්යාපෘතිවල හුරුපුරුදු සිමියුලින්ක් වෙනුවට, මැට්ලැබ් (මෙවලම් පෙට්ටියේ ස්වරූපයෙන් වුවද) වැඩි වැඩියෙන් භාවිතා කළෙමු.
අපගේ සැකයේ අවසාන වචනය දෙවන වසරේ සිසුවෙකුගේ වාක්ය ඛණ්ඩයකි (ඔවුන් ඒ වන විට රුසියාවට ආපසු පැමිණ තිබුණි):
- අවම වශයෙන් ඔබේ සීමාවාසික කාලය සඳහා, Similink, MathCad සහ අනෙකුත් LabView වැඩසටහන් ගැන අමතක කරන්න - විදේශයන්හි, සියල්ල MATLAB හි ලියා ඇත, MatLab හෝ එහි නොමිලේ "අනුවාදය" වන Octave භාවිතා කරයි.
ප්රකාශය අර්ධ වශයෙන් නිවැරදි බව පෙනී ගියේය: ඉල්මෙනෝ හි, මෙවලම් තේරීම පිළිබඳ විවාදය ද සම්පූර්ණයෙන්ම විසඳී නොතිබුණි. කෙසේ වෙතත්, තේරීම ප්රධාන වශයෙන් MATLAB, Python සහ C අතර විය.
ඒ දවසේම, මට ස්වභාවික උද්යෝගයක් ඇති වුණා: OFDM සම්ප්රේෂක ආකෘතියේ මගේ කොටස ස්ක්රිප්ට් ආකාරයෙන් මාරු කිරීම ගැන කුමක් කිව හැකිද? හුදෙක් විනෝදය සඳහා පමණයි.
ඒ වගේම මම වැඩට ගියා.
පියවරෙන් පියවර
න්යායාත්මක ගණනය කිරීම් වෙනුවට, මම මේකට සබැඳියක් දෙන්නම් 2011 සිට සහ ස්ලයිඩ මත මහාචාර්යවරු (TU ඉල්මෙනෝ) මම හිතන්නේ ඒක ඇති වෙයි.
"ඉතින්," මම හිතුවා, "අපි නැවත කියමු, අපි ආදර්ශයට ගන්නේ මොකක්ද?"
අපි ආකෘති නිර්මාණය කරන්නෙමු OFDM රාමු උත්පාදක යන්ත්රය (OFDM රාමු උත්පාදක යන්ත්රය).
එයට ඇතුළත් වන්නේ කුමක්ද:
- තොරතුරු සංකේත
- නියමු සංඥා
- බිංදු (DC)
(සරල බව සඳහා) අපි සාරාංශ කරන්නේ කුමක් ද:
- චක්රීය උපසර්ගයක් ආකෘතිකරණය කිරීමෙන් (ඔබ මූලික කරුණු දන්නේ නම්, එකක් එකතු කිරීම අපහසු නොවනු ඇත)

සලකා බලනු ලබන ආකෘතියේ බ්ලොක් රූප සටහනක්. අපි ප්රතිලෝම වේගවත් ෆූරියර් පරිවර්තන (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 ශ්රිත කිහිපයක් ඉගෙන ගන්න, සහ ගණිත උපක්රම කිහිපයක් හොයාගන්න.
එතකොට මම ගත්ත නිගමන මොනවාද?
ආත්මීය:
- කේත ලිවීම විනෝදජනකයි, කවියට සමානයි!
- සන්නිවේදන සහ සංඥා සැකසුම් ක්ෂේත්රය සඳහා වඩාත් පහසු පර්යේෂණ ක්රමය ස්ක්රිප්ටින් වේ.
අරමුණ:
- කාලතුවක්කුවකින් ගේ කුරුල්ලන්ට වෙඩි තැබීමට අවශ්ය නැත (ඇත්ත වශයෙන්ම එය අධ්යාපනික ඉලක්කය නොවේ නම්): සිමියුලින්ක් භාවිතා කරමින්, අපි නවීන මෙවලමක් සමඟ සරල ගැටළුවක් විසඳා ගත්තෙමු.
- GUI හොඳයි, නමුත් ඒ ආවරණය යට ඇති දේ තේරුම් ගැනීම වඩා හොඳය.
දැන්, තවදුරටත් ශිෂ්යයෙකු නොවන බැවින්, ශිෂ්ය සහෝදරත්වයට මම පහත සඳහන් දේ පැවසීමට කැමැත්තෙමි:
- එය කරන්න!
මුලදී නරක වුවත්, කේතය ලිවීමට උත්සාහ කරන්න. වෙනත් ඕනෑම ක්රියාකාරකමක් මෙන්, ක්රමලේඛනය සමඟද, ආරම්භය දුෂ්කරම කොටසයි. ඒ වගේම කලින්ම ආරම්භ කිරීම වඩා හොඳයි: ඔබ විද්යාඥයෙක් හෝ තාක්ෂණික ශිල්පියෙක් නම්, ඔබට මෙම කුසලතාව ඉක්මනින් හෝ පසුව අවශ්ය වනු ඇත.
- ඉල්ලුම!
ඔබේ ගුරුවරුන්ගෙන් සහ අධ්යයන උපදේශකයින්ගෙන් ප්රගතිශීලී ප්රවේශයන් සහ මෙවලම් ඉල්ලා සිටින්න. එය පවා කළ හැකි නම්, ඇත්ත වශයෙන්ම...
- නිර්මාණය කරන්න!
ආරම්භකයෙකුගේ ගමනේ ඇති සියලු අන්තරායන් ජය ගැනීමට අධ්යාපනික වැඩසටහනක් හරහා යාමට වඩා හොඳ ක්රමයක් තිබේද? ඔබේ කුසලතා නිර්මාණය කර ඔප් නංවන්න - නැවතත්, ඔබ ඉක්මනින් ආරම්භ කරන තරමට වඩා හොඳය.
සියලුම රටවල අභිලාෂකාමී ක්රමලේඛකයින්, එක්වන්න!
ප්රාදේශීය සභා
ශිෂ්ය ප්රජාව සමඟ මගේ සෘජු සම්බන්ධතාවය ලේඛනගත කිරීම සඳහා, මම 2017 දී රෙක්ටර්වරුන් දෙදෙනෙකු වන පීටර් ෂාර්ෆ් (දකුණු පසින්) සහ ඇල්බට් කරිසොවිච් ගිල්මුට්ඩිනොව් (වමේ) සමඟ සමරු ඡායාරූපයක් අමුණමි.

ඒ ඇඳුම් වලට විතරක් වැඩසටහන ඉවර කරන එක වටිනවා! (විහිළුවට කිව්වේ)
මූලාශ්රය: www.habr.com
