DSP——MATLAB離散時間信號基本運算(及常用信號函數的調用)

今天剛好上了節DSP的課程,然後課堂是MATLAB關於離散時間信號的基本運算。想必直接通過我們自己的理解可能會覺得很簡單,但是當要通過電腦即MATLAB去處理時,發現還是有一丟丟的難理解,接下來我將會舉幾個例子幫助理解。

一、首先還是先給幾個常用函數,也是課堂總結的,到時建立M文件直接調用就好:
1、單位脈衝函數

function [x,n] = stepseq(n0,n1,n2)
% 產生 x(n) = u(n-n0); n1 <= n <= n2
% n1 n2是定義域的上下限,n0是延時因子,注意是延時
% [x,n] = stepseq(n0,n1,n2)
%
close all
n = [n1:n2]; x = [(n-n0) >= 0];
% figure;
% stem(n,x);

2、階躍函數


function [x,n] = stepseq(n0,n1,n2)
% 產生 x(n) = u(n-n0); n1 <= n <= n2
%  n1 n2是定義域的上下限,n0是延時因子,注意是延時
% [x,n] = stepseq(n0,n1,n2)
%
close all
n = [n1:n2]; x = [(n-n0) >= 0];
% figure;
% stem(n,x);

3、時移處理函數

function [y,n] = sigshift(x,m,k)
% 對輸出產生時移 y(n) = x(n-k)
%注意此時定義域也會跟着移動
% [y,n] = sigshift(x,m,k)
%
n = m+k; y = x;

%  n = -2 :10;
% x = [1 2 3 4 5 6 7 6 5 4 3 2 1];

4、時間反轉函數

function [y,n] = sigfold(x,n)
% 時間反轉處理 y(n) = x(-n)
% -----------------------
% [y,n] = sigfold(x,n)
%
y = fliplr(x); n = -fliplr(n);

%  n = -2 :10;
% x = [1 2 3 4 5 6 7 6 5 4 3 2 1];

基本這四個處理函數就夠幫助基本的MATLAB運算理解了。

二、進入正題,爲什麼MATLAB處理這些基本運算就有所特別呢?首先我們應知道的是MATLAB是按照矩陣的形式存儲數據,我們平常用的一般爲一個行矩陣,所以對該行矩陣的元素位置(也就是相當於我們xy軸的x座標)是有第一個、第二個、第三個、、、等等來標識,其一個因變量序列x[n]與另一個因變量序列y[n]相加時是隻考慮本身元素按次序相加的,其相加過程與n無關(實際上是必須要相關的),所以我們要解決的問題就是使兩者序列相加時對應於同一個n對應的x[n]與y[n]相加,下面舉例子說明下。
如果兩個序列x=[1 2 3] 與y=[1 2 3]相加時,此時n與y或者x的對應關係未知:
1、若n與y或者x的對應關係如下:x【1】=1,x【2】=2,x【3】=3,y【1】=1,y【2】=2,y【3】=3
當做MATLAB運算時,即x+y=【2 4 6】,此時運算正確,相關代碼如下:
n=1:3;
x=[1 2 3];%假如x[1]=1,x[2]=2,x[3]=3
y=[1 2 3];%假如y[1]=1,y[2]=2,y[3]=3
z=x+y;
subplot(311);
stem(n,x)
title(“x[n]”);
grid on;
subplot(312);
stem(n,y)
title(“y[n]”);
grid on;
subplot(313);
stem(n,z)
title(“z[n]”);
grid on;
在這裏插入圖片描述
2、若n與y或者x的對應關係如下:x【1】=1,x【2】=2,x【3】=3,y【2】=1,y【3】=2,y【4】=3此時由於它們的自變量n不同,用MATLAB直接利用上一代碼是完全不行的,除非對x,y增加對應位置的零才能運算,代碼如下
n=1:4;
x=[1 2 3 0];%假如x[1]=1,x[2]=2,x[3]=3
y=[0 1 2 3];%假如y[2]=1,y[3]=2,y[4]=3
z=x+y;
subplot(311);
stem(n,x)
title(“x[n]”);
grid on;
subplot(312);
stem(n,y)
title(“y[n]”);
grid on;
subplot(313);
stem(n,z)
title(“z[n]”);
grid on;
在這裏插入圖片描述
那麼從個例子發現要是如果
n與y或者x的對應關係如下:x【1】=1,x【2】=2,x【3】=3,y【100】=1,y【101】=2,y【102】=3時是不是也要添加那麼多相應的零。
答案是對的,那麼就得出個結論:

其實在MATLAB中的序列的運算中針對x[n] y[n]來說,他們的運算只和本身元素有關,所以我們要讓x[n]與n, y[n]與n建立一一對應的聯繫,方法就讓它們的n爲同一個n,使得具有同樣的對應關係
總結起來具體實例如下:
在這裏插入圖片描述

[x1,n1] = impseq(1,-10,10);%先生成單位脈衝函數
[x2,n2] = impseq(-1,-10,10);%
n=min([n1,n2]):max([n1,n2]);%將定義範圍化成同一個區間
N=length(n);
y1=zeros(1,N);
y2=zeros(1,N);%生成一個行矩陣用於存儲對應同一範圍的函數值
y1(find(n>=min(n1)&n<=max(n1)))=x1;
y2(find(n>=min(n2)&n<=max(n2)))=x2;%未與x(n)重合的取0
y=y1+y2;%再進行相關運算
stem(n,y)
grid on

在這裏插入圖片描述
在這裏插入圖片描述

[x1,n1] = impseq(1,-10,10);%先生成單位脈衝函數
[x2,n2] = impseq(-1,-10,10);%
[x3,n3] = impseq(0,-10,10);
n=min([n1,n2,n3]):max([n1,n2,n3]);%將定義範圍化成同一個區間
N=length(n);
y1=zeros(1,N);
y2=zeros(1,N);
y3=zeros(1,N);%生成一個行矩陣用於存儲對應同一範圍的函數值
y1(find(n>=min(n1)&n<=max(n1)))=x1;
y2(find(n>=min(n2)&n<=max(n2)))=x2;
y3(find(n>=min(n3)&n<=max(n3)))=x3;%未與x(n)重合的取0
y=y1+y3.*y2;%再進行相關運算
stem(n,y)
grid on

在這裏插入圖片描述
在這裏插入圖片描述

[x1,n1] = impseq(1,-10,10);%先生成單位脈衝函數
[x2,n2] = impseq(0,-10,10);%
[x2,n2] = sigfold(x2,n2);%反轉,x2表示輸入信號,n2表示輸入信號對應定義範圍
[x2,n2] = sigshift(x2,n2,1);%時移 1表延時因子如x[n-1]
n=min([n1,n2]):max([n1,n2]);%將定義範圍化成同一個區間
N=length(n);
y1=zeros(1,N);
y2=zeros(1,N);%生成一個行矩陣用於存儲對應同一範圍的函數值
y1(find(n>=min(n1)&n<=max(n1)))=x1;
y2(find(n>=min(n2)&n<=max(n2)))=x2;%未與x(n)重合的取0
y=y1+y2;%再進行相關運算
stem(n,y)
grid on

在這裏插入圖片描述
寫的有點亂。。。哎

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