وب سایت شخصی دکتر رضا صمدی منو

کانولوشن دو سیگنال در متلب

با سلام خدمت دانشجویان محترم درس اختفا اطلاعات

در این پست قصد دارم تا روش به دست آوردن کانولوشن دو سیگنال در نرم افزار متلب را توضیح دهم. فرض کنید بخواهیم کانولوشن دو سیگنال x1 و x2 در شکل زیر را محاسبه کنیم.

مقدار این دو تابع در خارج بازه نشان داده شده صفر است. سیگنال t1, x1 شامل چند پله واحد شیفت یافته و سیگنال t2, x2 همان تابع سینوس است. شبه کد تولید این دو تابع به صورت زیر است.

t1 = linspace(-3, 3, 50);
x1 = ones(size(t1));
x1(t1 < -1) = -1;
x1(t1 > 1) = -2;
%
t2 = linspace(-2.5, 2, 20);
x2 = sin(t2);
%
figure
plot(t1, x1, ‘p-‘, t2, x2, ‘p-‘)
legend(‘x1’, ‘x2’, ‘Location’, ‘best’)

برای انجام کانولوشن در نرم افزار متلب، باید زمان های نمونه برداری شده هر دو سیگنال بر روی هم قرار گیرند. ولی همان طور که در شکل قبل دیده می شود، زمان های نمونه برداری دو سیگنال (یعنی نمونه های t1 و t2) فواصل یکسانی ندارند و بر روی هم قرار نمی گیرند. دلیل این اتفاق می تواند نمونه برداری نامنظم هر سیگنال و یا زمان نمونه برداری مختلف سیگنال ها باشد. برای هم زمان سازی سیگنال ها، ابتدا از تابع زیر استفاده می کنیم.

function [T1, X1, T2, X2, T, d] = prepareX(t1, x1, t2, x2)
d1 = t1(2) – t1(1);
d2 = t2(2) – t2(1);
d = min(d1, d2);
%
t1s = Quan(t1(1), d);
t1s = t1s + d * onestep(t1(1) – t1s);
t1e = Quan(t1(end), d);
t1e = t1e – d * onestep(t1e – t1(end));
%
t2s = Quan(t2(1), d);
t2s = t2s + d * onestep(t2(1) – t2s);
t2e = Quan(t2(end), d);
t2e = t2e – d * onestep(t2e – t2(end));
%
T1 = t1s : d : t1e;
X1 = interp1(t1, x1, T1);
%
T2 = t2s : d : t2e;
X2 = interp1(t2, x2, T2);
%
Ts = t1s + t2s;
Te = t1e + t2e;
T = Ts : d : Te;
end

خروجی این تابع دو سیگنال جدید T1, X1 و T2, X2 را می دهد که شکل آن ها در زیر رسم شده است.

figure
plot(T1, X1, ‘p-‘, T2, X2, ‘p-‘)
title(‘signals after synchronization’)
legend(‘x1’, ‘x2’, ‘Location’, ‘best’)

حال محاسبه کانولوشن X = X1 * X2 به دو روش زیر قابل محاسبه است.

روش اول به صورت استفاده از تابع conv به صورت زیر است.

X = d * conv(X1, X2);

روش دوم استفاده از خواص تبدیل فوریه گسسته و تابع fft به صورت زیر است.

X1 = [X1 zeros(1, size(T, 2) – size(X1, 2))];
X2 = [X2 zeros(1, size(T, 2) – size(X2, 2))];
X1_f = fft(X1);
X2_f = fft(X2);
X_f = X1_f .* X2_f;
X = d * real(ifft(X_f));

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

شبه کد متلب این نوشته از اینجا قابل مشاهده و از اینجا قابل دانلود است.

  • رضا

    بسیار عالی بود

  • maryam

    اگه کانولوشن دو تا سیگنال گسسته رو بخوایم بدون استفاده از دستور conv چی کار باید بکنیم میشه ی راهنمایی بکنید؟

    • دکتر رضا صمدی

      دکتر رضا صمدی

      با سلام،
      منظور شما همان استفاده از خواص تبدیل فوریه گسسته و تابع fft است که در همین صفحه توضیح داده ام.

  • hossein

    سلام ببخشید سوالی داشتم:کانولوشن دو تابع پیوسته به چه صورتیست؟

    • دکتر رضا صمدی

      دکتر رضا صمدی

      با سلام،
      کانولوشن دو تابع پیوسته یک رابطه به صورت روبرو دارد.
      fog(x) = int(f(a)g(x-a),a,-inf,inf)
      در اینجا a متغیر انتگرال گیری است که از منفی بینهایت تا بینهایت باید انتگرال گیری کنیم.

  • parisa

    با عرض سلام و خسته نباشید.
    میشه در مورد کدنویسی کانولوشن بدون دستور conv توضیح بیشتری بدین.
    باتشکر

    • دکتر رضا صمدی

      دکتر رضا صمدی

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

  • ali

    بارعرض سلام و خسته نباشید
    میشه یک مثال برای کانولوشن سیگنالهای گسسته با استفاده از تابع fft بزنید
    ممنون

    • دکتر رضا صمدی

      دکتر رضا صمدی

      با سلام،
      مثال این صفحه در مورد کانولوشن دو سیگنال گسسته در متلب است.

  • حسین

    با سلام .توضیحات شما بسیار کامل و مورد استفاده قرار گرفت . با تشکر .
    آیا اجازه می دهید در گزارش خود از این کدها استفاده کنم ؟(گزارش جنبه آموزشی دارد)

    • دکتر رضا صمدی

      دکتر رضا صمدی

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

  • صدیقه

    سلام .خیلی ممنونم بابت مطلب مفیدی که قرار دادید.

  • از ارسال پیام شما متشکریم . میتوانید از کد های اچ تی ام اس strong , code و a href استفاده کنید.

    Comment moderation is enabled, no need to resubmit any comments posted.