"بيان من المبرمجين المبتدئين من التخصصات ذات الصلة" أو كيف جئت إلى مثل هذه الحياة

مقالتي اليوم عبارة عن أفكار بصوت عالٍ من شخص بدأ طريق البرمجة تقريبًا عن طريق الصدفة (وإن كان ذلك طبيعيًا).


نعم ، أنا أفهم أن تجربتي ليست سوى تجربتي ، لكن يبدو لي أنها تقع جيدًا في الاتجاه العام. علاوة على ذلك ، فإن التجربة الموضحة أدناه هي أكثر صلة بمجال النشاط العلمي ، لكن ما لا يمزح بحق الجحيم - يمكن أن يأتي مفيدًا في الخارج.



المصدر: https://xkcd.com/664/


بشكل عام ، إنه مكرس لجميع الطلاب الحقيقيين من طالب سابق!


توقعات


عندما أنهيت في عام 2014 شهادتي الجامعية في "تقنيات المعلومات والاتصالات وأنظمة الاتصالات" لم أكن أعرف شيئًا تقريبًا عن عالم البرمجة. نعم ، كان لي ، مثل الكثيرين ، موضوع علوم الكمبيوتر في السنة الأولى - ولكن يا إلهي ، كان في السنة الأولى! لقد كان الأعمار!


بشكل عام ، لم أكن أتوقع أي شيء مختلف بشكل خاص عن الطلاب الجامعيين ، والدخول في برنامج الماجستير "الاتصال ومعالجة الإشارات" التابع للمعهد الألماني الروسي للتكنولوجيات الجديدة.


لكن عبثا ...


كنا المجموعة الثانية فقط ، والرجال من الأول جمعوا للتو حقائبهم في ألمانيا البعيدة (يستغرق التدريب ستة أشهر في السنة الثانية من مدرسة الدراسات العليا). بعبارة أخرى ، لم تتعامل أي من أقرب الدوائر بعد بجدية مع أساليب التعليم الأوروبي ، ولم يكن هناك الكثير للسؤال عن التفاصيل.


في عامنا الأول ، بالطبع ، كان لدينا جميع أنواع الممارسات ، التي كنا عادةً ما نقدمها ديمقراطياً الاختيار بين البرامج النصية للكتابة (بشكل رئيسي في MATLAB) واستخدام واجهات المستخدم الرسومية المختلفة المتخصصة (بمعنى أنه بدون كتابة البرامج النصية - بيئات المحاكاة).



وغني عن القول ، نحن ، أساتذة العلوم في المستقبل ، من خلال حماقتنا الشابة ، مثل النار ، تجنبنا كتابة التعليمات البرمجية. هنا ، على سبيل المثال ، هو Simulink من MathWorks: ها هم الكتل ، ها هم الاتصالات ، ها هم جميع أنواع الإعدادات ومفاتيح التبديل.


الأصلية ومفهومة للشخص الذي كان يعمل سابقا في الدوائر وهندسة النظام ، انظروا!

هكذا بدا لنا ...


واقع


كان أحد العمل العملي للفصل الأول هو تطوير جهاز إرسال إشارة OFDM في إطار موضوع "طرق النمذجة والتحسين". الفكرة ناجحة للغاية: لا تزال التكنولوجيا ذات صلة وشعبية للغاية بسبب استخدامها ، على سبيل المثال ، في شبكات Wi-Fi و LTE / LTE-A (في شكل OFDMA). الشيء الأكثر أهمية بالنسبة للسادة هو تدريب مهاراتهم في تصميم أنظمة الاتصالات.



والآن لدينا خيارات متعددة للمواصفات الفنية مع معلمات إطار غير عملي بشكل واضح (حتى لا نبحث عن حل على الإنترنت) ، ونهاجم Simulink المذكور بالفعل ... ونحصل على إبريق شاي من الواقع على رأس:


  • كل كتلة محفوفة بالكثير من المعلمات غير المعروفة ، والتي هي مخيفة للتغيير من kondachka.
  • يبدو أن التلاعب بالأرقام يحتاج إلى القيام به ، ولكن يبدو بسيطًا ، ولكن لا سمح الله لكل نفس ، من الضروري أن يتم بناء السياج.
  • سيارات الكاتدرائية تبطئ بشكل ملحوظ من الاستخدام المحموم لواجهة المستخدم الرسومية ، حتى في مرحلة التصفح عبر مكتبات الكتل المتوفرة.
  • لإنهاء شيء ما في المنزل ، يجب أن يكون لديك نفس Simulink. ولا ، في الواقع ، بدائل.

نعم ، في النهاية ، بالطبع ، لقد أكملنا المشروع ، لكننا أنهيناه بصوت عالٍ.


مر بعض الوقت ، ووصلنا إلى نهاية السنة الأولى من برنامج الماجستير. بدأت كمية الواجبات المنزلية باستخدام واجهة المستخدم الرسومية في الانخفاض بشكل متناسب مع زيادة في حصة المواد الألمانية ، على الرغم من أنها لا تزال لم تصل إلى نقطة التحول النموذجي. الكثير منا ، بمن فيهم أنا ، يتغلبون على سعة كبيرة للتراكم ، استخدم المزيد والمزيد من ماتلاب بالضبط (وإن كان ذلك في شكل مجموعات أدوات) في مشاريعهم العلمية ، بدلاً من Simulink المألوف على ما يبدو.


