matlab_learning_1

尝试自己写一个离散信号卷积程序

离散信号卷积公式

离散信号卷积公式: \[ 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); % 待卷积信号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),因为向量yz的长度都是501,所以answer2长度501+501-1=1001

1
2
3
answer2 = conv(y,z);           % 使用matlab内部卷积函数
subplot(5,1,4); % 生成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); % 生成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); % 待卷积信号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); % 可以看到结果相差不大


matlab_learning_1
http://456-xiao.github.io/2024/07/08/matlab-learning-1/
作者
xyh
发布于
2024年7月8日
许可协议