قلم

وبلاگ امیرحسین حاجی حسینی

قلم

وبلاگ امیرحسین حاجی حسینی

قلم

طبقه بندی موضوعی

جمعه, ۹ اسفند ۱۳۹۲، ۱۲:۴۷ ب.ظ

طراحی فیلتر در نرم افزار MatLab

جمعه, ۹ اسفند ۱۳۹۲، ۱۲:۴۷ ب.ظ

در این مطلب قصد داریم طراحی فیلتر در نرم افزار متلب را بررسی نماییم . برای این منظور از fdatool استفاده می کنیم . 

در قسمت command window عبارت fdatool را تایپ می کنیم . صفحه زیر ظاهر می شود :

filter design 01

در این صفحه مشخصات مورد نیاز فیلتر را وارد می کنیم . برای مثال  در قسمت های Frequency Specification و Magnitude Specification اطلاعات زیر را وارد می کنیم :

Fs=9600

Fpass=1650

Fstop=1750

Apass=0.1

Astop=80

در قسمت Response Type نیز انواع فیلتر ها وجود دارد که متناسب با کار خود یکی از آنها را انتخاب می کنیم . 

حال با کلیک بر روی Design Filter ، فیلتر مورد نظر طراحی می شود . 

filter design 02

حال در نیمه بالایی این پنجره می توان مشخصات مختلف فیلتر را مشاهده کرد :

filter design 03

1 - اندازه پاسخ

2 - فاز پاسخ

3 - اندازه و فاز پاسخ

4 - تأخیر گروه

5 - تأخیر فاز

6 - پاسخ ضربه

7 - پاسخ پله

8 - نمودار صفر و قطب

9 - ضرایب فیلتر

10 - اطلاعات فیلتر

filter design 04

اندازه و فاز فیلتر

filter design 05

پاسخ ضربه فیلتر

filter design 06

نمودار صفر و قطب فیلتر


حال برای استفاده از این فیلتر به کد آن احتیاج داریم . اگر کد متلب این فیلتر را لازم داشته باشیم به صورت زیر عمل می نماییم :

در منوی file گزینه Generate MATLAB Code را انتخاب می کنیم . 

filter design 07

با انتخاب گزینه فوق پنجره جدیدی باز می شود که مسیر ذخیره این کد را تعیین می کنیم و سپس کد به صورت زیر تولید می شود :


function Hd = lpf

%LPF Returns a discrete-time filter object.


%

% MATLAB Code

% Generated by MATLAB(R) 7.12 and the DSP System Toolbox 8.0.

%

% Generated on: 28-Feb-2014 16:13:22

%


% Equiripple Lowpass filter designed using the FIRPM function.


% All frequency values are in Hz.

Fs = 9600;  % Sampling Frequency


Fpass = 1650;             % Passband Frequency

Fstop = 1750;             % Stopband Frequency

Dpass = 0.0057563991496;  % Passband Ripple

Dstop = 0.0001;           % Stopband Attenuation

dens  = 20;               % Density Factor


% Calculate the order from the parameters using FIRPMORD.

[N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]);


% Calculate the coefficients using the FIRPM function.

b  = firpm(N, Fo, Ao, W, {dens});

Hd = dfilt.dffir(b);


% [EOF]


مانند توابع دیگری که می توان در برنامه متلب نوشت ، از این تابع هم می توان در هر برنامه دیگری که لازم باشد استفاده کرد ، فقط باید دقت کرد که این تابع در مسیر همان کدی باشد که میخواهیم از این فیلتر در آن کد استفاده کینم . 

 

و اگر به این فیلتر در برنامه های دیگر احتیاج داشته باشیم ، از منوی Targets استفاده می کنیم که سه نوع خروجی در اختیارمان قرار می دهد . 


نحوه استفاده از این تابع در کدنویسی :

ابتدا کد تولید شده که در بالا ذکر کردیم را با نام lpf ذخیره می کنیم . حال برای استفاده از این فیلتر به صورت زیر عمل می کنیم :

Hd = lpf;

filtered_signal = filter(Hd,signal);


نظرات  (۱۵)

