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



شناسایی سیستم با متلبزمان کنونی: ۱۳۹۵/۰۹/۱۹، ۰۸:۰۶ ب.ظ
کاربران در حال بازدید این موضوع: 1 مهمان
نویسنده: ayande
آخرین ارسال: admin
پاسخ 13
بازدید 5502

رتبه موضوع:
  • 1 رای - 4 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
شناسایی سیستم با متلب

شناسایی سیستم با متلب

#1
سلام
به نظرتون چطوری میتونم یک m. file برای شناسایی یک سیستم استفاده کرد من برنامه مربوط به روش های شناسایی به صورت m.file دارم اما نمی دونم چطوری ازش استفاده کنم و اینکه داده اندازه گیری شده را فیلتر کنم 
 

 
پاسخ

شناسایی سیستم با متلب

#2
سلام.
دقیقا منظورتون از شناسایی سیستم چیه ؟
لطفا بیشتر توضیح بدید.


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

شناسایی سیستم با متلب

#3
(۱۳۹۳/۰۱/۲۳, ۰۷:۲۰ ب.ظ)'admin' نوشته: سلام.
دقیقا منظورتون از شناسایی سیستم چیه ؟
لطفا بیشتر توضیح بدید.


 

سلام
منظور از شناسایی سیستم این است که ما یه سری داده به عنوان ورودی و یک سری هم به عنوان خروجی یک سیستم مجهول (البته این داده ها از طریق آزمایش محاسبه میشوند) در نظر میگیریم و آن وقت با دستوراتی که در متلب است به شناسایی این سیستم می پردازیم حالا من نمیدونم این m. file ها را چطوری ازش استفاده کنم اما یه سوال دیگه دارم و اینکه چطوری میشه از دادهای ورودی که به صورت آرایه هستن تبدیل z گرفت ؟
پاسخ

شناسایی سیستم با متلب

#4
من دستور czt رو پیدا کردم که برای Chirp z-transform به کار میره. دستور ztrans هم که برای تبدیل z از یک تابع مشخص (به صورت سمبلیک) می باشد و عملا به دردمون نمیخوره.
مثلا برای گرفتن تبدیل فوریه، برای توابع مشخص (به صورت سمبلیک)، دستور fourier رو داریم، اما برای گرفتن تبدیل فوریه از داده های گسسته، از دستور fft استفاده می شود (Fast Fourier transform)، حالا اینکه نامشون با هم فرق داره، نباید فکر کنیم که Fast Fourier transform جواب غلط میده، بلکه Fast Fourier transform برای گرفتن تبدیل فوریه از مقادیر گسسته به کار می رود و در پروژه های شبیه سازی، از آن استفاده می کنند. در واقع، روش Fast Fourier transform ، روشی برای محاسبه discrete Fourier transform می باشد (DFT).
این رو گفتم که برید دنبال مفهوم  Chirp z-transform و اگر برای همین مورد شما به کار می رود، از دستور مربوط به آن استفاده کنید.
همچنین برای شناسایی سیستم، از همین تبدیل فوریه نیز می توانید استفاده کنید (از دستور fft). از ورودی و خروجی، تبدیل فوریه می گیرید و سپس آنها را بر هم تقسیم می کنید تا تابع تبدیل به دست آید. در صورت تمایل، می توانید با استفاده از دستور ifft ، از آن تبدیل فوریه معکوس بگیرید.
در ضمن، این مطالب را بر حسب تجربه خود نوشته ام و هر کدام از آنها که غلط بود (یا روش بهتری برای آن پیدا کردید)، خوشحال می شوم تذکر بدهید.
آن m-file ها را هم باید ابتدا کدهایشان را بخوانید و ندیده نمی توان گفت که چگونه عمل می کنند.

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

شناسایی سیستم با متلب

