پروژه درس سیگنال ها و سیستم ها
پروژه درس سیگنال ها و سیستم ها ، در این پست از مطلب دی ال دو تمرین یا پروژه از درس سیگنال ها و سیستم ها را در نرم افزار متلب پیاده سازی کرده ایم یا به عبارتی دیگر دو تمرین از درس سیگنال ها و سیستم ها را با نرم افزار متلب MATLAB انجام داده ایم که در ادامه آورده شده است ، با ما همراه باشید.
پروژه درس سیگنال ها و سیستم ها
پروژه یا تمرین اول
برنامه ای بنویسید که کانولوشن دو سیگنال دلخواه را محاسبه کرده و خروجی حاصل را به صورت نمودار نمایش دهد.
در این قسمت برنامه ای در نرم افزار متلب می نویسیم تا کانولوشن دو سیگنال گسسته زمان را حساب کند. قدم به قدم کدها و فرایند محاسبه ی کانولوشن توضیح داده میشود.
از شکل پیداست که برای کانولوشن دو سیگنال لازم است که یکی از سیگنال ها رو در حوزه ی زمان معکوس کنیم و برروی سیگنال دیگر جاروب نماییم. همین کار برای سیگنال گسسته نیز وجود دارد. با این تفاوت که انتگرال تبدیل به سیگما می شود. در ادامه کدها را توضیح می دهیم.
همچنین بخوانید: پروژه طراحی فیلتر برای حذف نویز در سیگنال صوتی
- پاک کردن متغیرها و شکل های قبلی.
- تعریف دو سیگنال گسسته ی x , h با دامنه های متفاوت و دلخواه.
- طول سیگنال های گسسته را در دو متغیر m ,n ذخیره میکنیم.
- بردارهای X,H برای فرایند کانولوشن تعریف می شوند.
- سیگنالH را برعکس کرده و بصورت جمع شونده در X ضرب می کنیم و Y که حاصل کانولوشن هست را میسازیم.
- متغیرn3 دامنه ی سیگنال خروجی را نشان می دهد. می دانیم که دامنه ی سیگنال خروجی کانولوشن برابر با جمع کران های پایین و بالای دو سیگنال است. این یکی از خواص کانولوشن است.
- در نهایت نتایج را رسم می کنیم.
% Convolution
close all
clear
clc
%% define function
n1=-5:5;
n2=-10:10;
x=ones(1,length(n1));
h=cos(n2);
%% convolution
m=length(x);
n=length(h);
X=[x,zeros(1,n)];
H=[h,zeros(1,m)];
for i=1:n+m-1
Y(i)=0;
for j=1:m
if(i-j+1>0)
Y(i)=Y(i)+X(j)*H(i-j+1);
else
end
end
end
%% Plot results
n3=min(n1)+min(n2):max(n1)+m
ax(n2);
subplot(311)
stem(n1,x);
ylabel('x[n]');
title('x[n]');
subplot(312)
stem(n2,h);
ylabel('h[n]');
title('h[n]');
subplot(313)
stem(n3,Y);
ylabel('Y[n]');
xlabel('n');
title('Convolution of Two
Signals without conv
function');
نتیجه ی کانولوشن سیگنال کسینوسی در یک سیگنال مربعی:
توجه:
شما می توانید سیگنال های دلخواه خود را در کد جایگزین نمایید.
پروژه یا تمرین دوم
برنامه ای بنویسید و در آن با یک سیگنال دلخواه ورودی، سیستم [y[n] = x[n/2 و سیستم معکوس آن را بررسی کرده و با توجه به نتایج به بررسی عدم معکوس پذیری سیستم بیان شده بپردازید.
در حوزه ی گسسته y[n]=x[n/2] دارای خواص جالبی است و با y(t)=x(t/2) در حوزه ی پیوسته تفاوت بسیاری دارد. فرض کنید x بصورت زیر موجود باشد:
X=[1 ۲ ۳ ۴ ۵
-۱ ۲٫۵ ۳ ۴ ۵٫۵]
که سطر اول n و سطر دوم مقدار x[n] را نمایش می دهد.
در این صورت y[n]=x[n/2] بصورت زیر محاسبه می شود:
y[n]=[1 2 3 4 5 6 7 8 9 10
0 -1 0 2.5 0 3 0 4 0 5.5]
همچنین بخوانید: پروژه خطی سازی سیستم های کنترلی غیر خطی در متلب
اندیس هایی از y که بر ۲ بخش پذیر هست را مقداردهی می کنیم بر اساس x[n/2] و اندیس هایی که بر ۲ بخش پذیر نیست را با مقدار صفر جایگزین می کنیم. به این کار اصطلاحا upsampling می گویند.
همین کار را در کد متلب انجام میدهیم. دستور mod(i,2)==0 بررسی می کند که آیا باقیمانده ی اندیس بر ۲ صفر هست یا نه. در صورتی که صفر باشد مقدار متناظر x[n/2] را جایگزین می کند و در غیر این صورت مقدار صفر را جایگزین می کند. توجه داشته باشید که در یک سیگنال گسسته x[1.5] معنایی ندارد!
در نهایت نیز مقدار x[n] و مقدار x[n/2] را رسم می کنیم. در حقیقت تقسیم بر ۲ کردن آرگومان یک تابع گسسته معادل این است که بین نمونه های آن یکی در میان مقدار صفر را قرار دهیم.
% Convolution
close all
clear
clc
% define function
n=-10:10;
x=cos(n);
n1=length(n);
%% y[n]=x[n/2];
for i=2*n(1):2*n(end)
if mod(i,2)==0
y(i-2*n(1)+1)=x((i-
۲*n(1))/2+1);
else
y(i-2*n(1)+1)=0;
end
end
%%
% Plot Results
n1=2*n(1):2*n(end);
subplot(211)
stem(n,x);
ylabel('x[n]');
title('x[n]');
subplot(212)
stem(n1,y);
ylabel('y[n]');
xlabel('n');
title('y[n]=x[n/2]');
نتیجه خروجی:
از روی شکل پیداست که سیگنال کاملا معکوس پذیر است چون هیچ نمونه ای از بین نرفته است. با نتخاب نمونه های زوج می توانیم سیگنال x[n] را بسیازیم.
همچنین بخوانید: کنترل SDRE بازوی ربات و مقایسه با LQR
فرایند معکوس گیری نیز بصورت زیر انجام می شود:
%% Invers
n2=length(n1);
k=1;
for
i=2*n(1):2*n(end)
if mod(i,2)==0
x1(k)=y(i-
۲*n(1)+1);
k=k+1;
end
end
figure
stem(n,x1);
ylabel('x[n]');
xlabel('n');
title('Invers');
توجه داریم که با معکوس گیری می بایست مجددا x[n] تولید شود.
امیدوارم این آموزش برای شما مفید بوده باشد…
دیدگاه خود را ثبت کنید
تمایل دارید در گفتگوها شرکت کنید؟در گفتگو ها شرکت کنید.