MATLAB 自编函数实现序列根据坐标合并

目标

在MATLAB中,我们很容易定义两个有限长序列,但是当它们的时间轴不同或者说错位时,就会对序列的基本运算带来麻烦。

举个例子

令x[n]={1,2,3,4,5,6,7,6,5,4,3,2,1},x[n]从n=0时刻开始有值,试画出序列y[n]=x[3-n]+x[n]*x[n-2];

这里的难点在于x[n]已有其坐标范围为0:1:length(xn)-1,x[n-2]的序列值也不需要改变,其有非零值的坐标范围为2:1:length(xn)+1,我们可以看到x[n]和x[n-2]的坐标之间有两个单位的错位,则x[n]*x[n-2]的计算需要对两个序列分别进行扩充——x[n]向右扩充两个0值,而x[n-1]向左扩充两个零值。

这在操作起来比较麻烦,于是我写了一个函数帮我专门处理序列坐标的合并。

函数实现

function [t_list, x_list_1, x_list_2] = Combine(t_1, x_1, t_2, x_2, stride)
%COMBINE Editde By yhy_17302803
%   输入两个离散时间序列的信息
%   输出合并(延长后的)时间序列和数值序列,便于后续对两个信号的处理;
%   stride: 步长
    min_t = min(min(t_1), min(t_2));    % 获取公共时间范围
    max_t = max(max(t_1), max(t_2));
    posi = - min_t + 1;
    t_list_temp = (min_t:stride:max_t) + posi;
    x_list_1 = zeros(1, length(t_list_temp));
    x_list_2 = zeros(1, length(t_list_temp));
    x_list_1(t_1 + posi) = x_1;
    x_list_2(t_2 + posi) = x_2;
    t_list = t_list_temp - posi;    
end

在函数中,我并没有让其直接进行题中的乘法运算,而是分别返回扩展后的两个幅值序列和一个时间轴序列,这是为了处理今后更加多变的场景,方便进行各种运算而不仅限于本题中的乘法。

函数使用

clear all; close all;
%% 1.(1) 令x[n]={1,2,3,4,5,6,7,6,5,4,3,2,1},画出序列y[n]=x[3-n]+x[n]*x[n-2];
figure;
x_n = [1,2,3,4,5,6,7,6,5,4,3,2,1];  % 假设时间从t=0开始
t_n = 0:1:length(x_n)-1;
t_n_1 = t_n.*(-1);              % 关于y轴翻转,t_list for x[-n];
t_n_2 = t_n_1 + 3;              % 向右平移3个单位,t_list for x[3-n];
subplot(2,2,1); stem(t_n_2, x_n); grid on;
title('x(n-3)');xlabel('n');ylabel('x(n-3)');

[t_mul, x_mul_1, x_mul_2] = Combine(t_n, x_n, t_n + 2, x_n, 1);
x_mul = x_mul_1.*x_mul_2;
subplot(2,2,2); stem(t_mul, x_mul); grid on;
title('x(n)*x(n-2)');xlabel('n');ylabel('x(n)*x(n-2)');

[t_com, x_com_1, x_com_2] = Combine(t_n_2, x_n, t_mul, x_mul, 1);
x_com = x_com_1 + x_com_2;
subplot(2,2,3); stem(t_com, x_com); grid on;
title('y(n)最终结果','FontName','Sans Sarif');xlabel('n');ylabel('y(n)');

使用效果

在这里插入图片描述使用起来还是很方便的。

发布了14 篇原创文章 · 获赞 4 · 访问量 9321

猜你喜欢

转载自blog.csdn.net/Ocean_waver/article/details/103242667
今日推荐