سلام
از مطالبتون ممنونم
من میخوام روی سیگنال صوتی 7ثانیه ای انواع فیلتر رو با fdatool اعمال کنم و تغییراتش رو ببینم چه جوری صوت رو تو فیلتر فراخوانی کنم کد نویسیش چطور میشه؟
بازم ممنونم
پاسخ:
باید یک اسکریپت بنویسید. صوت را با دستور audioread فراخوانی کنید. فیلتر را هم جدا طراحی کنید و به صوت اعمال کنید.
با عرض سلام و ممنون از اطلاعات عالیتون.یه سوال دارم از خدمتتون،من فیلتری که میخوام طراحی کنم فرکانس را دارم و بازه ی مورد بررسی را ولی فرکانس سمپلینگ را ندارم.باید چیکار کنم؟
سلام استاد، من یک سیگنال قلبی نویزی دارم. فرکانسهای بالا و پایین سیگنال که نویز هستند را فیلتر کردم ولی ripple های سیگنال را نمیتوانم حذف کنم. میخواهم کاری کنم تا سیگنال یکنواخت باشد.
لطفا" مرا راهنمایی فرمایید. با تشکر فراوان
۱۱ تیر ۹۶ ، ۱۷:۴۳ محمد مهدی
بسیار عالی بود
سلام. من میخوام داده های قیمت دلار رو طی چند سال با فیلتر موجک (بالا گذر و پایین گذر) تجزیه کنم چطور این کار رو کنم
با سلام
چجوری با fdatool فیلتر میانگین گیر بسازم؟
با تشکر.
پاسخ:
سلام
ابتدا باید نوع فیلتر و مشخصاتش رو تعیین کنید!
با سلام من یه یک سیگنال مغزی دارم که فرکانس نمونه برداری آن 2048 هست و میخواهم از یک فیلتر باتروث میان گذر رد کنم که فرکانس قطع پایین آن 1و فرکانس قطع بالای آن 12 باشد .ممنون میشم راهنمایی کرده باشین

پاسخ:
سلام
مشخصات را وارد کنید، تمامی مراحل را توضیح دادم. دقیقتر بگید مشکلتون کجاست که اگر میدونستم به شما بگم چه کاری باید انجام بدید. 
سلام. شما درباره سطح آستانه تعریف کردن در متلب اطلاعاتی دارید؟
مثلا برای یک نمودار تعریف کنیم از یه حد آستانه ای به بعد، اطلاعات تغییر کنه و بشه یه داده ی مشخص.
پاسخ:
سلام
اگر نمودار رو با خود متلب رسم کرده باشید و اطلاعات آن موجود باشد، بله میتونم کمکتون کنم.
خب میشه کمک کنید و بگید مشخصات فیلتر رو چی بذارم برای طراحی کردن؟
طبق داده هایی که بهتون گفتم.

ممنون
پاسخ:
بنده وارد fdatool شدم و همین مشخصاتی که گفتید رو وارد کردم، فیلتر رو طراحی کرد. تنها چیزی که شما دقیق نگفتید فرکانس قطع هست که باید یه عدد بیشتر از 50 هرتز بدید. اطلاعات دیگه ای لازم نبود. 
اگر تو برنام متلب مشکلی بود بفرمایید توضیح بدم.
سلام.
من به یک فیلتر پایین گذر باترورث مرتبه دوم نیاز دارم، فرکانس نمونه برداریم 1920 هرتز است، برای اینکه این فیلتر رو طراحی کنم باید فرکانس قطعم بیشتر از 50هرتز باشه، و فیلترم باید فرکانس 50 رو عبور بده.

اگر میشه کمکم کنید، اطلاعات دیگه ای ندارم به جز این.

ممنون

پاسخ:
سلام
با استفاده از همین ابزار میتونید فیلتر رو طراحی کنید.
سلام .من نمی تونم با داده های بالا کد را فراخوانی کنم. میگه متغییر سیگنال تعریف نشده است.چطوری فراخوانی کنم.
پاسخ:
سلام
ابتدا باید با fdatool فیلتر مورد نظر را طراحی کنید و سپس به صورت تابع ذخیرش کنید. بعد با استفاده از اون دو خط کدی که گفتم، از تابع (فیلتر طراحی شده) استفاده کنید.
فقط باید قبل از استفاده از دستور filter، متغیر signal  رو تعریف کرده باشید. این متغیر ورودی فیلتر هست.
سلام
مطلب خیلی خوبی بود...ممنون
من برای پروژه کارشناسیمم وقتی شاهد بودم ازتون کمک گرفتم، الان دوباره ازتون تشکر میکنم
مررررررررررررررررررسی
پاسخ:
سلام
خواهش میکنم
بسیار ممنونم.
پاسخ:
خواهش می کنم
خیلی ممنون.مطلب بسیار مفیدی بود
پاسخ:
خواهش میکنم
عالی  بود استفاده کردم ممنون
پاسخ:
خواهش میکنم

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی