انجمن سایت کلیدستان


رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
استفاده از یک تابع خاص در متلب

استفاده از یک تابع خاص در متلب

#1
سلام
من تازه کار با متلب رو شروع کردم و قصد دارم با استفاده از یکی از توابع متلب که شکل موج خاصی تولید می کنه برنامه ای بنویسم که اون شکل موج تو بازه ی خاصی صفر بشه و بعد دوباره تولید بشه یعنی یه تناوب صفر و یک روی اون تابع ایجاد کنم. ظاهرا با دستور if باید بشه این کارو انجام داد ولی متاسفانه اجرا نمیشه و من نمی تونم ایراد کارمو پیدا کنم. تابع مورد نظر توی تولباکس phase array قرار داره و به این شکل ایجاد میشه:

کد:
hw = phased.LinearFMWaveform('SweepBandwidth',1e5,...
'PulseWidth',1e-4);
plot(hw);

حالا من می خوام این تابع بعد از 0.1 میلی ثانیه تولید، به مدت 0.1 میلی ثانیه صفر بشه و بعد تکرار بشه.  برای صفر کردن تابع برنامه رو اینطور تغییر دادم ولی با اجرای اون کل تابع رو صفر می کنه 
   

کد:
hw = phased.LinearFMWaveform('SweepBandwidth',1e5,...
'PulseWidth',1e-4);
if 'PulseWidth'>1e-4
hw=0;
end
plot(hw);
پاسخ

استفاده از یک تابع خاص در متلب

#2
سلام.
شما از کلاس (class) با نام phased.LinearFMWaveform استفاده کرده اید، بنابراین hw که ساخته شده است، یک شیء (object) می باشد. بنابراین hw نمونه های شکل موج نیست که بتوانید دستورات دلخواه خود را بر روی ان اجرا کنید بلکه تنها دستورات خاص مربوط به کلاس phased.LinearFMWaveform را باید برای آن به کار ببرید.
برای درک بهتر این موضوع، این کدها را اجرا می کنیم (همان برنامه شما است و تنها علامت ; را از انتهایش برداشته ایم تا ببینیم متلب چه عبارتی را برای آن در خروجی نمایش می دهد) :

کد:
hw = phased.LinearFMWaveform('SweepBandwidth',1e5,'PulseWidth',1e-4)

خروجی متلب به صورت زیر خواهد بود :

کد:
hw =

       Description: 'Linear FM pulse waveform'
        SampleRate: 1000000                  
        PulseWidth: 0.0001                    
               PRF: 10000                    
    SweepBandwidth: 100000                    
    SweepDirection: 'Up'                      
          Envelope: 'Rectangular'            
      OutputFormat: 'Pulses'                  
         NumPulses: 1

همان طور که مشاهده می کنید، یک شیء است که دارای یک سری ویژگی های خاص خود می باشد.
اما حالا برویم سراغ هدف اصلی که داشتیم. باید نمونه های شکل موج را در یک بردار داشته باشیم. برای این منظور، دستور step را باید به کار ببریم (برای کلاس phased.LinearFMWaveform). سپس کدهای لازم برای صفر کردن به صورت متناوب را می نویسیم.
کل کدها متلب مورد نیاز، به صورت زیر می باشد :

کد:
clear all
close all
clc

pulse_duration=1e-4; % second
hw = phased.LinearFMWaveform('SweepBandwidth',1e5,...
'PulseWidth',pulse_duration);
plot(hw)

wave=step(hw);
figure
plot(real(wave))

wave_length=length(wave)
number_of_each_period=wave_length/(1e-3/pulse_duration)

for nn=1:wave_length
    if (mod(fix(nn/number_of_each_period),2)==1)
        wave(nn)=0;
    end
end

figure
plot(real(wave))

از دستور step استفاده کرده ایم تا نمونه های شکل موج را در بردار با نام wave ذخیره کنیم.
ابتدا باید ببینیم که 0.1 میلی ثانیه، برابر چه تعداد از نمونه های شکل موج خواهد بود. این تعداد را محاسبه نموده و در متغیر number_of_each_period ذخیره کرده ایم.
مهمترین بخش کدها، حلقه for می باشد که در آن، بر اساس تعداد نمونه های مربوط به هر 0.1 میلی ثانیه از شکل موج، به صورت تناوبی، مقادیر را صفر می کنیم. دستور fix برای گرد کردن اعداد اعشاری به سمت صفر به کار می رود (اگر از دستور round استفاده می کردیم جواب برنامه غلط میشد). دستور mod نیز باقیمانده تقسیم دو عدد را بر می گرداند. کدهای حلقه for را باید با دقت بخوانید تا متوجه شوید که چگونه تشخیص داده ایم که کدام نمونه ها باید صفر شوند.

و نتایج برنامه :

شکل موج مربوط به hw :

   

شکل موج wave (پس از استفاده از دستور step) :

   

شکل موج نهایی که به آن نیاز داشتیم :

   
 
 
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط شماره مجازی امارات ، تلگرام ضد فیلتر 2023


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان