尝试自己写一个离散信号卷积程序
离散信号卷积公式
离散信号卷积公式:
$$ y[n] = \sum_{k = -\infty}^{+\infty} x[k]h[n-k] $$
直接将公式翻译成matlab代码。代码如下:
A = 5; % 幅度
w0 = 50e3*2*pi; % 角频率
phi = pi/2; % 相位
t = 0 : 1/50e3/50 : 1/50e3*10; % 时间向量
y = A*sin(w0*t + phi); % 待卷积信号y
subplot(5,1,1); % 生成5行1列的曲线图,当前曲线图位置在第1行
plot(t,y);
% axis equal;
% 待卷积信号z
z = 2*A*cos(2*w0*t + phi) .* exp(-20000*t);
subplot(5,1,2); % 生成5行1列的曲线图,当前曲线图位置在第2行
plot(t, z);
% axis equal;
L = length(t); % t向量的长度L = 501,下标从1开始,到501结束
answer = zeros(1,L*2); % answer向量用于存放卷积结果,卷积结果长度为 L + L - 1
for i = 2:2*L % 从下标2开始存放卷积结果,因为信号向量下标从1开始,
for k = 1:L % 只有当i=2,k=1时下标有效
if (i-k >= 1 && i-k <= 501)
answer(i) = answer(i) + y(k) * z(i-k);
end
end
end
subplot(5,1,3); % 生成5行1列的曲线图,当前曲线图位置在第3行
plot(answer(2:L*2));
conv函数
matlab中卷积函数名为conv
,用法很简单answer2 = conv(y,z)
,因为向量y
,z
的长度都是501,所以answer2
长度501+501-1=1001
answer2 = conv(y,z); % 使用matlab内部卷积函数
subplot(5,1,4); % 生成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); % 生成5行1列的曲线图,当前曲线图位置在第5行
plot(delta_ans); % 可以看到结果相差不大
完整代码
A = 5; % 幅度
w0 = 50e3*2*pi; % 角频率
phi = pi/2; % 相位
t = 0 : 1/50e3/50 : 1/50e3*10; % 时间向量
y = A*sin(w0*t + phi); % 待卷积信号y
subplot(5,1,1); % 生成5行1列的曲线图,当前曲线图位置在第1行
plot(t,y);
% axis equal;
% 待卷积信号z
z = 2*A*cos(2*w0*t + phi) .* exp(-20000*t);
subplot(5,1,2); % 生成5行1列的曲线图,当前曲线图位置在第2行
plot(t, z);
% axis equal;
L = length(t); % t向量的长度L = 501,下标从1开始,到501结束
answer = zeros(1,L*2); % answer向量用于存放卷积结果,卷积结果长度为 L + L - 1
for i = 2:2*L % 从下标2开始存放卷积结果,因为信号向量下标从1开始,
for k = 1:L % 只有当i=2,k=1时下标有效
if (i-k >= 1 && i-k <= 501)
answer(i) = answer(i) + y(k) * z(i-k);
end
end
end
subplot(5,1,3); % 生成5行1列的曲线图,当前曲线图位置在第3行
plot(answer(2:L*2));
answer2 = conv(y,z); % 使用matlab内部卷积函数
subplot(5,1,4); % 生成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); % 生成5行1列的曲线图,当前曲线图位置在第5行
plot(delta_ans); % 可以看到结果相差不大
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。