كانت النقطة في شكوكنا عبارة واحدة من طلاب السنة الثانية (كانوا قد عادوا للتو إلى روسيا بحلول ذلك الوقت):


  • ننسى ، على الأقل خلال فترة التدريب ، حول Similink و MathCad و LabView الأخرى - وراء التل يكتب كل شخص في MATLAB ، باستخدام MatLab نفسه أو "نسخته" المجانية من Octave.

لقد اتضح أن البيان صحيح جزئياً: في إلميناو ، لم يتم حل النزاع حول اختيار الأدوات حتى النهاية. صحيح ، كان الاختيار في الغالب بين لغات MATLAB و Python و C.


في اليوم نفسه ، أخذني الإثارة المنطقية: هل يمكنني نقل الجزء الخاص بي من طراز مرسل OFDM إلى نموذج نصي؟ للمتعة فقط.


وحصلت على العمل.


خطوة بخطوة


بدلاً من الحسابات النظرية ، سأقدم رابطًا لهذه المقالة الممتازة لعام 2011 بدءًا من tgx وحتى الشرائح على المستوى المادي لـ LTE للأستاذ ميشيل ثيل (TU Ilmenau). أعتقد أن هذا سيكون كافيا.

"لذا ،" فكرت ، "لنكرر ما الذي سنقوم بنمذجه؟"
سنقوم محاكاة مولد الإطار OFDM.


ما سوف تشمل:


  • رموز المعلومات
  • إشارات الطيار
  • الأصفار (العاصمة)

من ماذا (من أجل البساطة) نحن مجردة:


  • من نمذجة بادئة دورية (إذا كنت تعرف الأساسيات ، فلن يكون الأمر صعبًا)


مخطط كتلة النموذج قيد الدراسة. سنتوقف إلى كتلة عودة FFT (IFFT). يمكن للجميع متابعة الباقي لاستكمال الصورة بأنفسهم - لقد وعدت المعلمين من القسم بترك شيء للطلاب.


نحدد لأنفسنا تلك. المهمة:


  • عدد ثابت من شركات النقل الفرعية ؛
  • طول الإطار الثابت ؛
  • يجب أن نضيف صفرًا واحدًا إلى المنتصف وزوجًا من الأصفار إلى بداية ونهاية الإطار (الإجمالي ، 5 قطع) ؛
  • يتم تشكيل رموز المعلومات باستخدام M-PSK أو M-QAM ، حيث M هو ترتيب التشكيل.

الوصول إلى الرمز.


يمكن تنزيل البرنامج النصي بأكمله من هنا .

تحديد معلمات الإدخال:


clear all; close all; clc M = 4; % eg 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; 

بعد ذلك ، يمكن تحديد المواضع باستخدام دالة linspace ، وتحويل القيم إلى أصغر الأعداد الصحيحة:


 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 ، والتفكير من خلال الحيل الرياضية.


ما هي الاستنتاجات التي استخلصتها بعد ذلك


ذاتي :


  • رمز الكتابة لطيف ويشبه الشعر!
  • البرمجة النصية هي الطريقة الأكثر ملاءمة للبحث في مجال الاتصالات ومعالجة الإشارات.

الهدف :


  • لا حاجة لإطلاق النار على العصافير من مدفع (إذا كان مثل هذا الهدف التعليمي ، بالطبع ، لا يستحق كل هذا العناء): باستخدام Simulink ، بدأنا في حل مهمة بسيطة باستخدام أداة متطورة.
  • واجهة المستخدم الرسومية جيدة ، ولكن فهم ما تحت الغطاء أفضل.

والآن ، وبعيداً عن الطالب ، أريد أن أقول ما يلي للطالبة الأخوية:


  • الذهاب لذلك!

حاول كتابة الكود ، حتى لو كان في البداية سيئًا. مع البرمجة كما هو الحال مع أي نشاط آخر ، فإن مشكلة الضرب هي البداية. ومن الأفضل أن تبدأ في وقت مبكر: إذا كنت عالماً أو حتى مجرد فني ، فستحتاج عاجلاً أم آجلاً إلى هذه المهارة.


  • الطلب!

طلب مناهج وأدوات مبتكرة من المعلمين والمشرفين. إذا كان ، بالطبع ، قدر الإمكان ...


  • افعلها!

أين هو الأفضل أن تصاب بمرض القروح للمبتدئين ، إن لم يكن كجزء من البرنامج التعليمي؟ ابتكر وصقل مهاراتك - مرة أخرى ، كلما بدأت ، كان ذلك أفضل.


المبرمجين المبتدئين من جميع البلدان ، اتحدوا!


PS


من أجل تسجيل علاقتي المباشرة مع الطلاب ، أرفق صورة لا تنسى لعام 2017 مع عميدين: بيتر شارف (يمين) وألبرت هاريسوفيتش غلموتينوف (يسار).


صورة


كان يستحق الانتهاء من البرنامج على الأقل من أجل هذه الأزياء! (مجرد مزاح)

Source: https://habr.com/ru/post/ar464479/


All Articles