#5
(۱۳۹۳/۰۱/۲۶, ۰۲:۱۵ ق.ظ)'admin' نوشته: من دستور czt رو پیدا کردم که برای Chirp z-transform به کار میره. دستور ztrans هم که برای تبدیل z از یک تابع مشخص (به صورت سمبلیک) می باشد و عملا به دردمون نمیخوره.
مثلا برای گرفتن تبدیل فوریه، برای توابع مشخص (به صورت سمبلیک)، دستور fourier رو داریم، اما برای گرفتن تبدیل فوریه از داده های گسسته، از دستور fft استفاده می شود (Fast Fourier transform)، حالا اینکه نامشون با هم فرق داره، نباید فکر کنیم که Fast Fourier transform جواب غلط میده، بلکه Fast Fourier transform برای گرفتن تبدیل فوریه از مقادیر گسسته به کار می رود و در پروژه های شبیه سازی، از آن استفاده می کنند. در واقع، روش Fast Fourier transform ، روشی برای محاسبه discrete Fourier transform می باشد (DFT).
این رو گفتم که برید دنبال مفهوم  Chirp z-transform و اگر برای همین مورد شما به کار می رود، از دستور مربوط به آن استفاده کنید.
همچنین برای شناسایی سیستم، از همین تبدیل فوریه نیز می توانید استفاده کنید (از دستور fft). از ورودی و خروجی، تبدیل فوریه می گیرید و سپس آنها را بر هم تقسیم می کنید تا تابع تبدیل به دست آید. در صورت تمایل، می توانید با استفاده از دستور ifft ، از آن تبدیل فوریه معکوس بگیرید.
در ضمن، این مطالب را بر حسب تجربه خود نوشته ام و هر کدام از آنها که غلط بود (یا روش بهتری برای آن پیدا کردید)، خوشحال می شوم تذکر بدهید.
آن m-file ها را هم باید ابتدا کدهایشان را بخوانید و ندیده نمی توان گفت که چگونه عمل می کنند.



 

ممنون از راهنمایتون من دستور را با داده های ورودی (یه بردار با طول 200) وخروجی (یه بردار با طول 200) امتحان کردم که حاصل تقسیم تبدیل z خروجی به تبریل z ورودی
 یه ماتریس 200*200 شد به نظرتون چطوری این ماتریس به معادله تبدیل کنم چون هدف یافتن معادله ای است که ارتباط بین ورودی و خروجی را نشان دهد    البته تابع همبستگی هم روش دیگری است . این مورد هم مثل تبدیل z مشکل داشتم که  چطوری تابع خود همبستگی ورودی ( Rxx) و همبستگی متقابل ورودی وخروجی (Rxy)  هر کدام جداگونه حساب و تبدیل z گرفته تقسیم کنم یکی از m-file ها در زیر است به نظرتون چطوری از این m-file برای شناسایی سیستم استفاده کنم (روش OLS برای شناسایی سیستم است)

