关于conv()函数和length()/ size()函数的Matlab卷积

时间:2017-03-10 16:04:11

标签: matlab convolution

我很熟悉Matlab和堆栈溢出,所以如果我在指南之外做错了什么,请不要犹豫,指出它。谢谢!

我一直试图在两个函数之间进行卷积,而我一直很难尝试让它工作。

t=0:.01:10;        
h=exp(-t);        
x=zeros(size(t));   % When I used length(t), I would get an error that says in conv(), A and B must be vectors.    
x(1)=2;        
x(4)=5;         
y=conv(h,x);         
figure; subplot(3,1,1);plot(t,x);   % The discrete function would not show (at x=1 and x=4)     
subplot(3,1,2);plot(t,h);        
subplot(3,1,3);plot(t,y(1:length(t)));    %Nothing is plotted here when ran

我用代码评论了我的问题。我不明白lengthsize在这种情况下的区别以及它会如何产生影响。

对于第二条评论,x=1的幅度应为2。虽然x=4的幅度应为5。绘制时,它仅在指定的位置显示任何内容,但在x=0处看起来混乱。我假设这是错综复杂的情节不会被显示的原因。

如果有助于理解我一直在思考的内容,则会给出原始问题陈述。

  

考虑一个输入信号x(t),它由t = 1和t = 4的两个delta函数组成,振幅分别为A1 = 5和A2 = 2,脉冲响应为指数脉冲的线性系统(h(t)= e ^ -t)。使用0.01的增量绘制x(t),h(t)和t的线性系统y(t)的输出,范围为0到10。使用MATLAB内置函数conv。

1 个答案:

答案 0 :(得分:0)

关于sizelength

的初步问题

length产生一个等于输入最大维度的标量。对于您的数组,size1 x N,因此length会产生N

size(t)
%   1   1001

length(t)
%   1001

如果您将标量(N)传递给oneszeros或类似函数,则会创建一个方阵,即{{ 1}}。这会导致您在使用N x N时看到的错误,因为conv不接受矩阵输入。

conv

将向量传递给size(ones(length(t))) % 1001 1001 ones时,输出将大小,因为zeros会返回一个向量(如上所示),输出大小相同(和向量),因此size没有任何问题

conv

如果需要矢量,则需要明确指定行数和列数。此外,在我看来,将size(ones(size(t))) % 1 1001 用于向量中的元素数量会更好,因为它比numel

更不明确
length

关于卷积输出的第二个问题

首先,您创建的冲动位于z = zeros(1, numel(t)); 的第一个和第四个索引,而不是xt = 1的位置。由于您使用t = 4的间距创建t0.01实际上对应t(1)t = 0对应t(4)

您想要使用t = 0.03来指定放置冲动的位置

t

请注意,由于浮点错误,您可能没有完全 x(t == 1) = 2; x(t == 4) = 5; t == 1,因此您可以使用小型epsilon

t == 4

完成此更改后,我们将获得输入函数的预期缩放和移位版本。

enter image description here