Clear Filters
Clear Filters

Regarding calculating convolution in Matlab.

23 views (last 30 days)
Just wondering that why my calculation of conv(h,x) is not correct? The red curve in the picture is what I expected for the convolution.
RC=1;
u=1;
t=linspace(-2,10,5000);
x=zeros(1,5000);
for k=1:length(t)
if(t(k)<0)
x(k)=0;
elseif(t(k)>=0 && t(k)<2)
x(k)=0.5;
else
x(k)=0;
end
end
subplot(1,2,1);
plot(t,x,'LineWidth',2);
title('x(t)');
h=zeros(1,5000);
for k=1:length(t)
if(t(k)<0)
h(k)=0;
else
h(k)=RC*exp(-t(k))*u;
end
end
subplot(1,2,2);
plot(t,h,'LineWidth',2);
title('h(x)');
con=conv(h,x);
t=linspace(-2,10,length(con));
hold on;
plot(t,con,'LineWidth',2);
  2 Comments
Star Strider
Star Strider on 30 Jan 2018
In the future, please format your code.
Highlight it, then use the [{}Code] button to format all of it correctly. It is much easier to read.
(I just did it, so it is not necessary for you to do it again.)
HUIDONG XIE
HUIDONG XIE on 30 Jan 2018
I thought I could just copy paste my code. Thank you, I will format my code next time I ask a question.

Sign in to comment.

Accepted Answer

David Goodmanson
David Goodmanson on 2 Feb 2018
Hi Huidong,
When you do c = conv(a,b) the array length of c is the sum of the array lengths of a and b, minus one. The resulting step size is the same. For the output of conv, you have a longer time array with the same spacing. When you did the second linspace command you cut the array spacing in half, which is not allowed.
Also, you are trying to reproduce a convolution integral in the time domain. Conv does a sum, so you need to multiply by the array step width delt. Replacing the last four lines of code with
delt = t(2)-t(1);
con = conv(h,x)*delt;
t = (1:length(con))*delt - 4; % new time array
hold on;
plot(t,con,'LineWidth',2);
xlim([-2 10])
hold off
should reproduce the example.
After the convolution you want something to start happening at t = 0. If you look at the delays in starting out from the beginning in the x and h waveforms, you should be able to see what the -4 is about in the new time array.
p.s. I replaced subplot(1,2,n) with subplot(2,1,n) so the aspect ratio would be the same as in the example.
  1 Comment
Faezeh Manesh
Faezeh Manesh on 6 Mar 2020
Hello David,
Thanks for your comments. Actually, I have the same problem with convolving my two functions (f and y) in the following MATLAB code:
close all;
clear all;
clc;
%set time vector
t0=0;
tf=100;
N=10000;
dt=(tf-t0)/N;
t=t0:dt:tf;
T0=60;
alpha=1;
% beta=0:0.01:1;
beta=0.01;
%construct the firxt part of the convolution
% for j=1:size(beta,2)
for i=1:length(t)
if(t(i)<=T0)
y(i)=0;
else
y(i)=alpha+beta*(t(i)-T0);
end
end
%plot y(t)
subplot(1,2,1);
plot(t,y,'LineWidth',2);
title('y(t)');
%Second function of the convolution
f2= 0.08787*exp(-((t-63.08)/1.593).^2);
%Convolution of these 2 functions
z=conv(y,f2,'full');
con = z*dt;
subplot(1,2,2);
plot(t,f2,'LineWidth',2);
title('f2');
t = (1:length(con))*dt ;
hold on;
plot(t,con,'LineWidth',2);
% end
I tried to use your guidelines to fix my problem but still I don't know the logic behind your previous comment that you mentioned t = (1:length(con))*delt - 4;
I don't know how you find this -4. And as you can see in my results I have the same delay.
Here are my results:
As you see, the convolution result (which is the red curve) starts from a later time while my both functions (y and f2) jump earlier (around 60). Could you please help me how to fix this problem? I would really appreciate it

Sign in to comment.

More Answers (0)

Categories

Find more on MATLAB in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!