我想计算以下方程的卷积。$$x[n] = \sin{\frac{n*\pi}{6}}(u[n] - u[n-12])$$我得到了以下代码行:
>> stem(5, y);
>> plot(n, y);
>> syms n
>> u = int(exp(-x)*heaviside(x), x, -Inf, Inf);
>> a = sin((n*pi)/6);
>> x = a*(u -u[n-12]);
但是,最后一行给出了错误。此外,我无法弄清楚如何使用这个方程来计算卷积以在 MATLAB 中绘制 $y[n]$。我知道使用命令,conv
但我不知道如何使用。我定义 \$h[n] = \delta[n-3]\$ 并使用 \$y[n] = x[n]*h[n]\$ 作为我的方程。
答案1
假设我们有向量:
u = [1 2 1];
v = [1 1 0 0 0 2 ];
因此对于 \$ x[n] = u[n]\ast v[n] \$ 如果向量运算被分解
x[0] = 1*1
x[1] = 1*2 + 1*1
x[2] = 1*1 + 1*2 + 0*1
x[3] = 1*1 + 0*2 + 0*1
x[4] = 0*1 + 0*2 + 0*1
x[5] = 0*1 + 0*2 + 2*1
x[6] = 0*1 + 2*2
x[7] = 2*1
或用零填充:
x[0] = 0*1 + 0*2 + 1*1
x[1] = 0*1 + 1*2 + 1*1
x[2] = 1*1 + 1*2 + 0*1
x[3] = 1*1 + 0*2 + 0*1
x[4] = 0*1 + 0*2 + 0*1
x[5] = 0*1 + 0*2 + 2*1
x[6] = 0*1 + 2*2 + 0*1
x[7] = 2*1 + 0*2 + 0*1
请注意:1)x 向量大于 u 和 v,并且对于起始操作 2)在起始和终止情况下,
如果
u = [1 2 1];
v = [0 0 1 1 0 0 0 2 0 0 ];
x = conv(u,v)
x = [0 0 1 3 3 1 0 2 4 2 0 0]; % result for x
或者
v =[0 0 0 1 1 0 0 0 2 0 0 0];
x = conv(u,v)
x = [0 0 0 1 3 3 1 0 2 4 2 0 0 0]; % result for x
如果存在零,则向量大小会有所不同,但卷积的值不会有所不同。这称为零填充,使用卷积时需要处理边缘情况。
(另外请记住,matlab 元素零从一开始,我使用数学符号,向量的第一个元素从零开始)
那么我为什么要告诉你这个呢?
因为当您在计算机上进行卷积时,边缘情况可能会令人困惑。当您执行此操作时 x = a*(u -u[n-12]); 并且您要求 u[n-12],而 matlab 则要求 u[-11] 作为数组的第一个值,而在内存中不存在该数组。因此,您需要零填充和/或截断,并意识到卷积的边缘情况有所不同。
我举个 x[n] = u[n] + u[n-3] 的例子:
u = [ 1 2 3 4 5 6 ];
x = u + [u(3:6) 0 0 ];