尝试自己写一个离散信号卷积程序
离散信号卷积公式
离散信号卷积公式: \[
y[n] = \sum_{k = -\infty}^{+\infty} x[k]h[n-k]
\]
直接将公式翻译成matlab代码。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| A = 5; w0 = 50e3*2*pi; phi = pi/2; t = 0 : 1/50e3/50 : 1/50e3*10;
y = A*sin(w0*t + phi);
subplot(5,1,1); plot(t,y);
z = 2*A*cos(2*w0*t + phi) .* exp(-20000*t);
subplot(5,1,2); plot(t, z);
L = length(t); answer = zeros(1,L*2); for i = 2:2*L for k = 1:L if (i-k >= 1 && i-k <= 501) answer(i) = answer(i) + y(k) * z(i-k); end end end
subplot(5,1,3); plot(answer(2:L*2));
|
conv函数
matlab中卷积函数名为conv
,用法很简单answer2 = conv(y,z)
,因为向量y
,z
的长度都是501,所以answer2
长度501+501-1=1001
1 2 3
| answer2 = conv(y,z); subplot(5,1,4); plot(answer2);
|
检验
最后新建一个数组存放两个卷积结果的差值,用于判断自己写的卷积程序正确性
1 2 3 4 5 6 7
| delta_ans = zeros(1, L*2); for i = 1:L*2-1 delta_ans(i) = answer2(i) - answer(i+1); end
subplot(5,1,5); plot(delta_ans);
|
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| A = 5; w0 = 50e3*2*pi; phi = pi/2; t = 0 : 1/50e3/50 : 1/50e3*10;
y = A*sin(w0*t + phi);
subplot(5,1,1); plot(t,y);
z = 2*A*cos(2*w0*t + phi) .* exp(-20000*t);
subplot(5,1,2); plot(t, z);
L = length(t); answer = zeros(1,L*2); for i = 2:2*L for k = 1:L if (i-k >= 1 && i-k <= 501) answer(i) = answer(i) + y(k) * z(i-k); end end end
subplot(5,1,3); plot(answer(2:L*2));
answer2 = conv(y,z); subplot(5,1,4); plot(answer2);
delta_ans = zeros(1, L*2); for i = 1:L*2-1 delta_ans(i) = answer2(i) - answer(i+1); end
subplot(5,1,5); plot(delta_ans);
|