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

离散信号卷积公式

离散信号卷积公式:

$$ 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),因为向量yz的长度都是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);               % 可以看到结果相差不大

oniiii
1 声望0 粉丝

引用和评论

0 条评论