کد:
clear u_t U N N_GUESS y u m n k j  iteration P_0 P_T_1 TETA_0 TETA_K_1 i c  a
Y y_hat num den;
N=4000; % Number of asmpels
PRBS = idinput (4095 , 'prbs',[0,1],[0,1]) ;
PRBS=PRBS-.5;
%for n=1:20000
%  PRBS(n+4095)=PRBS(n);
%end
for n=1:1:N
u(n) =1+ PRBS(n)/2;
end
for i=1:N
y_simulinks=(y_simulink)';
y(i)=y_simulinks(i);
end
%*************************THIS PART IS SPECIALLY ABOUT LS******************
% n : number of coefficients of denamenator of transfer function
% m : number of coefficients of numerator of transfer function
% N : number of samples
% a : column of matrix U
n=3;
m=n;
c=1;
for a=1 : n %This loop assigns first n columns of matrix U
j=1+a;
for k=j:N
U(k,a)=-y(c);
c=c+1;
end
c=1;
end
for a= n+1 : n+m % This loop assigns m columns of matrix U
i=a-n;
for k=i:N
U(k,a)=u(k);
end
end
%*************Now U is obtained . so we start to find teta*****************
teta=((inv(U'*U))*U')*y';
for i=1:n
den(i)=teta(i);
end %This line forms denamenators of transfer function
den=[1 den];
p=1;
100
for i=n+1:n+m
num(p)=teta(i);
p=p+1;
end % This line forms numerator of transfer function
h = tf (num , den , 0.01 , 'variable' , 'z^-1')
bode(h);
Y_hat=U*teta;
e_hat=y'-Y_hat;
S_hat=0;
for i=1:N %This loop calculates S-hat
k=e_hat(i)^2;
S_hat=S_hat+k;
end
S_hat;
segma_hat2=S_hat/(N-(n+m));
cov_teta_hat = ((segma_hat2)^2).*(inv((U')*U))
پاسخ

شناسایی سیستم با متلب

#6
من تا حالا در مورد  OLS کار نکردم و نمی تونم در این زمینه کمکتون کنم.
شما گفتید از تقسیم دو بردار به طول 200 ، یک ماتریس 200 در 200 به دست آوردید، که غلط است. تا اونجایی که من می دونم، شما باید هر عنصر از بردار اول را تقسیم بر عنصر متناظرش در بردار دوم کنید تا در نهایت، یک بردار با طول 200 به دست آید. خوب این میشه تابع تبدیل (transfer function) در حوزه فرکانس (چون آن دو بردار، تبدیل فوریه سیگنال های ورودی و خروجی بودن). حالا برای اینکه از آن، تابع تبدیل در حوزه زمان را به دست آوریم، باید تبدیل فوریه معکوس بگیریم، پس از دستور ifft استفاده می کنیم. بنابراین با رسم نتیجه، می توانید شکل تابع تبدیل در حوزه زمان را ببینید. 
اکنون می توانید یک روش دلخواه را انتخاب کنید که بر اساس مقادیر تابع تبدیل، تخمینی از فرمول آن ارائه کند. 
من موارد دیگری با جستجو در اینترنت یافتم، ولی چون در آن زمینه ها کار نکرده بودم، به نظرم همین fft از بقیه بهتر است.

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

شناسایی سیستم با متلب

#7
(۱۳۹۳/۰۱/۲۸, ۰۲:۱۲ ب.ظ)'admin' نوشته: من تا حالا در مورد  OLS کار نکردم و نمی تونم در این زمینه کمکتون کنم.
شما گفتید از تقسیم دو بردار به طول 200 ، یک ماتریس 200 در 200 به دست آوردید، که غلط است. تا اونجایی که من می دونم، شما باید هر عنصر از بردار اول را تقسیم بر عنصر متناظرش در بردار دوم کنید تا در نهایت، یک بردار با طول 200 به دست آید. خوب این میشه تابع تبدیل (transfer function) در حوزه فرکانس (چون آن دو بردار، تبدیل فوریه سیگنال های ورودی و خروجی بودن). حالا برای اینکه از آن، تابع تبدیل در حوزه زمان را به دست آوریم، باید تبدیل فوریه معکوس بگیریم، پس از دستور ifft استفاده می کنیم. بنابراین با رسم نتیجه، می توانید شکل تابع تبدیل در حوزه زمان را ببینید. 
اکنون می توانید یک روش دلخواه را انتخاب کنید که بر اساس مقادیر تابع تبدیل، تخمینی از فرمول آن ارائه کند. 
من موارد دیگری با جستجو در اینترنت یافتم، ولی چون در آن زمینه ها کار نکرده بودم، به نظرم همین fft از بقیه بهتر است.



 

ممنون از راهنماییتون
پاسخ
 سپاس شده توسط admin

شناسایی سیستم با متلب

#8
با سلام
به نظرتون داده های ورودی و خروجی قبل از پردازش رو چطوری فیلتر کنم تا محاسبات دقیق تر بشه (از بین بردن خطاهای اندازه گیری)
پاسخ

شناسایی سیستم با متلب

#9
(۱۳۹۳/۰۱/۳۰, ۱۰:۰۸ ق.ظ)'ayande' نوشته: با سلام
به نظرتون داده های ورودی و خروجی قبل از پردازش رو چطوری فیلتر کنم تا محاسبات دقیق تر بشه (از بین بردن خطاهای اندازه گیری)

 

لینک زیر رو ببینید (در مورد noise reduction filter می باشد) :

https://www.clear.rice.edu/elec301/Proje...sered.html

در آن، یک تابع به صورت زیر نوشته شده است :

کد:
function y = denoiseEm(x);
% y = denoiseEm(x);
% method to denoise a given signal using wavelets
% x is the input Matlab sound file

%THR is the threshold, SORH is for soft or hard thresholding, KEEPAPP allows you to keep
%approximation coefficients
[thr,sorh,keepapp]=ddencmp( 'den' , 'wv' ,x);

% returns a de-noised version xc of input signal x (our one-dimensional speech signal)
%obtained by wavelet coefficients thresholding using global positive threshold THR
%PERF0 and PERFL2 are L2-norm recovery and compression score in percentage.
[y, cxc, lxc, perf0, perfl2]=wdencmp( 'gbl' ,x, 'db3' ,2,thr,sorh,keepapp);

که برای حذف نویز به کار می رود (سرنخ هایی در مورد توابع مرتبط به شما می دهد). اما باید ببینید که چگونه نویزهایی در سیگنال وجود دارد (مورد بالا نوشته که تمامی نویزهای خارجی باید قابل بیان بر حسب white Gaussian noise  باشند).
این رو هم بگم که زمانی نیاز به استفاده از روش های کاهش نویز هست که سیگنال رو در از خارج از نرم افزار متلب به دست آورده باشید، چون وقتی شما یک مدل ایده آل را در متلب شبیه سازی می کنید و سیگنال ها را از آن به دست می آورید، دیگر نویزی وجود ندارد (مگر نویزهای که تعریفی بر اساس خود سیستم داشته باشند). مثلا من خودم وقتی یک سیگنال را در نرم افزار متلب (با شبیه سازی) به دست آورده بودم، با دستور awgn ، به آن نویز گوسی سفید (white Gaussian noise) اضافه می کردم تا در مراحل بعدی شبیه سازی، اثر نویز نیز در نظر گرفته شده باشد (زیرا آن سیگنال، ایده آل بود و عملا نویزی نداشتیم).

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

شناسایی سیستم با متلب

#10
(۱۳۹۳/۰۱/۳۰, ۰۸:۴۰ ب.ظ)'admin' نوشته:
(۱۳۹۳/۰۱/۳۰, ۱۰:۰۸ ق.ظ)'ayande' نوشته: با سلام
به نظرتون داده های ورودی و خروجی قبل از پردازش رو چطوری فیلتر کنم تا محاسبات دقیق تر بشه (از بین بردن خطاهای اندازه گیری)


 

لینک زیر رو ببینید (در مورد noise reduction filter می باشد) :

https://www.clear.rice.edu/elec301/Proje...sered.html

در آن، یک تابع به صورت زیر نوشته شده است :


کد:
function y = denoiseEm(x);
% y = denoiseEm(x);
% method to denoise a given signal using wavelets
% x is the input Matlab sound file

%THR is the threshold, SORH is for soft or hard thresholding, KEEPAPP allows you to keep
%approximation coefficients
[thr,sorh,keepapp]=ddencmp( 'den' , 'wv' ,x);

% returns a de-noised version xc of input signal x (our one-dimensional speech signal)
%obtained by wavelet coefficients thresholding using global positive threshold THR
%PERF0 and PERFL2 are L2-norm recovery and compression score in percentage.
[y, cxc, lxc, perf0, perfl2]=wdencmp( 'gbl' ,x, 'db3' ,2,thr,sorh,keepapp);

که برای حذف نویز به کار می رود (سرنخ هایی در مورد توابع مرتبط به شما می دهد). اما باید ببینید که چگونه نویزهایی در سیگنال وجود دارد (مورد بالا نوشته که تمامی نویزهای خارجی باید قابل بیان بر حسب white Gaussian noise  باشند).
این رو هم بگم که زمانی نیاز به استفاده از روش های کاهش نویز هست که سیگنال رو در از خارج از نرم افزار متلب به دست آورده باشید، چون وقتی شما یک مدل ایده آل را در متلب شبیه سازی می کنید و سیگنال ها را از آن به دست می آورید، دیگر نویزی وجود ندارد (مگر نویزهای که تعریفی بر اساس خود سیستم داشته باشند). مثلا من خودم وقتی یک سیگنال را در نرم افزار متلب (با شبیه سازی) به دست آورده بودم، با دستور awgn ، به آن نویز گوسی سفید (white Gaussian noise) اضافه می کردم تا در مراحل بعدی شبیه سازی، اثر نویز نیز در نظر گرفته شده باشد (زیرا آن سیگنال، ایده آل بود و عملا نویزی نداشتیم).



 

ممنون از راهنمایتون
پاسخ
 سپاس شده توسط admin

شناسایی سیستم با متلب

#11
با سلام
راستش من نتونستم پروژه ام را کامل کنم وحالا میخوام یه فیلتر فازی طراحی کنم وبعد داده هامو از این طریق فیلتر کنم  سپس به شناسایی سیستم بپردازم  چون به نظر میاد داده ها زیادی نویز دارند . پروژهه باید یه قسمتش از  مفهوم فازی  استفاده بشه .حالا به نظرتون این فیلتر چطوری میشه طراحی کرد.
پاسخ

شناسایی سیستم با متلب

#12
سلام  
من یه فایل مربوط به جعبه ابزار فازی از اینترنت دانلود کردم و تو متلب اجراش کردم پنجره مریوطه باز میشه ولی نمیشه داده ها را وارد کرد( گزینه مربوطه اجرا نمیشه) به نظرتون علتش چیه ؟ من یه سوال قبلا پرسیده بودم ممکنه به اون هم پاسخ بدید

 
پاسخ

شناسایی سیستم با متلب

#13
من پاسخ هر سوالی را که بدانم، حتما جواب می دهم.
متاسفانه پاسخ دو سوال شما را نمی دانم.


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


پرش به انجمن:


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

آخرین کلیدهای غیررایگان

شما هم می توانید کلیدهای غیررایگان منتشر کنید (بیشتر بدانید)