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)');

使用效果

在這裏插入圖片描述使用起來還是很方便的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章